miércoles, 4 de septiembre de 2013

Mineria de texto usando R

Hugo Chávez. Palabras más frecuentes en algunos discursos, 1999-2002. Incluyendo palabras funcionales

Hugo Chávez. Palabras más frecuentes en algunos discursos, 1999-2002. Incluyendo palabras funcionales

Empleando la técnica de minería de texto, haremos un análisis descritivo de algunos textosy discursos emitidos por H. Chávez entre 1999 y 2002. Los discursos han sido obtenidos de Hugo Chávez Frías en La BitBlioteca. Usamos el paquete tm, Text Mining, de R.

El primer paso consiste en obtener la data. Podemos bajarla directamente al disco duro desde internet y conformar los diferentes directorios. Subimos cada uno de éstos a la cónsola de R, creando al mismo tiempo una base de datos de textos. Por ejemplo:

require(tm)
require(xtable)
a <- "~/chavez/1999"
c1999 <- Corpus(DirSource(a), readerControl = list(language = "es"))

Dado que hemos obtenidos estos discursos directamente de la web y no disponen de metadata, creamos entonces esta informacion. Por ejemplo, para los discursos de 1999:

meta(c1999, tag = "Author") <- c(rep("Hugo Chavez", 9))
meta(c1999, tag = "Heading") <- c("Bill Clinton", "Ilich Ramirez Sanchez", "Corte Suprema de Justicia", 
    "Cien dias de gobierno", "Desfile julio", "Alocucion Proceres", "Jesus Urdaneta Hernandez", 
    "Juramentacion Gabinete", "Discurso toma de posesion")
meta(c1999, tag = "Description") <- c("carta", "carta", "carta", "cadena nacional", 
    "discurso", "discurso", "entrevista", "cadena nacional", "discurso")
meta(c1999, tag = "ID") <- c("clinton", "chacal", "csj", "cien", "desfile", 
    "proceres", "urdaneta", "gabinete", "posesion")

meta(c1999, tag = "Language") <- c(rep("Spanish", 9))
meta(c1999, tag = "Origen") <- c(rep("www.analitica.com", 9))

Creamos una sola tabla con todos los discursos

disCompletos <- rbind(DMetaData(c1999), DMetaData(c2000), DMetaData(c2001), 
    DMetaData(c2002))

Generamos una tabla

miTabla <- xtable(disCompletos, caption = "H. Chavez. Textos analizados, 1999-2002", 
    digits = 0, floating.environment = "sidewaystable")

