El paquete de R {wordcloud} contiene funciones para generar el gráfico conocido como ‘Nube de palabras’ (o ‘wordcloud’ en inglés) que se utiliza en la rama estadística denominada ‘text mining’. Este tipo de gráfico sirve para visualizar la frecuencia con que aparece cada palabra en un texto. A mayor frecuencia de aparición de una palabra en el texto, mayor tamaño de la palabra en el gráfico (Wiki).

La función utilizada del paquete es wordcloud() y es conveniente que, antes de utilizarla, le introduzcamos el texto debidamente ‘limpio’, es decir, que no contenga espacios, números o caracteres de puntuación. Esto forma parte de la minería de datos y para ello usaremos el paquete {tm} que contiene funciones muy útiles para manipular texto.


Ejemplo: Descargamos el texto de un fichero de Internet que contiene el cuento ‘La biblioteca de babel’ de Jorge Luis Borges, separamos las palabras, eliminamos los caracteres especiales y creamos el gráfico de nube de palabras.

# Instalar y cargar las librerías
if (!require('wordcloud')) {install.packages('wordcloud')}
Loading required package: wordcloud
Loading required package: RColorBrewer
if (!require('tm')) {install.packages('tm')}
Loading required package: tm
Loading required package: NLP
library(wordcloud, quietly = T)
library(tm, quietly = T)

# Importar el texto contenido en un fichero de internet
# Si no existe cambiar por la url de otro fichero de texto
texto <- readLines("https://gist.githubusercontent.com/jsdario/1daee22f3f13fe6bc6a343f829565759/raw/3511dc6de6a7bf064c168b4f20b85a20d8f83b91/la_biblioteca_de_babel.txt")

# Convertimos el texto a vector y a un documento con lenguaje natural
docs <- Corpus(VectorSource(texto))

# Funcion para convertir caracteres raros en espacios
toSpace <- content_transformer(function(x, pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\\|")

# Limpiamos el texto de numeros, palabras que no interesen, signos de puntuacion, etc.
# Eliminar numeros
docs <- tm_map(docs, removeNumbers)
# Convertir a minusculas
docs <- tm_map(docs, content_transformer(tolower))
# Eliminar las palabras vacias comunes del idioma del texto
docs <- tm_map(docs, removeWords, stopwords("spanish"))
# Eliminar palabras que no interesan al usuario
docs <- tm_map(docs, removeWords, c("blabla1", "blabla2")) 
# Eliminar signos de puntuacion
docs <- tm_map(docs, removePunctuation)
# Elimina espacios extras
docs <- tm_map(docs, stripWhitespace)

# Construimos la matriz de frecuencias de cada palabra
dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
v <- sort(rowSums(m), decreasing = TRUE)
df <- data.frame(word = names(v), freq = v)
head(df)
                 word freq
biblioteca biblioteca   27
libros         libros   20
libro           libro   17
cada             cada   14
hexágono     hexágono   13
hombres       hombres   10
# Grafico nube de palabras
wordcloud(df$word, df$freq, random.order = FALSE, min.freq = 1,
          max.words = Inf, colors = brewer.pal(8,"Paired"))