Alfredo David Alvarado Ríos
2014-Jul-29 23:13 UTC
[R-es] wordcloud y tabla de palabras [Avanzando]
Buenas tardes grupo. Saludos cordiales Carlos J., muchas gracias por
tu orientación. Efectivamente, me había dado cuenta que la razón por
la que no se aplicaba colnames era porque no tenía columnas. La
cuestión es que no logro visualizar completamente/claramente en qué
parte del proceso de creación del corpus se puede hacer.
Sin embargo, siguiendo el ejemplo de
http://biostat.jhsph.edu/~jleek/code/sotu2011-2012comparison.R
(proporcionado por Carlos O.), y las orientaciones que me han brindado
he podido seguir avanzando en el proceso de crear wordclouds para dos
informes de 2 años diferentes.
Versión R: 3.1.1
require(tm)
require(wordcloud)
require(Rcpp)
tmpinformes<-data.frame(c("todo el informe 2005", "todo el
informe
2013"), row.names=c("2005", "2013"))
ds<- DataframeSource(tmpText)
ds<- DataframeSource(tmpinformes)
corp = Corpus(ds)
corp = tm_map(corp,removePunctuation)
corp = tm_map(corp,content_transformer(tolower))
corp = tm_map(corp,removeNumbers)
corp = tm_map(corp, stripWhitespace)
corp = tm_map(corp, removeWords, sw)
corp = tm_map(corp, removeWords, stopwords("spanish"))
term.matrix<- TermDocumentMatrix(corp)
term.matrix<- as.matrix(term.matrix)
colnames(term.matrix) <- c("Año2005","Año2013")
png(file="Org2005vs2013.png",height=600,width=1200)
par(mfrow=c(1,2))
comparison.cloud(term.matrix,max.words=300,random.order=FALSE,colors=c("#1F497D","#C0504D"),main="Differences
Between Org 2005/2013")
commonality.cloud(term.matrix,random.order=FALSE,color="#F79646")
dev.off()
"todo el informe 2005" y "todo el informe 2013" es todo el
informe
copiado en la ventana "script" de Rgui.Son dos informes que tengo el
directorio por defecto. También tuve que trabajar el texto plano de
manera que no tuviera ninguna comilla para poder hacer
c("informe2005", "informe2013") de manera que la combinación
estuviera
bien delimitada en los dos documentos que empiezan y terminan con ".
El .png que se creó en el directorio por defecto de R contiene tal
como el del ejemplo de la página web citada más arriba, una nube
comparativa de los dos años diferenciada por colores, y una al lado en
la cual aparecen las coincidencias.
Ahora bien, la pregunta que tengo es si es posible realizar el
procedimiento con muchos más años, en el ejercicio que me propongo 10
años en un solo corpus que puedan tenerse en 10 wordclouds para
realizar la comparación. Me gustaría que fuera una ventana por
wordcloud, y no una sola con varios años.
Gracias nuevamente a todos.
El día 29 de julio de 2014, 13:19, Carlos J. Gil Bellosta
<cgb en datanalytics.com> escribió:> 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
Hola, Bueno, pues parece que finalmente te salió... Si ahora lo que quieres es trabajar sobre 10 informes/ficheros diferentes pero de forma individual, pues casi es más fácil que lo anterior. Prueba a hacerlo con uno sólo y luego extiendes la idea (con un simple bucle) para el resto. La diferencia fundamental frente a lo que has hecho en esta ocasión es que en vez de copiar/pegar el fichero en la consola tendrás que leer el fichero desde R. Prueba entonces con estos dos textos que has comparado ya. Graba cada uno en un fichero y prueba a leer el primero, a limpiarle de caracteres extraños, tenerle en el encoding adecuado y hacer un wordcloud. En cuanto lo consigas, vemos lo del bucle para procesar el primero y el segundo fichero de forma secuencial. Incluso podrás si quieres poner todos los worclouds juntos en una imagen en vez de generarles de forma individual. Saludos, Carlos Ortega www.qualityexcellence.es El 30 de julio de 2014, 1:13, Alfredo David Alvarado Ríos < david.alvarado.r@gmail.com> escribió:> Buenas tardes grupo. Saludos cordiales Carlos J., muchas gracias por > tu orientación. Efectivamente, me había dado cuenta que la razón por > la que no se aplicaba colnames era porque no tenía columnas. La > cuestión es que no logro visualizar completamente/claramente en qué > parte del proceso de creación del corpus se puede hacer. > Sin embargo, siguiendo el ejemplo de > http://biostat.jhsph.edu/~jleek/code/sotu2011-2012comparison.R > (proporcionado por Carlos O.), y las orientaciones que me han brindado > he podido seguir avanzando en el proceso de crear wordclouds para dos > informes de 2 años diferentes. > > Versión R: 3.1.1 > require(tm) > require(wordcloud) > require(Rcpp) > > > tmpinformes<-data.frame(c("todo el informe 2005", "todo el informe > 2013"), row.names=c("2005", "2013")) > ds<- DataframeSource(tmpText) > ds<- DataframeSource(tmpinformes) > corp = Corpus(ds) > corp = tm_map(corp,removePunctuation) > corp = tm_map(corp,content_transformer(tolower)) > corp = tm_map(corp,removeNumbers) > corp = tm_map(corp, stripWhitespace) > corp = tm_map(corp, removeWords, sw) > corp = tm_map(corp, removeWords, stopwords("spanish")) > term.matrix<- TermDocumentMatrix(corp) > term.matrix<- as.matrix(term.matrix) > colnames(term.matrix) <- c("Año2005","Año2013") > png(file="Org2005vs2013.png",height=600,width=1200) > par(mfrow=c(1,2)) > > comparison.cloud(term.matrix,max.words=300,random.order=FALSE,colors=c("#1F497D","#C0504D"),main="Differences > Between Org 2005/2013") > commonality.cloud(term.matrix,random.order=FALSE,color="#F79646") > dev.off() > > "todo el informe 2005" y "todo el informe 2013" es todo el informe > copiado en la ventana "script" de Rgui.Son dos informes que tengo el > directorio por defecto. También tuve que trabajar el texto plano de > manera que no tuviera ninguna comilla para poder hacer > c("informe2005", "informe2013") de manera que la combinación estuviera > bien delimitada en los dos documentos que empiezan y terminan con ". > > El .png que se creó en el directorio por defecto de R contiene tal > como el del ejemplo de la página web citada más arriba, una nube > comparativa de los dos años diferenciada por colores, y una al lado en > la cual aparecen las coincidencias. > > Ahora bien, la pregunta que tengo es si es posible realizar el > procedimiento con muchos más años, en el ejercicio que me propongo 10 > años en un solo corpus que puedan tenerse en 10 wordclouds para > realizar la comparación. Me gustaría que fuera una ventana por > wordcloud, y no una sola con varios años. > Gracias nuevamente a todos. > > > > > > El día 29 de julio de 2014, 13:19, Carlos J. Gil Bellosta > <cgb@datanalytics.com> escribió: > > 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@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@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@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@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@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@r-project.org > >> https://stat.ethz.ch/mailman/listinfo/r-help-es > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Buenas tardes grupo. Saludos cordiales a todos.
Nuevamente muchas gracias Carlos O. por tus orientaciones y atención.
Siguiendo tu sugerencia, acá copio los dos documentos trabajados como
me dijiste, con las dos wordclouds individuales. Efectivamente, logré
hacerlas, y hasta experimenté un poco con barplot, pero todavía no
copio el ejemplo porque no lo tengo del todo "bajo control". Sin
embargo, hasta las nubes de palabras, y por ejemplo los comandos los
corrí:
1) >findFreqTerms(tdm2, lowfreq=15)
2) >findAssocs(tdm2, "casos", 0.50)
3) >d<-tm_map(d,removeWords, c("registrados",
"número", "respectivamente"))
También los corrí con sus respectivos resultados.
Esta es la forma cómo hice el trabajo para cada fichero individualmente:
########### 1er Documento ######################
>
informe1<-readLines("./DIRECTORIO/Informes/2005/2005_21SeguridadCiudadana.txt",
encoding="UTF-8")
>informe1<-iconv(enc2utf-8(informe1), sub = ?byte?)
>corpus<-Corpus(VectorSource(informe1))
> d<-tm_map(corpus, content_transformer(tolower))
> d<-tm_map(d, stripWhitespace)
> d<-tm_map(d, removePunctuation)
> d<-tm_map(d, removeWords, sw)
> d<-tm_map(d, removeWords, stopwords("spanish"))
> d<-tm_map(d, removeNumbers)
> tdm1<-TermDocumentMatrix(d)
>m<-as.matrix(tdm1)
>v<- sort(rowSums(m), decreasing=TRUE)
>df<-data.frame(word = names(v), freq=v)
> png(file="Ejemplo2005.png",height=600,width=1200)
> wordcloud(df$word,df$freq,min.freq=20)
> dev.off()
######### 2do documento #########
>
informe2<-readLines("./DIRECTORIO/Informes/2013/2013_21SeguridadCiudadana.txt",
encoding="UTF-8")
>informe1<-iconv(enc2utf-8(informe1), sub = ?byte?)
>corpus<-Corpus(VectorSource(informe1))
> d2<-tm_map(corpus2, content_transformer(tolower))
> d2<-tm_map(d2, stripWhitespace)
> d2<-tm_map(d2, removePunctuation)
> d2<-tm_map(d2, removeWords, sw)
> d2<-tm_map(d2, removeWords, stopwords("spanish"))
> d2<-tm_map(d, removeNumbers)
> tdm2<-TermDocumentMatrix(d2)
>m2<-as.matrix(tdm2)
>v<- sort(rowSums(m2), decreasing=TRUE)
>df2<-data.frame(word = names(v), freq=v)
> png(file="Ejemplo2013.png",height=600,width=1200)
> wordcloud(df2$word,df2$freq,min.freq=20)
> dev.off()
#################################
En este punto, hechas las dos wordclouds individuales (empezaré a
trabajar los ficheros de texto plano para el resto de los años,
entonces tengo dos interrogantes:
*** La primera: de acuerdo con el comentario de Carlos O. esta es la
base para el próximo paso, que es generar un bucle con todas las
wordclouds realizadas. ¿Se realiza con lapply?
*** La segunda: es una pregunta que me surge porque si cargo/copio/ el
fichero en R (convertirlo en objeto)>
informe1<-readLines("./DIRECTORIO/Informes/2005/2005_21SeguridadCiudadana.txt",
encoding="UTF-8")
>informe1<-iconv(enc2utf-8(informe1), sub = ?byte?)
>
informe2<-readLines("./DIRECTORIO/Informes/2013/2013_21SeguridadCiudadana.txt",
encoding="UTF-8")
>informe2<-iconv(enc2utf-8(informe2), sub = ?byte?)
Y luego trato de seguir la misma lógica que cuando copié ayer todo el
documento en la ventana de script de Rgui y lo corrí (sólo que no está
todo el texto entre "", sino los dos objetos cargados en texto plano
en la memoria de R):
>tmpinformes<-data.frame(c(informe1, informe2),
row.names=c("2005", "2013"))
El resultado es:
>Error in data.frame(c(informe1, informe2), row.names = c("2005",
"2013")) :
row names supplied are of the wrong length
Lap regunta que me hago, es ¿por qué sólo funciona con todo el texto
copiado, y no con los objetos creados, con los cuales se hicieron las
wordclouds de forma individual?
Nuevamente agradecido por lo que me puedan orientar/ilustrar para
poder hacer el bucle con los períodos que quiero considerar para el
análisis.
El día 30 de julio de 2014, 3:34, Carlos Ortega
<cof en qualityexcellence.es> escribió:> Hola,
>
> Bueno, pues parece que finalmente te salió...
> Si ahora lo que quieres es trabajar sobre 10 informes/ficheros diferentes
> pero de forma individual, pues casi es más fácil que lo anterior.
>
> Prueba a hacerlo con uno sólo y luego extiendes la idea (con un simple
> bucle) para el resto.
>
> La diferencia fundamental frente a lo que has hecho en esta ocasión es que
> en vez de copiar/pegar el fichero en la consola tendrás que leer el fichero
> desde R.
>
> Prueba entonces con estos dos textos que has comparado ya. Graba cada uno
en
> un fichero y prueba a leer el primero, a limpiarle de caracteres extraños,
> tenerle en el encoding adecuado y hacer un wordcloud. En cuanto lo
consigas,
> vemos lo del bucle para procesar el primero y el segundo fichero de forma
> secuencial. Incluso podrás si quieres poner todos los worclouds juntos en
> una imagen en vez de generarles de forma individual.
>
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>
>
>
> El 30 de julio de 2014, 1:13, Alfredo David Alvarado Ríos
> <david.alvarado.r en gmail.com> escribió:
>
>> Buenas tardes grupo. Saludos cordiales Carlos J., muchas gracias por
>> tu orientación. Efectivamente, me había dado cuenta que la razón por
>> la que no se aplicaba colnames era porque no tenía columnas. La
>> cuestión es que no logro visualizar completamente/claramente en qué
>> parte del proceso de creación del corpus se puede hacer.
>> Sin embargo, siguiendo el ejemplo de
>> http://biostat.jhsph.edu/~jleek/code/sotu2011-2012comparison.R
>> (proporcionado por Carlos O.), y las orientaciones que me han brindado
>> he podido seguir avanzando en el proceso de crear wordclouds para dos
>> informes de 2 años diferentes.
>>
>> Versión R: 3.1.1
>> require(tm)
>> require(wordcloud)
>> require(Rcpp)
>>
>>
>> tmpinformes<-data.frame(c("todo el informe 2005",
"todo el informe
>> 2013"), row.names=c("2005", "2013"))
>> ds<- DataframeSource(tmpText)
>> ds<- DataframeSource(tmpinformes)
>> corp = Corpus(ds)
>> corp = tm_map(corp,removePunctuation)
>> corp = tm_map(corp,content_transformer(tolower))
>> corp = tm_map(corp,removeNumbers)
>> corp = tm_map(corp, stripWhitespace)
>> corp = tm_map(corp, removeWords, sw)
>> corp = tm_map(corp, removeWords, stopwords("spanish"))
>> term.matrix<- TermDocumentMatrix(corp)
>> term.matrix<- as.matrix(term.matrix)
>> colnames(term.matrix) <- c("Año2005","Año2013")
>> png(file="Org2005vs2013.png",height=600,width=1200)
>> par(mfrow=c(1,2))
>>
>>
comparison.cloud(term.matrix,max.words=300,random.order=FALSE,colors=c("#1F497D","#C0504D"),main="Differences
>> Between Org 2005/2013")
>>
commonality.cloud(term.matrix,random.order=FALSE,color="#F79646")
>> dev.off()
>>
>> "todo el informe 2005" y "todo el informe 2013" es
todo el informe
>> copiado en la ventana "script" de Rgui.Son dos informes que
tengo el
>> directorio por defecto. También tuve que trabajar el texto plano de
>> manera que no tuviera ninguna comilla para poder hacer
>> c("informe2005", "informe2013") de manera que la
combinación estuviera
>> bien delimitada en los dos documentos que empiezan y terminan con
".
>>
>> El .png que se creó en el directorio por defecto de R contiene tal
>> como el del ejemplo de la página web citada más arriba, una nube
>> comparativa de los dos años diferenciada por colores, y una al lado en
>> la cual aparecen las coincidencias.
>>
>> Ahora bien, la pregunta que tengo es si es posible realizar el
>> procedimiento con muchos más años, en el ejercicio que me propongo 10
>> años en un solo corpus que puedan tenerse en 10 wordclouds para
>> realizar la comparación. Me gustaría que fuera una ventana por
>> wordcloud, y no una sola con varios años.
>> Gracias nuevamente a todos.
>>
>>
>>
>>
>>
>> El día 29 de julio de 2014, 13:19, Carlos J. Gil Bellosta
>> <cgb en datanalytics.com> escribió:
>> > 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
>>
>> _______________________________________________
>> 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