Se presentan en este documento un uso, básico de dos librerías o paquetes de R, para generar nubes de palabras, ó WordCloud por su nombre en inglés. Una de ellas es wordcloud2
y la otra, wordcloud
.
Además de estas librerías, es necesario hacer uso de otras librerías, que permiten la depuración del texto antes de crear la nube de palabras. Este paso es esencial en el proceso de minería de texto.
tm
(para minería de texto)SnowballC
(para palabras compuestas o conjugadas)RColorBrewer
(editar el color)wordcloud2
Es probablemente la mejor forma de construir nubes de palabras con R. Debemos tener en cuenta que es un widget HTML. Por lo tanto el formato de salida predeterminado es HTML, pero también es posible obtener en formato PNG, o PDF.
Haremos algunos ejemplos, con una lista de palabras (demoFreq
) de demostración contenida en el paquete tm
.
NOTA: para no tener inconvenientes con algunas de las funciones de la libería, se recomienda hacer su instalación desde el repositorio de GithHub. La instalación desde el CRAN, genera algunos errores cuando se usan algunas funciones como
lettercloud()
.
# se recomienda hacer la instalación de esta manera
devtools::install_github("lchiffon/wordcloud2")
library(wordcloud2)
library(tm)
wordcloud2(data=demoFreq, size = 0.7)
La sintaxis general de esta función es:
wordcloud2(data, size, color, backgroundcolor, shape, minrotation, maxrotation)
data
= es el archivo de datos de entrada.size
= el tamaño de las palabras que serán mostradas en la gráfico de la nube.color
= será el color de las palabras.backgroundcolor
= para ajustar el color de fonde del gŕafico.shape
= la forma que tendrá la nube de palabras (star, cardioid, circle, triangle, …).min/max rotation
= el ángulo de rotación de las palabras.Haremos uso de los colores rojo y negro para dar color a las palabras.
color:
random-light, random-dark.rep_len(c()):
definir color manualmente.wordcloud2(data=demoFreq, size = 0.7, color = rep_len(c('Black','Red'), nrow(demoFreq)))
wordcloud2(data=demoFreq, size = 0.7, color = 'random-light',backgroundColor = 'Black')
La forma de la “nube” para dibujar puede ser una palabra clave presente. Algunas formas disponibles son ‘círcle’ (predeterminado), ‘cardioid’ (curva en forma de manzana o corazón, la ecuación polar más conocida), ‘diamond’ (alias del cuadrado), ‘triangle-forward’, ‘triangle’, ‘pentagon’, y ‘star’.
wordcloud2(data=demoFreq,size = 0.5,shape = 'star')
Tambíen es posible hacer uso de imágenes importadas en formato jpg o png como máscara, para dar forma a la nube de palabras.
wordcloud2(data = demoFreq, figPath = "peaceAndLove.jpg", size = 0.5, color = "skyblue", backgroundColor="black")
Probando con imagen en formato png.
figPath = system.file("tijeras.png", package = "wordcloud2")
wordcloud2(data = demoFreq, figPath = "tijeras.png", size = 1,color = "steelblue")
En la nube de palabras puede rotar el texto en los gráficos. La función wordcloud2 ofrece características como la rotación mínima y máxima junto con la relación de rotación para facilitar los ángulos.
wordcloud2(demoFreq, size = 1, minRotation = -0.52, maxRotation = -0.52, rotateRatio = 2)
wordcloud2(demoFreqC, size = 2, fontFamily = "????????????", color = "random-light", backgroundColor = "Black")
La función letterCloud()
permite usar una letra o una palabra como máscara para la nube de palabras:
letterCloud(data = demoFreq, word = "C", color='random-light' , backgroundColor="black")
letterCloud(data = demoFreq, word = "PAZ", color="black", backgroundColor="orange")
Es posible exportar la nube de palabras en formato png o pdf usando RStudio, o usando la librería webshot
.
# cargar wordcloud2
library(wordcloud2)
# instalar webshot
library(webshot)
webshot::install_phantomjs()
# Construir nube de puntos
my_graph <- wordcloud2(data = demoFreq, size=1.5)
# guardar en html
library("htmlwidgets")
saveWidget(my_graph,"tmp.html",selfcontained = FALSE)
# guardar in png or pdf
webshot("tmp.html","fig_1.pdf", delay =5, vwidth = 480, vheight=480)
webshot("tmp.html","fig_1.png", delay =5, vwidth = 480, vheight=480)
wordcluod
Para los siguientes ejemplos, usaremos fragmentos del texto, EL CONOCIMIENTO DE LA IGNORANCIA, de Karl Popper.
Lo primero que haremos será copiar y pegar el texto deseado en un archivo de texto plano con extensión .txt
, lo guardaremos en nuestra carpeta de trabajo.
El archivo en este caso, se llamará texto.txt
.
Importaremos el archivo creado en nuestro computador anteriormente. La función solicitará elegir el archivo, abriendo una ventana con ruta a las carpetas de la memoria del pc. Seleccionamos el archivo, en este caso texto.txt
.
text <- readLines(file.choose())
Si se encuentra trabajando desde la IDE de RStudio, veŕa que se ha creado un objeto llamado text
que es de tipo character.
NOTA: También es posible importar un archivo alojado en un sitio web a través de una URL.
# Leer archivo de texto desde internet.
filePath <- "http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt"
text <- readLines(filePath)
El texto se carga usando la función Corpus()
del paquete de minería de texto tm
. Corpus es una lista de un documento (en nuestro caso, solo tenemos un documento).
La función VectorSource()
crea un corpus de vectores de caracteres.
docs <- Corpus(VectorSource(text))
inspect(docs)
La transformación se realiza usando la función tm_map()
para reemplazar, por ejemplo, caracteres especiales del texto.
Por ejemplo es posible hacer el reemplazo de los caracteres /
, @
, |
, )
, (
, por un espacio.
# función para reemplazar caracteres
toSpace <- content_transformer(function (x , pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\\|")
La función tm_map()
se usa para eliminar espacios en blanco innecesarios, para convertir el texto a minúsculas, para eliminar palabras vacías comunes como “el”, “nosotros”.
El valor de información de las “stopwords” es cercano a cero debido al hecho de que son tan comunes en un idioma. Es útil eliminar este tipo de palabras antes de realizar más análisis. Para las “stopwords”, los idiomas admitidos son danés, holandés, inglés, finlandés, francés, alemán, húngaro, italiano, noruego, portugués, ruso, español y sueco. (danish, dutch, english, finnish, french, german, hungarian, italian, norwegian, portuguese, russian, spanish and swedish
).
Los nombres de los idiomas distinguen entre mayúsculas y minúsculas.
También puede eliminar números y puntuación con los argumentos removeNumbers
y removePunctuation
.
Otro paso importante de preprocesamiento es hacer una derivación del texto (text stemming), que reduzca las palabras a su forma original o en el caso de los verbos a su forma infinitiva. En otras palabras, este proceso elimina los sufijos de las palabras para simplificarlo y obtener el origen común. Por ejemplo, un proceso text stemming reduce las palabras “en movimiento”, “movido” y “movimiento” a la palabra raíz, “mover”.
Este proceso, requiere del paquete SnowballC
.
# Convertir a letras minúsculas el texto.
docs <- tm_map(docs, content_transformer(tolower))
# Remover números
docs <- tm_map(docs, removeNumbers)
# Remover stopwords comunes
docs <- tm_map(docs, removeWords, stopwords("spanish"))
# Remover una palabra en particular.
# Se especifica las stopwords como un vector de caracteres.
#docs <- tm_map(docs, removeWords, c("blabla1", "blabla2"))
# remover signos de puntuación
docs <- tm_map(docs, removePunctuation)
# Eliminar espacios en blanco extras.
docs <- tm_map(docs, stripWhitespace)
# Text stemming
# docs <- tm_map(docs, stemDocument)
La matriz de documentos es una tabla que contiene la frecuencia de las palabras. Los nombres de las columnas son palabras y los nombres de las filas son documentos. La función TermDocumentMatrix()
del paquete de minería de texto se puede utilizar de la siguiente manera:
#crear matriz documento de términos
dtm <- TermDocumentMatrix(docs)
matriz <- as.matrix(dtm)
# ordenar filas de la matriz en orden descendente
v <- sort(rowSums(matriz),decreasing=TRUE)
# convertir a data frame
d <- data.frame(word = names(v),freq=v)
# mostrar los primeros 10 términos que más se repiten
head(d, 10)
La función wordcluod()
recibe una base de datos.
Sintaxis
words
(vector de palabras.)freq
(vector de frecuencias de las palabras.)scale
(vector de longitud 2, que indica el rango del tamaño de las palabras.)min.freq
(palabras con una frecuencia por debajo de este valor no serán mostradas.)max.words
(Número máximo de palabras a mostrar.)random.order
(trazar palabras en orden aleatorio. Si es falso, se trazarán con una frecuencia decreciente. )rot.per
(proporción de palabras con rotación de 90 grados)library(wordcloud)
library(RColorBrewer)
set.seed(4321)
wordcloud(words = d$word, freq = d$freq, scale = , min.freq = 1,
max.words=200, random.order=FALSE, rot.per=0.35,
colors=brewer.pal(8, "Paired"),
family="serif")