Análisis de textos con R

Septiembre 5th, 2011 | por rvaquerizo |

Vamos a replicar un ejemplo ya presentado con WPS en esta misma bitácora. Tratamos de hacer algo tan sencillo como contar palabras y para ello empleamos de nuevo un debate del Congreso de los Diputados de España. Estas intervenciones las transformamos en un fichero de texto que vosotros podéis descargaros de   este link. Bien, partimos de un archivo de texto de Windows y con él vamos a crear un data frame de R que contendrá las palabras empleadas en esa sesión del Congreso español. Pasamos a analizar el código empleado:

#Leemos el fichero de una ubicación de nuestro equipo
ubicacion="D:\\raul\\wordpress\\text minning R\\datos\\intervencion_congreso.txt"
texto = read.table (ubicacion,sep="\r")
#Dejamos todas las palabras en mayúsculas
texto = toupper(texto$V1)
#El texto lo transformamos en una lista separada por espacios
texto_split = strsplit(texto, split=" ")
#Deshacemos esa lista y tenemos el data.frame
texto_col = as.character(unlist(texto_split))
texto_col = data.frame(texto_col)
names(texto_col) = c("V1")

Está bien comentado en el código, pero repetimos. Leemos el archivo de texto con una sóla variable y donde el retorno de carro es el separador, en R el retorno de carro es \r. Con toupper ponemos todas las palabras en mayúsculas y a partir de ahí creamos una lista con los elementos de la tabla inicial partiendo por espacios en blanco. Se deshace la lista y se crea un data frame con una variable que llamamos V1. Ahora es necesario realizar una pequeña depuración de las palabras. Mi hijo acaba de tirar una piedra al portátil así que no me entretendré mucho con esta tarea:

#Eliminamos algunos caracteres regulares
texto_col$V1 = sub("([[:space:]])","",texto_col$V1)
texto_col$V1 = sub("([[:digit:]])","",texto_col$V1)
texto_col$V1 = sub("([[:punct:]])","",texto_col$V1)
#Creo una variable longitud de la palabra
texto_col$largo = nchar(texto_col$V1)
#Controles que utilizo
head(texto_col)
hist(texto_col$largo)

Con la función sub vamos a eliminar caracteres regulares como espacios ("([[:space:]])") números ("([[:digit:]])") y signos de puntuación ("([[:punct:]])"). Con nchar creamos una variable en el data frame para determinar la longitud de la palabra. Se realiza un histograma para analizar estas longitudes.

Ya disponemos de un data frame preparado para nuestro objetivo, ahora sólo nos queda realizar la tabla de frecuencias y para ello vamos a emplear el paquete sqldf (como no):

library(sqldf)
contador = sqldf("
select V1 as palabra,count(*) as frec
from texto_col
where largo > 4
group by palabra
order by count(*) desc ;")
head(contador)

Vemos que el código requiere de una cierta mejora, pero parece claro que les preocupaba la REFORMA CONSTITUCIONAL y la CONSTITUCION (ahora nos acordamos de ella). Esta entrada continuará con la creación de una nube de palabras que realizaremos con ggplot2.

Por cierto, este trabajo se intentó hacer con la librería tm y no pude con los caracteres especiales tales como ñ o tildes, ¿alguien sabe cómo solventar este problema?

Etiquetas: , , , ,

  1. 2 Respuestas en “Análisis de textos con R”

  2. Por Gregorio R. Serrano, Sep 6, 2011 | Responder

    Hola Ramón. Yo creo que lo de tm es un problema de la codificación de carácteres. Si quieres, mándame el archivo de texto y hago alguna prueba con tm que a mi me ha funcionado bien con texto en castellano.

  3. Por rvaquerizo, Sep 6, 2011 | Responder

    Hola, soy Raúl, no Ramón. La verdad es que no le di muchas vueltas al problema con tm, en la lista de r en español se planteó la duda y no se resolvió.

    En la entrada aparece el link al archivo de texto plano (http://analisisydecision.es/wp-content/uploads/2011/09/intervencion_congreso.txt)

    Empecé con:

    library(tm)
    #directorio de trabajo
    ub_datos = “D:/wordpress/text minning R/datos”
    estruc = Corpus(DirSource(ub_datos))

    texto.matrix<-TermDocumentMatrix(estruc,
    control = list(removePunctuation = TRUE, stemming = TRUE,
    minWordLength = 5))

    Y en el momento que obtuve 2 veces este error:

    Error en tolower(txt) : invalid input ‘ORDEN DEL DÍA: ‘ in ‘utf8towcs’

    No me compliqué mucho más la vida.

    A ver si puedes resolver el problema y en la siguiente entrada empleo tm. Gracias

Publica un Comentario