La minería de texto (TM) es el proceso de extraer información útil, patrones o conocimiento de textos no estructurados.
Consta de 3 etapas:
library(tidyverse) # (data wrangling) manejo de tablas, aplicar filtros, hacer resumen
library(tesseract) # Generar OCR
library(magick) # Trabajar con imagenes de formato "PNG"
library(officer) # Exportar a formatos "Office" (word, powerpoint, etc)
library(pdftools) # Trabajar con PDF's
library(purrr) # Para la función map, (no funcion para hacer mapas)
library(tm) # Text Mining
library(RColorBrewer) # Manejar Colores
library(wordcloud) # Nubes de palabras
library(topicmodels) # Modelos de temas
library(ggplot2) # gráficas
imagen1 <- image_read("/Users/marcelotam/Desktop/concentracion AI/M2/imagen1.PNG")
texto1 <- ocr(imagen1)
doc1 <- read_docx() # Crea un documento de Word en blanco.
doc1 <- doc1 %>% body_add_par(texto1, style = "Normal") # Pega el texto en el word
#print(doc1, target = "texto1.docx") # Guarda el word en la computadora
imagen2 <- image_read("/Users/marcelotam/Desktop/concentracion AI/M2/imagen2.PNG")
tesseract_download("spa")
## [1] "/Users/marcelotam/Library/Application Support/tesseract5/tessdata/spa.traineddata"
texto2 <- ocr(imagen2, engine = tesseract("spa"))
texto2
## [1] "Un importante, y quizá controversial, asunto político es el que se refiere al efecto del salario mínimo sobre\nlas tasas de desempleo en diversos grupos de trabajadores. Aunque este problema puede ser estudiado con\ndiversos tipos de datos (corte transversal, series de tiempo o datos de panel), suelen usarse las series de\ntiempo para observar los efectos agregados. En la tabla 1.3 se presenta un ejemplo de una base de datos\nde series de tiempo sobre tasas de desempleo y salarios mínimos.\n"
doc2 <- read_docx() # Crea un documento de Word en blanco.
doc2 <- doc2 %>% body_add_par(texto2, style = "Normal") # Pega el texto en el word
#print(doc2, target = "texto1.docx") # Guarda el word en la computadora
#pdf1 <- pdf_convert("/Users/marcelotam/Desktop/concentracion AI/M2/pdf1.pdf", dpi = 600) %>% map(ocr)
#eso_pags <- pdf_convert("/Users/marcelotam/Desktop/concentracion AI/M2/eso3.pdf", dpi = 600) %>% map(ocr)
# repetir pasos previos para convertir imágenes a texto en WORD
it1 <- image_read("/Users/marcelotam/Desktop/concentracion AI/M2/eso3_1.png")
it2 <- image_read("/Users/marcelotam/Desktop/concentracion AI/M2/eso3_2.png")
it3 <- image_read("/Users/marcelotam/Desktop/concentracion AI/M2/eso3_3.png")
tesseract_download("spa")
## [1] "/Users/marcelotam/Library/Application Support/tesseract5/tessdata/spa.traineddata"
it_1 <- ocr(it1, engine = tesseract("spa"))
it_2 <- ocr(it2, engine = tesseract("spa"))
it_3 <- ocr(it3, engine = tesseract("spa"))
eso_word <- read_docx() # Crea un documento de Word en blanco.
eso_word <- eso_word %>% body_add_par(it_1, style = "Normal") %>% body_add_par(it_2, style = "Normal") %>% body_add_par(it_3, style = "Normal") # Pega el texto en el word
# print(eso_word, target = "eso.docx") # Guarda el word en la computadora
text <- readLines("http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt") # Traer texto de internet
corpus <- Corpus(VectorSource(text)) # Pone cada renglón en una celda de vector
#inspect(corpus) # inspeccionar el texto
corpus <- tm_map(corpus, content_transformer(tolower)) # Pone todo en minúsculas
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
corpus <- tm_map(corpus, removePunctuation) # Elimina puntuación
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
corpus <- tm_map(corpus, removeNumbers) # Elimina números
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
#inspect(corpus)
corpus <- tm_map(corpus, removeWords, stopwords("en")) # Elimina palabras que no hablan del tema
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
# corpus <- tm_map(corpus, removeWords, c("palabra","palabra")) # Elimina palabras específicas
# inspect(corpus) # para ir revisando los cambios
tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm) # Cuenta las veces que aparece cada palabra por reglón
frecuencia <- sort(rowSums(m), decreasing = TRUE) # Cuenta la frecuencia de cada palabra en el texto completo
frecuencia_df <- data.frame(word=names(frecuencia), freq=frecuencia)
frecuencia_df # Convierte la frecuencia en un data frame
## word freq
## will will 17
## freedom freedom 13
## ring ring 12
## dream dream 11
## day day 11
## let let 11
## every every 9
## one one 8
## able able 8
## together together 7
## nation nation 4
## mountain mountain 4
## shall shall 4
## faith faith 4
## free free 4
## today today 3
## men men 3
## state state 3
## children children 3
## little little 3
## black black 3
## white white 3
## made made 3
## god god 3
## new new 3
## sing sing 3
## land land 3
## last last 3
## even even 2
## live live 2
## meaning meaning 2
## true true 2
## brotherhood brotherhood 2
## former former 2
## georgia georgia 2
## sons sons 2
## heat heat 2
## mississippi mississippi 2
## sweltering sweltering 2
## alabama alabama 2
## boys boys 2
## girls girls 2
## hands hands 2
## join join 2
## words words 2
## hill hill 2
## places places 2
## hope hope 2
## stone stone 2
## thee thee 2
## mountainside mountainside 2
## american american 1
## deeply deeply 1
## difficulties difficulties 1
## face face 1
## rooted rooted 1
## still still 1
## though though 1
## tomorrow tomorrow 1
## creed creed 1
## rise rise 1
## created created 1
## equal equal 1
## hold hold 1
## selfevident selfevident 1
## truths truths 1
## hills hills 1
## owners owners 1
## red red 1
## sit sit 1
## slave slave 1
## slaves slaves 1
## table table 1
## injustice injustice 1
## justice justice 1
## oasis oasis 1
## oppression oppression 1
## transformed transformed 1
## character character 1
## color color 1
## content content 1
## four four 1
## judged judged 1
## skin skin 1
## brothers brothers 1
## dripping dripping 1
## governor governor 1
## interposition interposition 1
## lips lips 1
## nullification nullification 1
## racists racists 1
## right right 1
## sisters sisters 1
## vicious vicious 1
## crooked crooked 1
## exalted exalted 1
## flesh flesh 1
## glory glory 1
## lord lord 1
## low low 1
## plain plain 1
## revealed revealed 1
## rough rough 1
## see see 1
## straight straight 1
## valley valley 1
## back back 1
## south south 1
## beautiful beautiful 1
## despair despair 1
## discords discords 1
## hew hew 1
## jail jail 1
## jangling jangling 1
## knowing knowing 1
## pray pray 1
## stand stand 1
## struggle struggle 1
## symphony symphony 1
## transform transform 1
## work work 1
## country country 1
## liberty liberty 1
## sweet sweet 1
## tis tis 1
## died died 1
## fathers fathers 1
## pilgrim pilgrim 1
## pride pride 1
## america america 1
## become become 1
## great great 1
## must must 1
## hampshire hampshire 1
## hilltops hilltops 1
## prodigious prodigious 1
## mighty mighty 1
## mountains mountains 1
## york york 1
## alleghenies alleghenies 1
## heightening heightening 1
## pennsylvania pennsylvania 1
## colorado colorado 1
## rockies rockies 1
## snowcapped snowcapped 1
## california california 1
## curvaceous curvaceous 1
## slopes slopes 1
## lookout lookout 1
## tennessee tennessee 1
## molehill molehill 1
## allow allow 1
## catholics catholics 1
## city city 1
## gentiles gentiles 1
## hamlet hamlet 1
## happens happens 1
## jews jews 1
## negro negro 1
## old old 1
## protestants protestants 1
## speed speed 1
## spiritual spiritual 1
## village village 1
## almighty almighty 1
## thank thank 1
ggplot(head(frecuencia_df, 10), aes(x=reorder(word, -freq), y=freq)) +
geom_bar(stat= "identity", fill= "lightblue") +
geom_text(aes(label= freq), vjust = -0.5) +
labs(title = "Top 10 palabras más frecuentes", subtitle = "Discurso 'I have a Dream' de M. L. King", x = "Palabra", y="Frecuencia") +
ylim(0,20)
# Eñ procedimiento de datos antes de la nube de palabras es igual que en el Análoisis de Frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, min.freq = 1, random.order = FALSE, colors = brewer.pal(8, "OrRd"))
#tmaptools::palette_explorer()
# https://r-graph-gallery.com/38-rcolorbrewers-palettes.html paleta de colores de brewer pal
text_eso <- readLines("/Users/marcelotam/Desktop/concentracion AI/M2/it.txt")
corpus2 <- Corpus(VectorSource(text_eso))
corpus2 <- tm_map(corpus2, content_transformer(tolower))
corpus2 <- tm_map(corpus2, removePunctuation)
corpus2 <- tm_map(corpus2, removeNumbers)
corpus2 <- tm_map(corpus2, removeWords, stopwords("spanish"))
inspect(corpus2) # para ir revisando los cambios
## <<SimpleCorpus>>
## Metadata: corpus specific: 1, document level (indexed): 0
## Content: documents: 154
##
## [1] alli persiguiendo barco papel lado izquierdo witcham street corría
## [2] deprisa agua ganaba barquito sacando ventaja oyó rugido profundo
## [3] vio cómo cincuenta metros adelante colina abajo agua cuneta precipitaba
## [4] dentro boca tormenta aún continuaba abierta largo semicirculo oscuro
## [5] abierto bordillo acera mientras george miraba rama desgarrada corteza
## [6] oscura reluciente hundió aquellas fauces allí pendió momento luego deslizó
## [7] hacia interior hacia allí encaminaba bote
## [8]
## [9] — ¡mierda —chilló horrorizado
## [10]
## [11] forzó paso momento pareció iba alcanzar barquito ples
## [12] resbaló george cayo despatarrado despellejándose rodilla grito dolor
## [13] nueva perspectiva altura pavimento vio barco giraba redondo dos veces
## [14] momentáneamente atrapado remolino desaparecer
## [15]
## [16] —¡mierda mierda —volvió chillar estrellando puño pavimento
## [17]
## [18] dolió echó sollozar ¡ manera tan estupida perder barco
## [19]
## [20] levantó caminar hacia boca tormenta allí dejó caer rodillas mirar hacia
## [21] interior agua hacía ruido hueco húmedo caer oscuridad sonido daba
## [22] escalofrios hacía pensar
## [23]
## [24] —¡eh
## [25]
## [26] exclamación arrancada cordel retrocedioó
## [27]
## [28] allí adentro ojos amarillos tipo ojos siempre imaginaba verlos
## [29] nunca oscuridad sótano animal —penso incoherente— animal
## [30] mejor gato quedó atrapado
## [31]
## [32] modos echar correr habria corrido dos segundos
## [33] tablero mental hecho cargo espanto produjeron dos ojos amarillos
## [34] brillantes sintió áspera superficie pavimento bajo dedos fina lámina agua fría
## [35] corría alrededor vio mismo levantándose retrocediendo entonces
## [36] voz voz perfectamente razonable bastante simpática habló dentro
## [37] boca tormenta
## [38]
## [39] —hola george —dijo
## [40]
## [41] george parpadeo volvió mirar apenas podía dar crédito vela sacado
## [42] cuento película sabe animales hablan bailan si
## [43] diez años habria creido viendo tenia dieciséis años sino
## [44] seis
## [45]
## [46] boca tormenta habia payaso luz distaba ser buena bastó
## [47] george denbrough seguro vela payaso circo tele
## [48] parecia mezcla bozo clarabell hablaba haciendo sonar bocina howdy
## [49] doody sábados mañana búfalo bob único entendía clarabell
## [50] siempre hacia reir george cara payaso metido boca tormenta blanca tenia
## [51] cómicos mechones pelo rojo cada lado calva gran sonrisa payaso pintada
## [52]
## [53] alrededor boca si george vivido años después habria pensado ronald
## [54] mcdonald bozo clarabell
## [55]
## [56] payaso mano manojo globos colores tentadora fruta
## [57] madura
## [58]
## [59] barquito papel george
## [60]
## [61] —¿quieres barquito georgie — payaso sonrela
## [62]
## [63] george sonrió podía evitarlo aquella sonrisa tipo devuelve
## [64] querer
## [65]
## [66] — supuesto
## [67]
## [68] payaso echó reir
## [69]
## [70] —« supuesto» ¡así gusta ¡así gusta ¿ globo ¿ parece ¿quieres globo”
## [71] —bueno supuesto —alargó mano inmediato retiró voluntad—
## [72] debo coger ofrezca desconocido dice papá
## [73]
## [74] — papa mucha razón —replicó payaso boca tormenta sonriendo george
## [75] preguntó cómo podia haber creido ojos amarillos si color azul brillante
## [76] bailarin ojos mamá bill — muchísima razón creo voy
## [77] presentarme george señor bob gray conocido pennywise payaso
## [78] ballarin pennywise presento george denbrough george presento pennywise ahora
## [79] conocemos desconocido tampoco ¿correcto
## [80]
## [81] george soltó risita
## [82]
## [83] —correcto —volvió estirar mano retirarla— ¿cómo metiste alli adentro
## [84]
## [85] — tormenta trajo volaaaando —dijo pennywise payaso bailarin— llevó circo
## [86] ¿ sientes olor circo george
## [87]
## [88] george inclinó hacia adelante ¡ pronto olía cacahuetes ¡cacahuetes tostados ¡ vinagre
## [89] blanco pone patatas fritas agujero tapa olía algodón
## [90] azucar buñuelos leve poderosamente estiercol animales salvajes olia
## [91] aroma regocijante aserrin embargo
## [92]
## [93] embargo bajo olía inundación hojas deshechas oscuras sombras bocas
## [94] tormenta olor húmedo putrido olor sótano
## [95]
## [96] olores fuertes
## [97]
## [98] —claro huelo —dlijo
## [99]
## [100] —¿quieres barquito george —preguntó pennywise— pregunto vez
## [101] pareces desearlo
## [102]
## [103] mostró alto sonriendo llevaba traje seda abolsado grandes botones color
## [104] naranja corbata brillante color azul eléctrico derramaba pechera
## [105] manos llevaba grandes guantes blancos mickey donald
## [106]
## [107] —si claro —dijo george mirando dentro boca tormenta
## [108]
## [109] —¿ globo rojos verdes amarillos azules
## [110]
## [111] —¿flotan
## [112]
## [113] —¿ si flotan — sonrisa payaso acentuó— oh claro ¡flotan
## [114] algodón azucar
## [115]
## [116] george estiró mano
## [117]
## [118] payaso sujeto brazo
## [119]
## [120] entonces george vio cómo cara payaso cambiaba
## [121]
## [122] vio entonces tan terrible peor imaginado cosa sótano
## [123] parecía dulce sueño vio destruyó cordura zarpazo
## [124]
## [125] —flotan —croó cosa alcantarilla voz reía coágulos
## [126]
## [127] sujetaba brazo george puño grueso agusanado tiró hacia horrible
## [128] oscuridad agua corría rugía aullaba llevando hacia mar desechos
## [129] tormenta george estiró cuello apartarse negrura definitiva empezó gritar hacia
## [130] lluvia gritar loco hacia gris cielo otoñal curvaba derry aquel día
## [131] otoño gritos agudos penetrantes largo toda calle gente
## [132] asomó ventanas lanzó porches
## [133]
## [134] —flotan —gruñó cosa— flotan georgie aqui abajo conmigo
## [135] flotarás
## [136]
## [137] hombro george clavó cemento bordillo dave gardener día
## [138] habia ido trabajar shoeboat debido inundación vio sólo niño impermeable
## [139] amarillo niño gritaba retorcia arroyo mientras agua lodosa corría
## [140] cara haciendo alaridos sonaran burbujeantes
## [141]
## [142] —aqui abajo flota —susurró voz podrida riendo pronto sonó desgarro
## [143] destello agonía george denbrough supo
## [144]
## [145] dave gardener primero llegar aunque llegó sólo cuarenta cinco segundos después
## [146] primer grito george denbrough habia muerto gardener agarró impermeable tiró
## [147] sacarlo calle girar manos cuerpo george empezó
## [148] gritar lado izquierdo impermeable niño rojo intenso sangre fluía hacia
## [149] alcantarilla agujero brazo izquierdo trozo hueso
## [150] horriblemente brillante asomaba tela rota
## [151]
## [152] ojos niño miraban fijamente cielo gris mientras dave retrocedía tropezones hacia
## [153] corrian calle empezaron llenarse lluvia
## [154]
corpus2 <- tm_map(corpus2, removeWords, c("!","¡","¿","-"))
tdm2 <- TermDocumentMatrix(corpus2)
m2 <- as.matrix(tdm2)
frecuencia_eso <- sort(rowSums(m2), decreasing = TRUE)
frecuenciaeso_df <- data.frame(word=names(frecuencia_eso), freq=frecuencia_eso)
frecuenciaeso_df <- frecuenciaeso_df[-7, ]
ggplot(head(frecuenciaeso_df, 10), aes(x=reorder(word, -freq), y=freq)) +
geom_bar(stat= "identity", fill= "lightyellow") +
geom_text(aes(label= freq), vjust = -0.5) +
labs(title = "Top 10 palabras más frecuentes", subtitle = "Pedazo Novela IT", x = "Palabra", y="Frecuencia")
set.seed(123)
wordcloud(words = frecuenciaeso_df$word, freq = frecuenciaeso_df$freq, min.freq = 3, random.order = FALSE, colors = brewer.pal(8, "Spectral"))