print(miTabla, include.rownames = FALSE, type = "html", hline.after = c(1))
H. Chavez. Textos analizados, 1999-2002
MetaID Author Heading Description ID Language Origen
0 Hugo Chavez Bill Clinton carta clinton Spanish www.analitica.com
0 Hugo Chavez Ilich Ramirez Sanchez carta chacal Spanish www.analitica.com
0 Hugo Chavez Corte Suprema de Justicia carta csj Spanish www.analitica.com
0 Hugo Chavez Cien dias de gobierno cadena nacional cien Spanish www.analitica.com
0 Hugo Chavez Desfile julio discurso desfile Spanish www.analitica.com
0 Hugo Chavez Alocucion Proceres discurso proceres Spanish www.analitica.com
0 Hugo Chavez Jesus Urdaneta Hernandez entrevista urdaneta Spanish www.analitica.com
0 Hugo Chavez Juramentacion Gabinete cadena nacional gabinete Spanish www.analitica.com
0 Hugo Chavez Discurso toma de posesion discurso posesion Spanish www.analitica.com
0 Hugo Chavez Respuesta Conferencia Episcopal carta cev Spanish www.analitica.com
0 Hugo Chavez Dieciocho meses de gobierno cadena nacional dieciocho Spanish www.analitica.com
0 Hugo Chavez Clausura II Cumbre OPEP discurso opep Spanish www.analitica.com
0 Hugo Chavez Palabras en el Panteon Nacional discurso panteon Spanish www.analitica.com
0 Hugo Chavez Frijolito II entrevista frijolitoII Spanish www.analitica.com
0 Hugo Chavez Revolucion Democratica programa gobierno rev.democ Spanish www.analitica.com
0 Hugo Chavez Presupuesto nacional cadena nacional presupuesto Spanish www.analitica.com
0 Hugo Chavez Cadena nacional agosto cadena cadago Spanish www.analitica.com
0 Hugo Chavez Cadena nacional junio cadena cadjun Spanish www.analitica.com
0 Hugo Chavez cadena nacional octubre cadena cadoct Spanish www.analitica.com
0 Hugo Chavez Cumbre Grupo de los Tres discurso grupo.tres Spanish www.analitica.com
0 Hugo Chavez Entrevista Heinz Dieterich entrevista dietrich Spanish www.analitica.com
0 Hugo Chavez Salutacion Cuerpo Diplomatico discurso salutacion Spanish www.analitica.com
0 Hugo Chavez Cadena al Retoma el poder cadena nacional retoma Spanish www.analitica.com
0 Hugo Chavez Francisco Arias Cardenas entrevista arias.cardenas Spanish www.analitica.com
0 Hugo Chavez Consejo Federal de Gobierno discurso consejo Spanish www.analitica.com
0 Hugo Chavez En la FAO discurso fao Spanish www.analitica.com
0 Hugo Chavez Entrega Premio Nacional Periodista discurso premio.periodista Spanish www.analitica.com
0 Hugo Chavez Marcha en Av Bolivar discurso marcha.respaldo Spanish www.analitica.com
0 Hugo Chavez Plan vivienda productiva discurso vivenda.productiva Spanish www.analitica.com
0 Hugo Chavez Con Jorge Gestoso entrevista j.gestoso Spanish www.analitica.com
0 Hugo Chavez con Martha Harnecker entrevista m.harnecker Spanish www.analitica.com
0 Hugo Chavez En Monterrey discurso monterrey Spanish www.analitica.com
0 Hugo Chavez Con medios internacionales entrevista m.internacionales Spanish www.analitica.com
0 Hugo Chavez Vision estrategica Venezuela discurso vision Spanish www.analitica.com

A partir de las funciones Corpus(), TextDocumentMatrix(), y de las transformaciones que se incluyen en el paquete tm, creamos algunas funciones propias: Con ella extraemos los términos más frecuentes en cada uno de los discursos emitidos durante el lapso analizado.

Obtengamos una relación del número de palabras en cada uno de los años analizados:

m1999 <- crear_tdm(c1999)
m2000 <- crear_tdm(c2000)
m2001 <- crear_tdm(c2000)
m2002 <- crear_tdm(c1999)

distribucion99 <- hacer_tabla(m1999)
distribucion00 <- hacer_tabla(m2000)
distribucion01 <- hacer_tabla(m2001)
distribucion02 <- hacer_tabla(m2002)

# veamos cinco primeros registros de la tabla correspondiente a 199
head(distribucion99)
##      palabras frecuencia
## que       que       1490
## los       los        595
## del       del        399
## para     para        348
## por       por        338
## las       las        315

Veamos rápidamente cuantas palabras posee cada corpa por año

discursos <- c(1999, 2000, 2001, 2002)
textos <- c(10, 8, 6, 15)
totalTerminos <- c(sum(distribucion99$frecuencia), sum(distribucion00$frecuencia), 
    sum(distribucion01$frecuencia), sum(distribucion02$frecuencia))
discursosDF <- data.frame(Fecha = discursos, Cantidad_textos = textos, total_palabras = totalTerminos)
H. Chavez.Discursos segun distribucion de palabras, 1999-2002
Fecha Cantidad_textos total_palabras
1999 10 28308
2000 8 26341
2001 6 26341
2002 15 28308

En un total de 39 textos obtenidos provenientes de discursos escritos o emitidos/avalados por el presidente Chávez, entre e 1999 y 2002 hay un total 1.093 × 105 de palabras.

