[R-es] wordcloud y tabla de palabras

Carlos J. Gil Bellosta cgb en datanalytics.com
Mar Jul 29 19:49:46 CEST 2014


Hola, ¿qué tal?

Tu problema es que m es una matriz que no tiene dos columnas. El error
se puede replicar así:

> a <- matrix(0, 3, 3)
> colnames(a) <- c("a", "b")
Error in `colnames<-`(`*tmp*`, value = c("a", "b")) :
  length of 'dimnames' [2] not equal to array extent

ncol(m) te dirá cuántas columnas tiene m.

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com

El día 29 de julio de 2014, 19:35, Alfredo David Alvarado Ríos
<david.alvarado.r en gmail.com> escribió:
> Buenas tardes grupo.
> Carlos, siguiendo tu sugerencia hice dos cosas: releí el ejemplo de la
> referencia que coloqué en el correo anterior; y leí un poco más acerca
> de tm.
> También seguí el ejemplo que yo mismo coloqué de referencia, y acá más
> abajo reproduzco el código:
> Versión de R: 3.1.1
>
>
> ####
> require(tm)
> require(wordcloud)
> require(Rcpp)
> require(slam)
>> info.05<-readLines("./PLANIFICACION/Informes/2005/05_seguridad_ciudadana.txt", encoding="UTF-8")
>> info.13<-readLines("./PLANIFICACION/Informes/2013/2013_21SeguridadCiudadana.txt", encoding="UTF-8")
>> info.05<-iconv(enc2utf8(info.05), sub="byte")
>> info.13<-iconv(enc2utf8(info.13), sub="byte")
>> informes<-c(info.05, info.13)
>> corpus<-Corpus(VectorSource(informes))
>> inspect(corpus[1:2])
> <<VCorpus (documents: 2, metadata (corpus/indexed): 0/0)>>
>
> [[1]]
> <<PlainTextDocument (metadata: 7)>>
> Derecho a la seguridad ciudadana. Toda persona tiene derecho a la
> protección del Estado a través de los órganos de seguridad ciudadana
> regulados por ley, frente a situaciones que constituyan amenazas,
> vulnerabilidad o riesgo para la integridad física de las personas, sus
> propiedades, el disfrute de sus derechos y el cumplimiento de sus
> deberes. La participación de los ciudadanos y las ciudadanas en los
> programas destinados a la prevención, seguridad ciudadana y
> administración de emergencias será regulada por una ley especial. Los
> cuerpos de seguridad del Estado respetarán la dignidad y los derechos
> humanos de las personas. El uso de armas o sustancias tóxicas por
> parte del funcionariado policial y de seguridad estará limitado por
> principios de necesidad, oportunidad, proporcionalidad, conforme a la
> ley.
>
> [[2]]
> <<PlainTextDocument (metadata: 7)>>
> La situación del derecho a la seguridad ciudadana en el período que
> cubre este Informe, presentó cambios en algunas cifras (descensos en
> homicidios y robos); sin embargo, la situación desde el punto de vista
> estructural permanece igual, ya que no existe política pública de
> seguridad ciudadana democrática, con participación real de las
> comunidades, sino que se insiste en propuestas
>
>> d<-tm_map(corpus, content_transformer(tolower))
>> d<-tm_map(d, removePunctuation)
>> d<-tm_map(d, stripWhitespace)
>> d<-tm_map(d, removeWords, sw)
>> d<-tm_map(d, removeWords, stopwords("spanish"))
>> tdm<-TermDocumentMatrix(d)
>> colnames(m) = c("2005","2013")
> Error in `colnames<-`(`*tmp*`, value = c("2005", "2013")) : length of
> 'dimnames' [2] not equal to array extent
> #####
>
> Y una vez más vuelvo a tener el error en colnames. El resto de los
> pasos, incluso el wordcloud lo llego a hacer, pero no logro llegar a
> establecer que las columnas de la matrix serán los años, y la
> intención que tengo es poder comparar los textos, incluso con gráfico
> de barras por palabras más frecuentes.
>
>
>
>
> El día 28 de julio de 2014, 15:28, Carlos Ortega
> <cof en qualityexcellence.es> escribió:
>> Hola,
>>
>> La referencia (gracias por proporcionarla) que has incluido es bastante
>> clara y se puede seguir.
>> ¿Has podido sobre tus dos discursos utilizar la misma lógica?
>>
>> La forma de salir de dudas, para empezar, es que adjuntaras el código que
>> estás empleando por ver si hay algún error evidente. Aunque la forma
>> adecuada para que te podamos ayudar es con un ejemplo reproducible: código +
>> datos.
>>
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es
>>
>>
>> El 28 de julio de 2014, 21:24, Alfredo David Alvarado Ríos
>> <david.alvarado.r en gmail.com> escribió:
>>>
>>> Buenas tardes, grupo. Agradecido Carlos por tu orientación y Eduardo.
>>> Efectivamente, seguí el ejemplo de wordclouds, y al igual que
>>> anteriormente logró hacer la nube de texto, pero sólo por cada uno de
>>> los textos considerados.
>>> Tengo los dos "corpus clean" por cada uno de los informes que estoy
>>> considerando: año 2005 y 2013.
>>>
>>> >tdm05<-TermDocumentMatrix(cor.05.cl)
>>> >tdm13<-TermDocumentMatrix(cor.13.cl)
>>> > m05<-as.matrix(tdm05)
>>> > m13<-as.matrix(tdm13)
>>>  >v05 <- sort(rowSums(m05),decreasing=TRUE)
>>> > v13 <- sort(rowSums(m13),decreasing=TRUE)
>>> > df05<-data.frame(word = names(v05), freq=v05)
>>> > df13<-data.frame(word = names(v13), freq=v13)
>>> > wordcloud(df05$word,df05$freq)
>>> There were 50 or more warnings (use warnings() to see the first 50)
>>> > head(df05)
>>>                      word freq
>>> seguridad       seguridad   56
>>> ciudadana       ciudadana   40
>>> funcionarios funcionarios   33
>>> policiales     policiales   32
>>> nacional         nacional   28
>>> policial         policial   28
>>>
>>> > wordcloud(df13$word,df13$freq)
>>> There were 34 warnings (use warnings() to see them)
>>>
>>> > head(df13)
>>>                    word freq
>>> seguridad     seguridad   33
>>> homicidios   homicidios   29
>>> año                 año   27
>>> país               país   21
>>> inseguridad inseguridad   20
>>> violencia     violencia   20
>>>
>>> Como ven, puedo seguir el procedimiento hasta obtener el wordcloud por
>>> cada uno de los informes, pero no logro encontrar la manera de unir
>>> los dos documentos de manera que pueda mostrarlos comparativamente en
>>> dos wordclouds.
>>> En este sentido, he leído, y por lo que entiendo los dos documentos se
>>> unen en un solo corpus, que debería contener los dos documentos. Eso
>>> lo hice, con los informes, y efectivamente podría representar una sola
>>> ventana con el wordcloud de ambos informes.
>>> Sin embargo, cuando trato de aplicar colnames, el mensaje de error
>>> sigue siendo "length of 'dimnames' [2] not equal to array extent", es
>>> decir, como si no pudiera aplicar las columnas porque se trata de un
>>> solo documento.
>>> Entonces, solicito una vez más su valiosa ayuda en lo relacionado con
>>> lo siguiente:
>>> Después de tener ambos data.frame (año 2005 y año 2013) es que se
>>> deben unir los datos. Ahora bien, esto debe realizarse con la orden
>>> Corpus? Como dije, lo trabajé uniéndolos en esa orden y me dio el
>>> mensaje "dimnames [2] no equal to array extent en el paso de
>>> aplicación de nombres de columnas.
>>> Los uní antes, como en el siguiente ejemplo
>>>
>>> http://www.webmining.cl/2014/05/text-mining-comparacion-de-2-discursos-presidenciales-del-21-de-mayo-usando-r/
>>> y tampoco logré aplicarle colnames, ni tener la forma de matriz que se
>>> requiere para colocar los años en las columnas y las palabras contadas
>>> en las filas.
>>> Realmente he estado estudiando la herramienta R, y leído varios
>>> artículos y revisado materiales relacionados para buscar la manera,
>>> pero no logro dar con la manera de visualizar.
>>> Gracias nuevamente por la atención. Y gracias por la disposición.
>>> Cordial y atentamente,
>>>
>>>
>>>
>>>
>>>
>>> El día 25 de julio de 2014, 0:16, Alfredo David Alvarado Ríos
>>> <david.alvarado.r en gmail.com> escribió:
>>> > Buenas noches grupo. Saludos cordiales.
>>> >
>>> > He seguido en la búsqueda de una forma que me permita realizar la
>>> > comparación de dos documentos pertenecientes a los años 2005 y 2013, y
>>> > que pueda representar finalmente con wordcloud y con una table en la
>>> > que las columnas sean los años de cada informe "2005" y "2013", y las
>>> > filas sean las palabras con la frecuencia de cada una de ellas por
>>> > cada informe:
>>> >
>>> >
>>> > ----------------------------------
>>> > |                |  2005 | 2013  |
>>> > ----------------------------------
>>> > | terminos |           |           |
>>> > ----------------------------------
>>> > | terminos |           |           |
>>> > ----------------------------------
>>> >
>>> >
>>> > De manera que buscando y experimentando, adaptando de otras
>>> > experiencias logré llegar a lo siguiente:
>>> >
>>> > ##########
>>> >
>>> >>informes<-c("2013", "2005")
>>> >>pathname<-"C:/Users/d_2/Documents/Comision/PLAN de
>>> >> INSPECCIONES/Informes/"
>>> >
>>> >>TDM<-function(informes, pathname) {
>>> >  info.dir<-sprintf("%s/%s", pathname, informes)
>>> >  info.cor<-Corpus(DirSource(directory=info.dir, encoding="UTF-8"))
>>> >  info.cor.cl<-tm_map(info.cor, content_transformer(tolower))
>>> >  info.cor.cl<-tm_map(info.cor.cl, stripWhitespace)
>>> >  info.cor.cl<-tm_map(info.cor.cl,removePunctuation)
>>> >  sw<-readLines("C:/Users/d_2/Documents/StopWords.txt", encoding="UTF-8")
>>> >  sw<-iconv(enc2utf8(sw), sub = "byte")
>>> >  info.cor.cl<-tm_map(info.cor.cl, removeWords, stopwords("spanish"))
>>> >  info.tdm<-TermDocumentMatrix(info.cor.cl)
>>> >  result<-list(name = informes, tdm= info.tdm)
>>> >  }
>>> >>tdm<-lapply(informes, TDM, path = pathname)
>>> >
>>> > Resultado:
>>> >
>>> >> tdm
>>> > [[1]]
>>> > [[1]]$name
>>> > [1] "2013"
>>> > [[1]]$tdm
>>> > <<TermDocumentMatrix (terms: 1540, documents: 1)>>
>>> > Non-/sparse entries: 1540/0
>>> > Sparsity           : 0%
>>> > Maximal term length: 18
>>> > Weighting          : term frequency (tf)
>>> >
>>> > [[2]]
>>> > [[2]]$name
>>> > [1] "2005"
>>> > [[2]]$tdm
>>> > <<TermDocumentMatrix (terms: 1849, documents: 1)>>
>>> > Non-/sparse entries: 1849/0
>>> > Sparsity           : 0%
>>> > Maximal term length: 19
>>> > Weighting          : term frequency (tf)
>>> >
>>> >> str(tdm)
>>> > List of 2
>>> >  $ :List of 2
>>> >   ..$ name:  "2013"
>>> >   ..$ tdm :List of 6
>>> >   .. ..$ i       : int [1:1540] 1 2 3 4 5 6 7 8 9 10 ...
>>> >   .. ..$ j       : int [1:1540] 1 1 1 1 1 1 1 1 1 1 ...
>>> >   .. ..$ v       : num [1:1540] 1 5 8 1 1 1 1 3 1 1 ...
>>> >   .. ..$ nrow    : int 1540
>>> >   .. ..$ ncol    : int 1
>>> >   .. ..$ dimnames:List of 2
>>> >   .. .. ..$ Terms:  [1:1540] "070812" "100" "100000" "117735" ...
>>> >   .. .. ..$ Docs :  "2013_21SeguridadCiudadana.txt"
>>> >   .. ..- attr(*, "class")=  [1:2] "TermDocumentMatrix"
>>> > "simple_triplet_matrix"
>>> >   .. ..- attr(*, "weighting")=  [1:2] "term frequency" "tf"
>>> >  $ :List of 2
>>> >   ..$ name:  "2005"
>>> >   ..$ tdm :List of 6
>>> >   .. ..$ i       : int [1:1849] 1 2 3 4 5 6 7 8 9 10 ...
>>> >   .. ..$ j       : int [1:1849] 1 1 1 1 1 1 1 1 1 1 ...
>>> >   .. ..$ v       : num [1:1849] 1 1 1 1 1 1 1 1 1 1 ...
>>> >   .. ..$ nrow    : int 1849
>>> >   .. ..$ ncol    : int 1
>>> >   .. ..$ dimnames:List of 2
>>> >   .. .. ..$ Terms:  [1:1849] "071004" "100000" "101005" "1022" ...
>>> >   .. .. ..$ Docs :  "05_seguridad_ciudadana.txt"
>>> >   .. ..- attr(*, "class")=  [1:2] "TermDocumentMatrix"
>>> > "simple_triplet_matrix"
>>> >   .. ..- attr(*, "weighting")=  [1:2] "term frequency" "tf"
>>> >>
>>> >>m<-as.matrix(tdm)
>>> >
>>> > ########
>>> >
>>> > Al probar str(tdm), se obtiene lo siguiente:
>>> >
>>> > List of 2
>>> >  $ :List of 2
>>> >   ..$ name: chr "2013"
>>> >   ..$ tdm :List of 6
>>> >   .. ..$ i       : int [1:1540] 1 2 3 4 5 6 7 8 9 10 ...
>>> >   .. ..$ j       : int [1:1540] 1 1 1 1 1 1 1 1 1 1 ...
>>> >   .. ..$ v       : num [1:1540] 1 5 8 1 1 1 1 3 1 1 ...
>>> >   .. ..$ nrow    : int 1540
>>> >   .. ..$ ncol    : int 1
>>> >   .. ..$ dimnames:List of 2
>>> >   .. .. ..$ Terms: chr [1:1540] "070812" "100" "100000" "117735" ...
>>> >   .. .. ..$ Docs : chr "2013_21SeguridadCiudadana.txt"
>>> >   .. ..- attr(*, "class")= chr [1:2] "TermDocumentMatrix"
>>> > "simple_triplet_matrix"
>>> >   .. ..- attr(*, "weighting")= chr [1:2] "term frequency" "tf"
>>> >  $ :List of 2
>>> >   ..$ name: chr "2005"
>>> >   ..$ tdm :List of 6
>>> >   .. ..$ i       : int [1:1849] 1 2 3 4 5 6 7 8 9 10 ...
>>> >   .. ..$ j       : int [1:1849] 1 1 1 1 1 1 1 1 1 1 ...
>>> >   .. ..$ v       : num [1:1849] 1 1 1 1 1 1 1 1 1 1 ...
>>> >   .. ..$ nrow    : int 1849
>>> >   .. ..$ ncol    : int 1
>>> >   .. ..$ dimnames:List of 2
>>> >   .. .. ..$ Terms: chr [1:1849] "071004" "100000" "101005" "1022" ...
>>> >   .. .. ..$ Docs : chr "05_seguridad_ciudadana.txt"
>>> >   .. ..- attr(*, "class")= chr [1:2] "TermDocumentMatrix"
>>> > "simple_triplet_matrix"
>>> >   .. ..- attr(*, "weighting")= chr [1:2] "term frequency" "tf"
>>> >  - attr(*, "dim")= int [1:2] 2 1
>>> >
>>> >
>>> >> m<-as.matrix(tdm)
>>> >
>>> >> m
>>> >      [,1]
>>> > [1,] List,2
>>> > [2,] List,2
>>> >
>>> >
>>> >  #######
>>> >
>>> >  Pero no logro poder avanzar en los pasos para tener la comparativa de
>>> > palabras por años par avanzar en una visualización de wordcloud.
>>> > Si alguien se le ocurre alguna idea, agradecería mucho la ayuda.
>>>
>>> _______________________________________________
>>> R-help-es mailing list
>>> R-help-es en r-project.org
>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>>
>>
>>
>> --
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es