Text Mining de un Discurso Presidencial usando R

Siguiendo con Text Mining, en este nuevo tutorial de WM Labs, elaboraremos un proyecto de Text Mining para analizar, por ejemplo, un discurso del Presidente Piñera.

En esta ocasión, utilizaremos la herramienta R, que es un lenguaje de programación principalmente orientada al análisis estadístico y visualización de información cuantitativa y cualitativa (es un software libre publicado bajo licencia GNU-GPL). El interesado en saber más sobre R puede consultar esta pequeña presentación sobre R o la entrada en Wikipedia.

Pues bien, partimos…

Requerimientos

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:

# carga librerias
library(tm)
library(wordcloud)

# lee el documento UTF-8 y lo convierte a ASCII
txt <- readLines("D:/discurso.txt",encoding="UTF-8")
txt = iconv(txt, to="ASCII//TRANSLIT")

# construye un corpus
corpus <- Corpus(VectorSource(txt))

# lleva a minúsculas
d  <- tm_map(corpus, tolower)

# quita espacios en blanco
d  <- tm_map(d, stripWhitespace)

# remueve la puntuación
d <- tm_map(d, removePunctuation)

# carga mi archivo de palabras vacías personalizada y lo convierte a ASCII
sw <- readLines("D:/stopwords.es.txt",encoding="UTF-8")
sw = iconv(sw, to="ASCII//TRANSLIT")

# remueve palabras vacías genericas
d <- tm_map(d, removeWords, stopwords("spanish"))

# remueve palabras vacías personalizadas
d <- tm_map(d, removeWords, sw)

# crea matriz de terminos
tdm <- TermDocumentMatrix(d)

Hasta aquí tenemos cargada una matriz con todos los términos que aparecen en el discurso y filtrada por las palabras vacías. Con el siguiente comando veremos la frecuencia de algunas palabras, digamos con frecuencia mínima igual a 20:

findFreqTerms(tdm, lowfreq=20)

y R nos arroja el siguiente resultado:

 [1] "ano"       "anos"      "chile"     "chilenos"  "ciento"    "congreso"  "derechos"  "educacion" "familias"  "gobierno"
[11] "ley"       "mil"       "millones"  "nacional"  "plan"      "proyecto"  "salud"     "vida"

Vemos que hay palabras como ‘ano’ (año) y ‘años’ (años) que se repiten mucho y queremos también filtrarlas, por lo que ejecutamos nuevamente los siguiente comandos para filtrar esas y otras más:

d <- tm_map(d, removeWords, c("ano","anos","mes","meses","mil","millon","millones"))

tdm <- TermDocumentMatrix(d)

El Resultado

Ahora bien, lo que haremos es cargar la matriz de términos como matriz y usando un data frame desplegaremos la frecuencia en una nube de palabras usando el paquete wordcloud con el siguiente código:

m <- as.matrix(tdm)

v <- sort(rowSums(m),decreasing=TRUE)

df <- data.frame(word = names(v),freq=v)

wordcloud(df$word,df$freq,min.freq=6)

resultando una nube de palabras como la siguiente imagen:

Wordcloud del Discurso Presidencial

Wordcloud del Discurso Presidencial

Cómo pueden ver las palabras “chile”, “chilenos”, “congreso”, “derechos”, “educacion”, “familias”, “gobierno”, “ley”, “nacional”, “plan”, “proyecto”, “salud” y “vida”, son algunas de las que tienen mayor frecuencia y por lo tanto están más destacadas en la nube de palabras. Y bueno, con esto también puede sacar sus propias conclusiones a partir del contenido de este discurso en función de sus preferencias políticas. Como se puede apreciar, los políticos pueden dar discursos interesantes, y todos están llenos de simples palabras!. Esperamos les haya gustado y posteen sus comentarios!. Nos vemos en un próximo WM Labs!.

Comments ( 4 )

  1. / mmville
    Hola, he seguido al pie de la letra sus indicaciones e incluso he descargado el fichero de texto y lo he guardado en la misma ubicación.  Todo va bien hasta que ejecuto la línea 32 pues me sale el siguiente error que no me deja seguir adelante: > tdm <- TermDocumentMatrix(d) Error: inherits(doc, "TextDocument") is not TRUE Si ejecuto la siguiente instrucción sale otro error, que creo depende del anterior: > findFreqTerms(tdm, lowfreq=20) Error en inherits(x, c("DocumentTermMatrix", "TermDocumentMatrix")) :   objeto 'tdm' no encontrado Podrían decirme qué sucede?  Muchas, muchas gracias por adelantado. Un saludo!
  2. / trinidadbosch
    Hola! Muy interesante la empresa! y este post me ayudó mucho con lo que necesito hacer.  Necesito hacer un análisis de prensa, tengo una base en excel con 4000 casos (títulos y resúmenes de noticias) y quiero crear indicadores, por ejemplo para regiones 1, si la noticia es de robo = 2, etc...  Estoy haciendo una prueba en una base con 20 casos, logro cargarla y manipular hasta crear el corpus, luego de eso no he logrado crear los filtros para hacer mis indicadores. Les copio mi script, si me pudieran guiar sería increible!!   MUCHAS GRACIAS   library("RODBC")## Paquete que me permite abrir bases en excel noticias <- odbcConnectExcel2007("prueba.xlxs") library(xlsx) ##cargo base en excel loadWorkbook("prueba.xlsx") noticias <- read.xlsx("prueba.xlsx", sheetName = "mysheet", header = TRUE)  summary(noticias) names(noticias)   #####MANEJO TEXTO ############## library(tm) ### Cargo paquete "tm" (text mining) corpus <- Corpus(VectorSource(noticias)) #Ahora quiero limpiar mi base, de puntuaciones, palabras vacías, espacios en blanco y llevar a minusculas (tolower) cleanCorpus <- function(corpus) { corpus.tmp <- tm_map(corpus, removePunctuation) corpus.tmp <- tm_map(corpus.tmp, stripWhitespace) corpus.tmp <- tm_map(corpus.tmp,tolower)} tdm <- TermDocumentMatrix(corpus) ##crea matriz de términos findFreqTerms(tdm, 20)   #Me busca frecuencia de palabraslibrary(wordcloud) corpus corpus <- tm_map(corpus, removeWords, c("los", "por", "que")) ##me elimina palabras con alta frecuencia que no me sirven tdm <- TermDocumentMatrix(corpus)  
    • / WebMining Consultores
      Gracias por tus comentarios. Vas muy bien encaminada, pero la ayuda o guía que nos pides ya se enmarca en un servicio de consultoría, que debes contratarnos. Atentamente, WebMining Consultores Ltda.

Leave a reply