Adicionalmente, limpiamos mos el corpus, eliminando palabras funcionales, números, espacios en blanco, y llevando todos los caracteres de las bases de datos documentales a minúscula, para usarlo posteriormente para hacer análisis de los discursos sin palabras funcionales.

chavez.99 <- limpiar_corpus_es(c1999)
chavez00 <- limpiar_corpus_es(c2000)
chavez01 <- limpiar_corpus_es(c2001)
chavez02 <- limpiar_corpus_es(c2002)

Creamos la matriz documental, que nos permitirá contar la frecuencia de aparición de cada término en los diferentes documentos. A partir de esta matrix generamos sendas tablas por año. Igualmente, creamos un par de funciones propias, partiendo de las funciones del paquete tm, para agilizar el proceso

tdm.99 <- crear_tdm(c1999)
tdm00 <- crear_tdm(c2000)
tdm01 <- crear_tdm(c2001)
tdm02 <- crear_tdm(c2002)

terminos99 <- hacer_tabla(tdm.99)
terminos00 <- hacer_tabla(tdm00)
terminos01 <- hacer_tabla(tdm01)
terminos02 <- hacer_tabla(tdm02)

Veamos los 20 términos que más repite Chávez en estos textos entre 1999-2002

mas99 <- head(terminos99, 20)
mas00 <- head(terminos00, 20)
mas01 <- head(terminos01, 20)
mas02 <- head(terminos02, 20)

veinte99 <- data.frame(palabras = mas99$palabras, frecuencia = round(mas99$frecuencia/sum(mas99$frecuencia) * 
    1000), fecha = rep("1999", length(mas99)))
veinte00 <- data.frame(palabras = mas00$palabras, frecuencia = round(mas00$frecuencia/sum(mas00$frecuencia) * 
    1000), fecha = rep("2000", length(mas00)))
veinte01 <- data.frame(palabras = mas01$palabras, frecuencia = round(mas01$frecuencia/sum(mas01$frecuencia) * 
    1000), fecha = rep("2001", length(mas01)))
veinte02 <- data.frame(palabras = mas02$palabras, frecuencia = round(mas02$frecuencia/sum(mas02$frecuencia) * 
    1000), fecha = rep("2002", length(mas02)))

x <- rbind(veinte99, veinte00, veinte01, veinte02)
require(ggplot2)

g <- ggplot(x, aes(reorder(palabras, frecuencia), frecuencia, ylab = "")) + 
    facet_grid(. ~ fecha) + geom_point() + theme(axis.text.x = element_text(angle = 90)) + 
    coord_flip() + labs(title = "H. Chavez. Algunos discursos segun palabras mas frecuentes por cada mil")
g + xlab("")

plot of chunk terminosmasF

De acuerdo con la Real Academia de la Lengua las veinte primeras palabras mas usadas del castellano son:

castellanoMas <- url("http://corpus.rae.es/frec/1000_formas.TXT")
castellanoDf <- read.table(castellanoMas, header = TRUE, sep = "\t")
head(castellanoDf, 20)
##         Orden Frec.absoluta Frec.normalizada
##      1.    de    9,999,518         65545.55 
##      2.    la    6,277,560         41148.59 
##      3.  que     4,681,839         30688.85 
##      4.    el    4,569,652         29953.48 
##      5.    en    4,234,281         27755.16 
##      6.     y    4,180,279         27401.19 
##      7.     a    3,260,939         21375.03 
##      8.   los    2,618,657         17164.95 
##      9.    se    2,022,514         13257.31 
##     10.   del    1,857,225         12173.87 
##     11.   las    1,686,741         11056.37 
##     12.    un    1,659,827         10879.95 
##     13.   por    1,561,904         10238.07 
##     14.  con     1,481,607           9711.74
##     15.    no    1,465,503           9606.18
##     16.  una     1,347,603           8833.36
##     17.    su    1,103,617           7234.06
##     18.  para    1,062,152           6962.26
##     19.    es    1,019,669           6683.79
##     20.    al       951,054          6234.03

No hay comentarios: