Benitez, Oscar (CL - Santiago)
2012-Dec-13 15:29 UTC
[R-es] Tamaño de la matriz de términos y memoria. Paquete TM
Hola a todos!
Tengo algunos problemas con el tamaño de la matriz de términos que obtengo. Los
comandos que utilizo son los siguientes:
# carga librerias
library(tm)
library(wordcloud)
library(Rstem)
library(Snowball)
# lee el documento UTF-8 y lo convierte a ASCII
txt <-
readLines("D:/Publico/Documents/texto1.txt",encoding="UTF-8")
txt = iconv(txt, to="ASCII//TRANSLIT")
# construye un corpus
corpus <- Corpus(VectorSource(txt))
# lleva a minúsculas
corpus <- tm_map(corpus, tolower)
# quita espacios en blanco
corpus <- tm_map(corpus, stripWhitespace)
# remueve la puntuación
corpus <- tm_map(corpus, removePunctuation)
# carga el archivo de palabras vacías personalizada en español y lo convierte a
ASCII
sw <-
readLines("D:/Publico/Documents/TextMinigSpanishResources/Stopwords.es.txt",encoding="UTF-8")
sw = iconv(sw, to="ASCII//TRANSLIT")
# remueve palabras vacías genericas
corpus <- tm_map(corpus, removeWords,
stopwords("spanish"))
# stemming
corpus <- tm_map(corpus, stemDocument, language =
"spanish")
# crea matriz de terminos
#a) términos como filas y documentos como columnas
dtm <- DocumentTermMatrix(corpus)
inspect(dtm[1000:1005,1000:1005])
# Términos con frecuencia mínima igual a 30:
findFreqTerms(dtm, lowfreq=30)
# remueve términos con baja frecuencia
inspect(removeSparseTerms(dtm, 0.4))
# nube de palabras
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
df <- data.frame(word = names(v),freq=v)
wordcloud(df$word,df$freq,min.freq=30)
Y obtengo un error en m <- as.matrix(dtm): "Error: no se puede ubicar
un vector de tamaño 248.9 Mb"
Hay alguna manera de reducir la matriz? Ideal sería quedarse con la matriz de
palabras de mayor frecuencia. El comando removeSparseTerms, por lo que entiendo
debería hacer el trabajo, pero sigo con problemas de tamaño de la matriz...
Agradezco cualquier sugerencia al respecto.
Oscar
Deloitte refers to one or more of Deloitte Touche Tohmatsu Limited, a UK private
company limited by guarantee, and its network of member firms, each of which is
a legally separate and independent entity. Please
see http://www.deloitte.com/about for a detailed description of the legal
structure of Deloitte Touche Tohmatsu Limited and its member firms.
[[alternative HTML version deleted]]
Freddy López
2012-Dec-13 16:21 UTC
[R-es] Tamaño de la matriz de términos y memoria. Paquete TM
Hola. Particularmente cuando me he visto frente a este tipo de problema y frente a este tipo de análisis (textual) me ha resultado mucho mejor realizar el preprocesado de los datos en otro programa y luego, con la matriz preparada, trabajar con R. Yo no sé si sea le mejor manera, pero me he evitado el problema de manejo de corpus grandes. perl, python o lua me parecen buenas opciones para crear la matriz que necesitas. ¡Salud! 2012/12/13 Benitez, Oscar (CL - Santiago) <obenitez@deloitte.com>> Hola a todos! > > Tengo algunos problemas con el tamaño de la matriz de términos que > obtengo. Los comandos que utilizo son los siguientes: > > # carga librerias > library(tm) > library(wordcloud) > library(Rstem) > library(Snowball) > # lee el documento UTF-8 y lo convierte a ASCII > txt <- > readLines("D:/Publico/Documents/texto1.txt",encoding="UTF-8") > txt = iconv(txt, to="ASCII//TRANSLIT") > # construye un corpus > corpus <- Corpus(VectorSource(txt)) > # lleva a minúsculas > corpus <- tm_map(corpus, tolower) > # quita espacios en blanco > corpus <- tm_map(corpus, stripWhitespace) > # remueve la puntuación > corpus <- tm_map(corpus, removePunctuation) > # carga el archivo de palabras vacías personalizada en español y lo > convierte a ASCII > sw <- > readLines("D:/Publico/Documents/TextMinigSpanishResources/Stopwords.es.txt",encoding="UTF-8") > sw = iconv(sw, to="ASCII//TRANSLIT") > # remueve palabras vacías genericas > corpus <- tm_map(corpus, removeWords, stopwords("spanish")) > # stemming > corpus <- tm_map(corpus, stemDocument, language > "spanish") > # crea matriz de terminos > #a) términos como filas y documentos como columnas > dtm <- DocumentTermMatrix(corpus) > inspect(dtm[1000:1005,1000:1005]) > # Términos con frecuencia mínima igual a 30: > findFreqTerms(dtm, lowfreq=30) > # remueve términos con baja frecuencia > inspect(removeSparseTerms(dtm, 0.4)) > # nube de palabras > m <- as.matrix(dtm) > v <- sort(rowSums(m),decreasing=TRUE) > df <- data.frame(word = names(v),freq=v) > wordcloud(df$word,df$freq,min.freq=30) > > > Y obtengo un error en m <- as.matrix(dtm): "Error: no se puede ubicar > un vector de tamaño 248.9 Mb" > > Hay alguna manera de reducir la matriz? Ideal sería quedarse con la matriz > de palabras de mayor frecuencia. El comando removeSparseTerms, por lo que > entiendo debería hacer el trabajo, pero sigo con problemas de tamaño de la > matriz... > > Agradezco cualquier sugerencia al respecto. > > Oscar > > > > Deloitte refers to one or more of Deloitte Touche Tohmatsu Limited, a UK > private company limited by guarantee, and its network of member firms, each > of which is a legally separate and independent entity. Please see > http://www.deloitte.com/about for a detailed description of the legal > structure of Deloitte Touche Tohmatsu Limited and its member firms. > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >-- «But Gwindor answered: ''The doom lies in yourself, not in your name.''» JRR Tolkien [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2012-Dec-13 21:04 UTC
[R-es] Tamaño de la matriz de términos y memoria. Paquete TM
Hola, ¿qué tal? Tienes un error en tu código. Donde dices> # remueve términos con baja frecuencia > inspect(removeSparseTerms(dtm, 0.4))debieras haber escrito> # elimina términos con baja frecuencia > dtm <- removeSparseTerms(dtm, 0.4)No estabas eliminando los términos poco frecuentes sino únicamente mostrándolos. Mira luego si puedes continuar con> # nube de palabras > m <- as.matrix(dtm) > v <- sort(rowSums(m),decreasing=TRUE) > df <- data.frame(word = names(v),freq=v) > wordcloud(df$word,df$freq,min.freq=30)Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com