Las nubes de palabras son formas gráficas para representar cuáles son las palabras más frecuentes en un texto. Esto se realiza con base en la frecuencia de aparición de las mismas que hay en uno o una serie de documentos. Esta técnica permite aproximarse al tema de un texto.
Se necesita una base de datos con dos columnas. La primer base de datos es donde tengo el texto. La columna 1 es la identificación del texto, capítulo u oración. Cada fila corresponde a uno de estos. Por ejemplo, el Quijote de la Mancha (Miguel de Cervantes) tiene 54 capítulos contando las dos partes. Esta base de datos debería tener 54 filas.
Para este ejercicio, voy a utilizar la transcripción de oraciones de 4 libros pertenecientes a la Asociación de Guías y Scouts de Costa Rica. La base de datos de una de ellos se presenta a continuación:
## Parsed with column specification:
## cols(
## Cod = col_character(),
## texto = col_character()
## )
| Cod | texto |
|---|---|
| S1 | Soy capaz de respetar a todas las personas en cualquier lugar en que me encuentre |
| S2 | Cumplo con todas las responsabilidades que asumo en todos los aspectos de mi vida familia, amigos, colegio |
| S3 | Me sentiria molesto si hubiese una violacion a los derechos humanos |
| S4 | Podre ejercer la autoridad sirviendo a los demas y conociendo sus limites |
| S5 | Respeto todas las normas de convivencia en todos los lugares a los que voy |
| S6 | Me indigno con las injudticias sociales y espero que la sociedad las supere |
La segunda base de datos contiene palabras que no significan nada, como artículos, preposiciones y otras palabras (en español) que se desean eliminar.
| id | texto |
|---|---|
| 1 | a |
| 2 | ante |
| 3 | bajo |
| 4 | con |
| 5 | contra |
| 6 | de |
Para fabricar una nube de palabras, se utilizarán los siguientes paquetes:
## Warning: package 'tidytext' was built under R version 3.6.3
## Warning: package 'wordcloud' was built under R version 3.6.3
En primer lugar, se debe partir los textos en palabras. Para ello se utiliza la función unnest_tokens(). Esta contiene los argumentos siguientes:
| Argumento | Explicacion |
|---|---|
| output | Nombre de la columna de salida donde se va a guardar las palabras |
| input | Columna donde está el texto en la base de datos |
| token | ¿Qué es lo que quiero? En este caso palabras |
| format | Formato de la columna, en este caso texto |
Luego le quitamos las palabras sin sentido o las stop words con el anti_join. El anti_join elimina las palabras de la base textos, las presentes en la base stop_words. Las elimino porque no me generan nada de información.
word_freq <- textos %>%
unnest_tokens(output = word,
input = texto,
token = "words",
format = "text") %>%
anti_join(stop_words, by = c("word" = "texto")) %>%
count(word) # Cantidad de palabras
head(word_freq$word, 15)## [1] "accion" "actividad" "actividades" "acuerdo" "agradeces"
## [6] "aire" "al" "algo" "alguien" "algun"
## [11] "alguna" "amigos" "amor" "animacion" "animo"
Luego de esto, hago la nube de palabras con la función wordcloud(). Puedo ponerle diferentes argumentos para mejorarlo y hacerlo más atractivo:
| Argumento | Explicación |
|---|---|
| words | Donde están las palabras que vamos usar (el word_freq ya creado) |
| freq | Cantidad de veces que se contó la palabra |
| min.freq | Frecuencia mínima que una palabra puede tener para tomarla en cuenta |
| max.words | Cantidad máxima de palabras que puedo poner en el gráfico |
| colors | Colores |
| scale | Aumenta el tamaño de las palabras con mucha frecuencia (desde 3 hasta 0.1) |
| random.order | Al poner FALSE, se ordenan la palabras dependiendo de la frecuencia |
| random.color | Al poner FALSE, se ordena los colores por frecuencia |
| rot.per | Proporción de palabras que se acomodan verticalmente |
wordcloud(words = word_freq$word,
freq = word_freq$n,
min.freq = 2,
max.words = 20,
colors = c("Green","Yellow", "Red"),
random.order = F,
random.color = F,
scale = c(3 ,0.1),
rot.per = 0.3)## Parsed with column specification:
## cols(
## Cod = col_character(),
## texto = col_character()
## )
word_freq <- Bitacora1 %>%
unnest_tokens(output = word,
input = texto,
token = "words",
format = "text") %>%
anti_join(stop_words, by = c("word" = "texto")) %>%
count(word)
head(word_freq$word, 15)## [1] "accion" "aconsejan" "actitud" "actividades" "adecuados"
## [6] "ademas" "afecta" "agrada" "alegre" "alguien"
## [11] "alimentos" "amigos" "amor" "animo" "aplico"
| word | n |
|---|---|
| puedo | 8 |
| conozco | 7 |
| soy | 5 |
| tengo | 5 |
| cuando | 4 |
| demas | 4 |
| dios | 4 |
| buena | 3 |
| cuenta | 3 |
| cuerpo | 3 |
wordcloud(words = word_freq$word,
freq = word_freq$n,
min.freq = 2,
max.words = 20,
colors = c("Green","Yellow", "Red"),
random.order = F,
random.color = F,
scale = c(3 ,0.1),
rot.per = 0.3)## Parsed with column specification:
## cols(
## Cod = col_character(),
## texto = col_character()
## )
word_freq <- Bitacora2 %>%
unnest_tokens(output = word,
input = texto,
token = "words",
format = "text") %>%
anti_join(stop_words, by = c("word" = "texto")) %>%
count(word)
head(word_freq$word, 15)## [1] "30" "accion" "acepto" "acoso" "actividad" "actuar"
## [7] "acuerdo" "afectan" "afectara" "afecto" "al" "alegre"
## [13] "alguien" "alguna" "algunas"
| word | n |
|---|---|
| puedo | 10 |
| cuando | 6 |
| entiendo | 6 |
| forma | 6 |
| diferencias | 4 |
| doy | 4 |
| hay | 4 |
| yo | 4 |
| acepto | 3 |
| acuerdo | 3 |
wordcloud(words = word_freq$word,
freq = word_freq$n,
min.freq = 2,
max.words = 20,
colors = c("Green","Yellow", "Red"),
random.order = F,
random.color = F,
scale = c(3 ,0.1),
rot.per = 0.3)## Parsed with column specification:
## cols(
## Cod = col_character(),
## texto = col_character()
## )
word_freq <- Bitacora3 %>%
unnest_tokens(output = word,
input = texto,
token = "words",
format = "text") %>%
anti_join(stop_words, by = c("word" = "texto")) %>%
count(word)
head(word_freq$word, 15)## [1] "accion" "actividad" "actividades" "acuerdo" "agradeces"
## [6] "aire" "al" "algo" "alguien" "algun"
## [11] "alguna" "amigos" "amor" "animacion" "animo"
| word | n |
|---|---|
| demas | 5 |
| demuestro | 5 |
| patrulla | 5 |
| actividades | 4 |
| cosas | 4 |
| familia | 4 |
| fe | 4 |
| otros | 4 |
| acuerdo | 3 |
| alguna | 3 |
wordcloud(words = word_freq$word,
freq = word_freq$n,
min.freq = 2,
max.words = 20,
colors = c("Green","Yellow", "Red"),
random.order = F,
random.color = F,
scale = c(3 ,0.1),
rot.per = 0.3)## Parsed with column specification:
## cols(
## Cod = col_character(),
## texto = col_character()
## )
word_freq <- Bitacora4 %>%
unnest_tokens(output = word,
input = texto,
token = "words",
format = "text") %>%
anti_join(stop_words, by = c("word" = "texto")) %>%
count(word)
head(word_freq$word, 15)## [1] "abiertos" "actividad" "actividades" "actuar" "afectan"
## [6] "ahora" "aire" "al" "algo" "alguien"
## [11] "algunas" "ambiente" "amigos" "amor" "analizado"
| word | n |
|---|---|
| puedo | 9 |
| amigos | 7 |
| yo | 6 |
| actividades | 5 |
| companeros | 5 |
| familia | 5 |
| organizado | 5 |
| patrulla | 5 |
| analizado | 4 |
| comunidad | 4 |
wordcloud(words = word_freq$word,
freq = word_freq$n,
min.freq = 2,
max.words = 20,
colors = c("Green","Yellow", "Red"),
random.order = F,
random.color = F,
scale = c(3 ,0.1),
rot.per = 0.3)