Text Mining de Twitter usando R

Muchos sabrán que Twitter es una poderosa herramienta de microblogging, además de un medio de comunicación extraordinario y de gran impacto social. Considerando ésto, y que millones de usuarios “tuitean” más de 175 millones de tweets diariamente, se desprende fácilmente que Twitter también puede ser una mina de datos sorprendente para la Minería de Datos (Data Mining), más bien, una fuente inagotable de datos para la Minería de Texto (Text Mining), para el análisis social, de sentimientos (Sentiment Analysis) y de opiniones (Opinion Mining).

Inspirados en esta idea y en nuestra participación en una competencia de Kaggle relacionada con Twitter, hemos elaborado este nuevo tutorial de WM Labs, donde desarrollaremos un proyecto de Text Mining, utilizando R para analizar Twitter.

Tal vez la pregunta principal que queremos responder de un análisis de Twitter es saber lo que se está hablando de un tema determinado, o quizás, lo que un usuario determinado está hablando. Por lo general, la forma más rápida de saber más acerca de lo que la gente está hablando, es mediante la visualización de las palabras más frecuentes que las personas utilizan y los términos contenidos en sus tweets. Podemos hacer esto mediante la creación de un barplot con los términos más frecuentes o podemos usar una opción de mayor atractivo visual, como por ejemplo, una nube de etiquetas (wordcloud), tal como lo hicimos anteriormente para analizar un discurso presidencial. Ambas opciones son buenas, pero tienen una limitación importante: no muestran cómo las palabras se relacionan, es decir, sólo reflejan las palabras más populares en los tweets. Pero ésto lo veremos en un próximo tutorial.

Pues bien, partimos nuestro análisis de Twitter usando R….

Requerimientos

  • Tener instalado R en tu equipo, lo puedes descargar de acá. Nosotros usamos R versión para Windows, también hay para Linux y MacOS X.
  • Instalar los paquetes de Text Mining “tm”, de extracción de datos desde Twitter “twitteR” y Wordcloud “wordcloud”, que se pueden bajar de la misma página en la sección ‘contrib’. Seguramente R les pedirá que instalen también los paquetes Rcpp, RColorBrewer y slam que tienen dependencias de los dos principales.
  • Utilizaremos también el archivo stopwords.es.txt de palabras vacías que generamos en uno de nuestros proyectos de Text Mining anteriores para filtrar las palabras vacías que no tengan significancia.

Manos a la obra

Pues bien, iniciamos R e ingresamos el siguiente código a la consola (el código está con comentarios para que se entienda cada paso). Si se dan cuenta, en este proyecto analizaremos los tweets de uno de los tres twitteros (en rigor, twittera) más influyentes de Chile durante el último tiempo: @camila_vallejo

# cargar librerias
library(twitteR)
library(tm)
library(wordcloud)

# recolecta tweets de @camila_vallejo
tweets = userTimeline("camila_vallejo", 2000)

# vuelca la informacion de los tweets a un data frame
df = twListToDF(tweets)

# obtiene el texto de los tweets
txt = df$text

##### inicio limpieza de datos #####
# remueve retweets
txtclean = gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", txt)
# remove @otragente
txtclean = gsub("@\\w+", "", txtclean)
# remueve simbolos de puntuación
txtclean = gsub("[[:punct:]]", "", txtclean)
# remove números
txtclean = gsub("[[:digit:]]", "", txtclean)
# remueve links
txtclean = gsub("http\\w+", "", txtclean)
##### fin limpieza de datos #####

# construye un corpus
corpus = Corpus(VectorSource(txtclean))

# convierte a minúsculas
corpus = tm_map(corpus, tolower)
# remueve palabras vacías (stopwords) en español
corpus = tm_map(corpus, removeWords, c(stopwords("spanish"), "camila_vallejo"))
# carga archivo de palabras vacías personalizada y lo convierte a ASCII
sw <- readLines("D:/DMprojects/R/stopwords.es.txt",encoding="UTF-8")
sw = iconv(sw, to="ASCII//TRANSLIT")
# remueve palabras vacías personalizada
corpus = tm_map(corpus, removeWords, sw)
# remove espacios en blanco extras
corpus = tm_map(corpus, stripWhitespace)

# crea una matriz de términos
tdm <- TermDocumentMatrix(corpus)

# convierte a una matriz
m = as.matrix(tdm)

# conteo de palabras en orden decreciente
wf <- sort(rowSums(m),decreasing=TRUE)

# crea un data frame con las palabras y sus frecuencias
dm <- data.frame(word = names(wf), freq=wf)

Finalmente, graficamos y obtenemos la nube de palabras…

# grafica la nube de palabras (wordcloud)
wordcloud(dm$word, dm$freq, random.order=FALSE, colors=brewer.pal(8, "Dark2"))
Wordcloud de los tweets de @camila_vallejo

Wordcloud de los tweets de @camila_vallejo

Como pueden ver, una nube de palabras puede ser una buena forma de visualizar la mayoría de las palabras y los términos contenidos en los tweets. Aunque su principal uso es para fines de exploración, tiene la ventaja de ser comprensible para la mayoría de las personas, y por qué no decirlo, ser visualmente atractivo a los ojos humanos (si se realiza adecuadamente). Esperamos les haya gustado, próximamente un nuevo tutorial.

Leave a reply