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