Introducción.
R. Explorar y analizar el texto compartido mediate la red social Twitter para los Peregrinos en Santiago de Compostela.
R. Twitter es un servicio de mensajeria ampliamente difundida por más de 500 millones de usuarios, los cuales generan alrededor de 65 millones de “tweets” diarios. Los Tweets, son mensajes articulados en 140 caracteres, lo cuál, hace precisar el mensaje a comunicar. La recolección se realizo por medio de la API de Twitter, descargados como datos semiestructurados (Json). Periodo de tiempo (abril, 2016 - abril, 2019) La importancia de este formato es su capacidad de almacenar multiples atributos de diferente caracteristica.
file.choose() 3. Organización del texto. ———————————————-
library(readr)
tweet <- read_csv("Desktop/Datos/CSC_Tweets/select_Twitter0619.csv")
## Parsed with column specification:
## cols(
## id_viaje = col_character(),
## OBJECTID_1 = col_double(),
## created_at = col_character(),
## user_id_st = col_double(),
## grid_code = col_double(),
## textFix = col_character(),
## lang = col_character(),
## X_Corrd = col_double(),
## Y_Coord = col_double(),
## date_tweet = col_date(format = ""),
## min_date = col_date(format = ""),
## max_date = col_date(format = ""),
## date_dif = col_double(),
## count = col_double()
## )
tweet
## # A tibble: 36,384 x 14
## id_viaje OBJECTID_1 created_at user_id_st grid_code textFix lang X_Corrd
## <chr> <dbl> <chr> <dbl> <dbl> <chr> <chr> <dbl>
## 1 1000314… 4 2018/09/1… 1.00e18 3384 pilgri… en -7.4
## 2 1000314… 4 2018/09/1… 1.00e18 2565 great … en -8.16
## 3 1000314… 4 2018/09/1… 1.00e18 2558 we mad… en -8.55
## 4 1005339… 62 2016/07/2… 1.01e 8 6884 <NA> es -2.44
## 5 1005339… 62 2016/08/2… 1.01e 8 6746 <NA> es -2.44
## 6 1005339… 62 2016/08/2… 1.01e 8 6746 <NA> es -2.45
## 7 1005339… 62 2016/08/2… 1.01e 8 6746 <NA> es -2.45
## 8 1005339… 62 2016/08/2… 1.01e 8 6746 <NA> es -2.45
## 9 1005339… 62 2016/08/2… 1.01e 8 6746 <NA> es -2.44
## 10 1005339… 62 2016/08/1… 1.01e 8 6746 <NA> es -2.45
## # … with 36,374 more rows, and 6 more variables: Y_Coord <dbl>,
## # date_tweet <date>, min_date <date>, max_date <date>, date_dif <dbl>,
## # count <dbl>
sum(is.na(tweet)) # cantidad de columnas con datos vacios "NA"
## [1] 10519
Twitter <- na.omit(tweet) # eliminamos los registros sin información "NA"
library(tidyverse)
## ── Attaching packages ───────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2 ✓ dplyr 1.0.0
## ✓ tibble 3.0.3 ✓ stringr 1.4.0
## ✓ tidyr 1.1.0 ✓ forcats 0.5.0
## ✓ purrr 0.3.4
## ── Conflicts ──────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
colnames(Twitter) # conozcamos las variables.
## [1] "id_viaje" "OBJECTID_1" "created_at" "user_id_st" "grid_code"
## [6] "textFix" "lang" "X_Corrd" "Y_Coord" "date_tweet"
## [11] "min_date" "max_date" "date_dif" "count"
tweets <- Twitter %>% select(id_viaje, created_at, user_id_st, textFix) ## Selección de variables.
tweets <- tweets %>% rename(autor = id_viaje, fecha = created_at,
texto = textFix, tweet_id = user_id_st) ## Renombrar variables.
head(tweets)
## # A tibble: 6 x 4
## autor fecha tweet_id texto
## <chr> <chr> <dbl> <chr>
## 1 100031406522… 2018/09/10 20… 1.00e18 pilgrims' passports stamped. map studie…
## 2 100031406522… 2018/09/14 13… 1.00e18 great sight when finishing our 4th day …
## 3 100031406522… 2018/09/16 14… 1.00e18 we made it! camino de santiago: sarria …
## 4 101163887574… 2018/08/04 08… 1.01e18 neeeeeniiii neeeeeniiii neeeeeniiii nee…
## 5 101163887574… 2018/07/27 08… 1.01e18 neeenii neeenii neeenii #teamneni https…
## 6 101163887574… 2018/07/26 19… 1.01e18 neeniii neeniii neeniii neeniii neeniii…
para está practica, el principal objetivo es estudiar el perfil lingüístico de los usuarios y analizar el sentimiento que transmiten, procedemos a eliminar:
+ Patrones no informativos (urls de paginas web).
+ Signos de puntuación.
+ Etiquetas HTML.
+ Caracteres sueltos.
+ Números y datos vacios (NA).
Tokenizar un texto consiste en dividir el texto en las unidades que lo conforman, entendiendo por unidad el elemento más sencillo, en este ccaso, las palabras. ## Existen múltiples librerias que automatizan en gran medida la limpieza y tokenización de texto, por ejemplo, “tokenizers” o “quanteda”.
Limpiar_tokenizar <- function(texto){
nuevo_texto <- tolower(texto)
nuevo_texto <- str_replace_all(nuevo_texto, "http\\S*", "")
nuevo_texto <- str_replace_all(nuevo_texto, "NA", "")
nuevo_texto <- str_replace_all(nuevo_texto, "[[:punct:]]", " ")
nuevo_texto <- str_replace_all(nuevo_texto, "[[:digit:]]", " ")
nuevo_texto <- str_replace_all(nuevo_texto, "[\\s]+", " ")
nuevo_texto <- str_split(nuevo_texto, " ")[[1]]
nuevo_texto <- keep(.x = nuevo_texto, .p = function(x){str_length(x) > 1})
return(nuevo_texto)
}
Ejemplo de limpieza de texto.
test = "Esto es 1 NA ejemplo de 1 'limpieza de6 TEXTO http://t.co/rnHPgyhx4z @JoaquinAmatRodrigo #textmining"
Limpiar_tokenizar(texto = test)
## [1] "esto" "es" "na"
## [4] "ejemplo" "de" "limpieza"
## [7] "de" "texto" "joaquinamatrodrigo"
## [10] "textmining"
Es momento de hacer limpieza y tokenización a nuestra base de datos.
tweets <- tweets %>% mutate(texto_tokenizado = map(.x = texto,
.f = Limpiar_tokenizar))
tweets %>% select(texto_tokenizado) %>% head()
## # A tibble: 6 x 1
## texto_tokenizado
## <list>
## 1 <chr [22]>
## 2 <chr [15]>
## 3 <chr [20]>
## 4 <chr [10]>
## 5 <chr [4]>
## 6 <chr [6]>
tweets %>% slice(1) %>% select(texto_tokenizado) %>% pull() ### cada elemento de la columna "texto_tokenizado" es una lista con un vector de tipo "caracter" que contiene los token generados.
## [[1]]
## [1] "pilgrims" "passports" "stamped" "map" "studied" "boots"
## [7] "polished" "we" "re" "ready" "to" "go"
## [13] "it" "ll" "be" "an" "early" "start"
## [19] "to" "beat" "the" "he"
En “R” la estructura por excelencia para el análisis exploratorio son el DATAFRAME y TIBBLE, que es la forma como se encuentra almacenada la información en los “TWEETS”. Sin embargo, al realizar la tokenización, ha habido un cambio importante los elementos de estudio texto, se encontraban en en filas “observaciones”, al reaizar la tokenizacion, el elemento de estudio ha pasado a ser cada “TOKEN” <
tweets_tidy <- tweets %>% select(-texto) %>% unnest()
## Warning: `cols` is now required when using unnest().
## Please use `cols = c(texto_tokenizado)`
tweets_tidy <- tweets_tidy %>% rename(token = texto_tokenizado)
head(tweets_tidy)
## # A tibble: 6 x 4
## autor fecha tweet_id token
## <chr> <chr> <dbl> <chr>
## 1 1000314065229697024_1 2018/09/10 20:49:45.000 1.00e18 pilgrims
## 2 1000314065229697024_1 2018/09/10 20:49:45.000 1.00e18 passports
## 3 1000314065229697024_1 2018/09/10 20:49:45.000 1.00e18 stamped
## 4 1000314065229697024_1 2018/09/10 20:49:45.000 1.00e18 map
## 5 1000314065229697024_1 2018/09/10 20:49:45.000 1.00e18 studied
## 6 1000314065229697024_1 2018/09/10 20:49:45.000 1.00e18 boots
alt text
rnorm(20)->datos
head(datos)
## [1] -0.4842950 -1.7874155 0.9080146 0.2687006 -0.4446077 -1.8475488
mean(datos)
## [1] -0.3604432
hist(datos, col=234, main = "Histograma",
xlab = "latitud",
ylab = "longitud")
Fuente
Fuente Cursiva
Fuente Negrita
Fuente Negrita cursiva
Fuente
list: ## Listas
Item 1
Item 2
Ordered List: ## Ordenar listas.
para obtener acceso directo de la web link de la pagina ##Obtener acceso de la web.
Esta base de datos cuenta con unos 36,684 tweets que representan 1789 “usuarios”. Muchas gracias…