¿Qué es una nube de palabras?

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.

Las bases de datos

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

La técnica

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.

##  [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

Replicando el procedimiento con 4 bases de datos diferentes

Bitácora1

## Parsed with column specification:
## cols(
##   Cod = col_character(),
##   texto = col_character()
## )
##  [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

Bitácora 2

## Parsed with column specification:
## cols(
##   Cod = col_character(),
##   texto = col_character()
## )
##  [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

Bitácora 3

## Parsed with column specification:
## cols(
##   Cod = col_character(),
##   texto = col_character()
## )
##  [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

Bitácora 4

## Parsed with column specification:
## cols(
##   Cod = col_character(),
##   texto = col_character()
## )
##  [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