viernes, 6 de septiembre de 2013

Encontrar asociaciones entre los terminos de un texto usando R

Hugo Chávez. Asociaciones entre términos presentes en algunos de sus discursos, 1999-2002.

Hugo Chávez. Asociaciones entre términos presentes en algunos de sus discursos, 1999-2002.

Además de las distribuciones de frecuencia, la minería de texto nos permite encontrar, dado un término, las palabras que tienden a asociarse en el texto o el conjunto de textos analizados. Este procedimiento es similar a encontrar la correlación entre los téminos. El paquete tm tiene la función findAssoc() con este propósito. Igualmente nos permite graficas estas asociaciones, creando un gráfo. Para ello necesitamos descargar y subir a la cónsola el paquete Rgraphiz. Un paquete para el análisis de redes creado por Bioconductor. Veamos como buscamos asociaciones entre los diferentes discursos con los que hemos venido trabajando. Discursos emitidos por H. Chávez entre 1999 y 2002, obtenidos de Hugo Chávez Frías en La BitBlioteca. Para el presente ejercicio, seguimos trabajando con las bases de datos de textos sin eliminar los términos funcionales.

Tenemos una corpa heterogéneas. Hay transcripciones de alocuciones hechas en marchas o en cadena nacional. Hay también correspondencia escrita, entrevistas, así como programas de gobierno. Recordemos las veintes palabras más frecuentes en la corpa analizada:

plot of chunk terminosmasF

Encontrando asociaciones

Para encontrar asociacion con un término dado, incluímos en la función la matriz documental en la que deseamos realizar el proceso, así como el nivel de asociación deseado entre las palabras. Las palabras que se asocian con otras a un nivel de 75% o más, tiende a aparecer permanentemente juntas en el texto analizada. Por ejemplo, busquemos en la matriz documental de las bases de textos, 1999-2002, las palabras que se asociacian con el término pueblo en un 80% o más. Escribimos:

findAssocs(tdm.99, "pueblo", 0.8)
##          siglo         nombre       academia       america,    bolivariano 
##           0.98           0.96           0.95           0.95           0.95 
##       caracas.         culpa.        entero,     especiales           hora 
##           0.95           0.95           0.95           0.95           0.95 
##          lugar  norteamerica,         pecho,          serie       ustedes; 
##           0.95           0.95           0.95           0.95           0.95 
##           ver,            xxi          aqui,       queridos           hoy, 
##           0.95           0.95           0.94           0.94           0.93 
##          simon         latina         caribe        hermoso        inmenso 
##           0.93           0.92           0.91           0.91           0.91 
##      acompanie          esta,       pueblos,      adelante,        caribe, 
##           0.90           0.90           0.90           0.89           0.89 
##         culpa,         fuerza            hoy        mensaje    venezolano. 
##           0.89           0.89           0.89           0.89           0.89 
##   bolivariana,       caracas,          desde       llamando          misma 
##           0.88           0.88           0.88           0.88           0.88 
##         moral,     venezolano          andan         campos        caribe. 
##           0.88           0.88           0.87           0.87           0.87 
## constituyente.        cumplir         frente          habra      historia. 
##           0.87           0.87           0.87           0.87           0.87 
##          nadie      nosotros,          pesar   resurreccion    democracia, 
##           0.87           0.87           0.87           0.87           0.86 
##            dia      ministros         primer       servicio        tierra, 
##           0.86           0.86           0.86           0.86           0.86 
##      venezuela     venezuela. centroamerica,         debajo        entero. 
##           0.86           0.86           0.85           0.85           0.85 
##       nuestros       pequenio representantes  sencillamente         tengan 
##           0.85           0.85           0.85           0.85           0.85 
##         tenido       bolivar.     venezuela,        america       bolivar, 
##           0.85           0.84           0.84           0.83           0.83 
##  compatriotas,         futuro       gabinete          libro          mismo 
##           0.83           0.83           0.83           0.83           0.83 
##          nuevo           pido            sol          vengo      voluntad, 
##           0.83           0.83           0.83           0.83           0.83 
##        interes        nuestro        pueblo,            sus          venir 
##           0.82           0.82           0.82           0.82           0.82 
##       abogamos        civiles         hijos,     nacimiento        nuestra 
##           0.81           0.81           0.81           0.81           0.81 
##          padre           siga          signo         tierra           alma 
##           0.81           0.81           0.81           0.81           0.80 
##        decreto           otro 
##           0.80           0.80
# igualmente escribiríamos para saber la evolución de esta asociación en los
# otros años: findAssocs(tdm00, 'pueblo',0.8) findAssocs(tdm01,
# 'pueblo',0.8) findAssocs(tdm02, 'pueblo',0.8)

Evidentemente que más adelante, en otros posts, cuando limpiemos las base de datos de texto de términos funcionales, números y símbolos podremos observar un patrón más claro en la asociaciones. Por ahora podemos visualizar en qué forma varió la asociación con la palabra pueblo en los diferentes discursos en los años analizados. Para ello, transformemos las asociaciones encontradas en un data frame, agreguemos una segunda variable con el años de cada asociacion y finalmente creemos un solo data frame. Por ultimo, elaboremos un small multiple para observar la evolución de las asociaciones con el término pueblo en los cuatro años analizados:

require(reshape2)
## Loading required package: reshape2
pueblo99 <- data.frame(melt(findAssocs(tdm.99, "pueblo", 0.8)))
pueblo99$lapso <- rep("1999", length(pueblo99))
pueblo00 <- as.data.frame(melt(findAssocs(tdm00, "pueblo", 0.8)))
pueblo00$lapso <- rep("2000", length(pueblo00))
pueblo01 <- as.data.frame(melt(findAssocs(tdm01, "pueblo", 0.8)))
pueblo01$lapso <- rep("2001", length(pueblo01))
pueblo02 <- as.data.frame(melt(findAssocs(tdm02, "pueblo", 0.8)))
pueblo02$lapso <- rep("2002", length(pueblo02))
puebloTodo <- rbind(pueblo99, pueblo00, pueblo01, pueblo02)
length(puebloTodo)
## [1] 2
dim(puebloTodo)
## [1] 1562    2

Tenemos un data frame demasiado largo para visualizarlo sin que Google se queje. mas de mil quinientos términos Vamos a seleccionar los 250 primeros términos asociados con la palabra *pueblo, lo que introducirá cierto sesgo por cuanto que la data se ha formateado de tal forma que los términos aparezcan ordenados por año. Por lo tanto, el año 2001 estará incompleto, en tanto que no parecerá el año 2002:

puebloCincuenta <- head(puebloTodo, 250)

Visualizando el data frame: plot of chunk PuebloAsoc

Observamos que Chávez emplea con mayor amplitud la palabra pueblo en los años 2001 y 2002 (no incluido en la gráfica). La aparición esporádica de este término en el año 2000 seguramente se debe al tipo de textos que hemos incluido, básicamente programas de gobierno.

No hay comentarios: