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)
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)
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)
[[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)
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"
########
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
[,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.