La minería de texto (TM) es el proceso de extraer información útil, patrones o conocimiento de textos no estructurados.
Consta de tres etapas: 1. Obtener datos: El reconocimiento óptico de
caracteres (OCR) es un tecnologia que permite convertir imágenes de
texto en texto editable.También es conocido como extracción de
texto de imágenes.
2. Explorar datos: Representación gráfica o visal de los datos para su
interpretación. Los métodos más comunes son el Análisis de Sentimientos,
la Nube de Palabras y el Topic Modeling.
3. Análisis predictivo: Son las técnicas y modelo estadísticos para
predecir resultados futuros. Los modelos más usados son el Random
Forest, redes neuronales y regresiones.
#install.packages("tidyverse") #manejo, extraer, resumir tablas
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#install.packages("tesseract") #OCR - saca el texto de imagenes
library(tesseract)
#install.packages("magick") #PNG
library(magick)
## Linking to ImageMagick 6.9.10.23
## Enabled features: fontconfig, freetype, fftw, lcms, pango, webp, x11
## Disabled features: cairo, ghostscript, heic, raw, rsvg
## Using 16 threads
#install.packages("officer") #Exportar en formatos que son de Office(word)
library(officer)
#install.packages("pdftools") #Leer PDFs
library(pdftools)
## Using poppler version 0.86.1
#install.packages("purrr") #Para la función de "map" para aplicar una función a cada elemento de un vector
library(purrr)
#install.packages("tm") #text mining
library(tm)
## Loading required package: NLP
##
## Attaching package: 'NLP'
##
## The following object is masked from 'package:ggplot2':
##
## annotate
#install.packages("RColorBrewer") #colores
library(RColorBrewer)
#install.packages("wordcloud") #nube de palabras
library(wordcloud)
#install.packages("topicmodels")
library(topicmodels)
#install.packages("ggplot2")
library(ggplot2)
imagen1 <- image_read("/cloud/project/imagen1.PNG")
texto1 <- ocr(imagen1)
texto1
## [1] "Linear regression with one variable x is also known as univariate linear regression\nor simple linear regression. Simple linear regression is used to predict a single\noutput from a single input. This is an example of supervised learning, which means\nthat the data is labeled, i.e., the output values are known in the training data. Let us\nfit a line through the data using simple linear regression as shown in Fig. 4.1.\n"
doc1 <- read_docx() #crear un documento blanco de word
doc1 <- doc1 %>% body_add_par(texto1, style = "Normal") #agrega el texto en el word
#print(doc1, target="texto1.docx") #guardar el doc en la computadora
imagen2 <- image_read("/cloud/project/imagen2.PNG")
#tesseract_download("spa")
texto2 <- ocr(imagen2)
texto2
## [1] "Un importante, y quiza controversial, asunto politico es el que se refiere al efecto del salario minimo 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 minimos.\n"
doc2 <- read_docx() #crear un documento blanco de word
doc2 <- doc2 %>% body_add_par(texto2, style = "Normal") #agrega el texto en el word
print(doc2, target="texto2.docx")
#pdf1 <- pdf_convert("/cloud/project/pdf1.pdf", dpi=600) %>% map(ocr)
pdf2 <- pdf_convert("/cloud/project/eso3.pdf", dpi=600) %>% map(ocr)
## Converting page 1 to eso3_1.png... done!
## Converting page 2 to eso3_2.png... done!
## Converting page 3 to eso3_3.png... done!
it1 <- image_read("/cloud/project/eso3_1.png")
it2 <- image_read("/cloud/project/eso3_2.png")
combined <- unlist(pdf2) %>% paste(collapse = "/n")
doc_it <- read_docx() #crear un documento blanco de word
doc_it <- doc_it %>% body_add_par(combined, style = "Normal") #agrega el texto en el word
print(doc_it, target="texto_it.docx")
text <- readLines("http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt")
corpus <- Corpus(VectorSource(text)) #Pone cada oración en un rectangulo de vector
#inspect(corpus)
corpus <- tm_map(corpus, content_transformer(tolower)) #pone todo en minusculas
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
corpus <- tm_map(corpus, removePunctuation) #elimina signos de puntuación
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
coprus <- tm_map(corpus, removeNumbers) #elimina números
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords("en")) #elimina los stopwords (a, an, the, etc)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
#corpus <- tm_map(corpus, removeWords, c("palabra")) #elimina una palabra en especifica
inspect(corpus)
## <<SimpleCorpus>>
## Metadata: corpus specific: 1, document level (indexed): 0
## Content: documents: 46
##
## [1]
## [2] even though face difficulties today tomorrow still dream dream deeply rooted american dream
## [3]
## [4] dream one day nation will rise live true meaning creed
## [5]
## [6] hold truths selfevident men created equal
## [7]
## [8] dream one day red hills georgia sons former slaves sons former slave owners will able sit together table brotherhood
## [9]
## [10] dream one day even state mississippi state sweltering heat injustice sweltering heat oppression will transformed oasis freedom justice
## [11]
## [12] dream four little children will one day live nation will judged color skin content character
## [13]
## [14] dream today
## [15]
## [16] dream one day alabama vicious racists governor lips dripping words interposition nullification one day right alabama little black boys black girls will able join hands little white boys white girls sisters brothers
## [17]
## [18] dream today
## [19]
## [20] dream one day every valley shall exalted every hill mountain shall made low rough places will made plain crooked places will made straight glory lord shall revealed flesh shall see together
## [21]
## [22] hope faith go back south
## [23]
## [24] faith will able hew mountain despair stone hope faith will able transform jangling discords nation beautiful symphony brotherhood faith will able work together pray together struggle together go jail together stand freedom together knowing will free one day
## [25]
## [26] will day will day god s children will able sing new meaning
## [27]
## [28] country tis thee sweet land liberty thee sing
## [29] land fathers died land pilgrim s pride
## [30] every mountainside let freedom ring
## [31] america great nation must become true
## [32] let freedom ring prodigious hilltops new hampshire
## [33] let freedom ring mighty mountains new york
## [34] let freedom ring heightening alleghenies pennsylvania
## [35] let freedom ring snowcapped rockies colorado
## [36] let freedom ring curvaceous slopes california
## [37]
## [38]
## [39] let freedom ring stone mountain georgia
## [40] let freedom ring lookout mountain tennessee
## [41] let freedom ring every hill molehill mississippi
## [42] every mountainside let freedom ring
## [43] happens allow freedom ring let ring every village every hamlet every state every city will able speed day god s children black men white men jews gentiles protestants catholics will able join hands sing words old negro spiritual
## [44] free last free last
## [45]
## [46] thank god almighty free last
tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm) #cuenta las veces que aparece cada palabra
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) #convierte la frecuencia en un dataframe
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)
#el procesamiento de datos antes de la nube de palabras es igual que el analisis de frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words=frecuencia_df$word, freq=frecuencia_df$freq, min.freq=2,
random.order = FALSE, colors = brewer.pal(8, "Oranges"))
cuerpo <- Corpus(VectorSource(combined)) #Pone cada oración en un rectangulo de vector
#inspect(corpus)
cuerpo <- tm_map(cuerpo, content_transformer(tolower)) #pone todo en minusculas
## Warning in tm_map.SimpleCorpus(cuerpo, content_transformer(tolower)):
## transformation drops documents
cuerpo <- tm_map(cuerpo, removePunctuation) #elimina signos de puntuación
## Warning in tm_map.SimpleCorpus(cuerpo, removePunctuation): transformation drops
## documents
cuerpo <- tm_map(cuerpo, removeNumbers) #elimina números
## Warning in tm_map.SimpleCorpus(cuerpo, removeNumbers): transformation drops
## documents
cuerpo <- tm_map(cuerpo, removeWords, stopwords("spanish")) #elimina los stopwords (a, an, the, etc)
## Warning in tm_map.SimpleCorpus(cuerpo, removeWords, stopwords("spanish")):
## transformation drops documents
cuerpo <- tm_map(cuerpo, removeWords, c("—"))
## Warning in tm_map.SimpleCorpus(cuerpo, removeWords, c("—")): transformation
## drops documents
inspect(cuerpo)
## <<SimpleCorpus>>
## Metadata: corpus specific: 1, document level (indexed): 0
## Content: documents: 1
##
## [1] alli persiguiendo barco papel lado izquierdo witcham street corria\ndeprisa agua ganaba barquito sacando ventaja oyo rugido profundo \nvio cincuenta metros mas adelante colina abajo agua cuneta precipitaba\ndentro boca tormenta aun continuaba abierta largo semicirculo oscuro\nabierto bordillo acera mientras george miraba rama desgarrada corteza\noscura reluciente hundio aquellas fauces alli pendio momento luego deslizo\nhacia interior hacia alli encaminaba bote\n\n—jmierda —chillo horrorizado\n\nforzo paso momento parecio iba alcanzar barquito pies\nresbalo george cayo despatarrado despellejandose rodilla grito dolor \nnueva perspectiva altura pavimento vio barco giraba redondo dos veces\nmomentaneamente atrapado remolino desaparecer\n\n—mierda mas mierda —volvio chillar estrellando puno pavimento\n\n tambien dolio echo sollozar ique manera tan estupida perder barco\n\n levanto caminar hacia boca tormenta alli dejo caer rodillas mirar hacia\n interior agua hacia ruido hueco humedo caer oscuridad sonido daba\nescalofrios hacia pensar \n\n—jeh\n\n exclamacion arrancada cordel retrocedio\n\nalli adentro habia ojos amarillos tipo ojos siempre imaginaba verlos\nnunca oscuridad sotano animal —penso incoherente— animal \nmejor gato quedo atrapado\n\n modos echar correr habria corrido dos segundos \ntablero mental hecho cargo espanto produjeron dos ojos amarillos \nbrillantes sintio aspera superficie pavimento bajo dedos fina lamina agua fria\n corria alrededor vio si mismo levantandose retrocediendo entonces \n voz voz perfectamente razonable bastante simpatica hablo dentro \nboca tormenta\n\n—hola george —dijo\n\ngeorge parpadeo volvio mirar apenas podia dar credito vela sacado\n cuento pelicula sabe animales hablan bailan si \n diez anos mas habria creido viendo tenia dieciseis anos sino\nseis\n\n boca tormenta habia payaso luz distaba ser buena basto \ngeorge denbrough seguro vela payaso circo tele\nparecia mezcla bozo clarabell hablaba haciendo sonar bocina howdy\ndoody sabados manana bufalo bob unico entendia clarabell \nsiempre hacia reir george cara payaso metido boca tormenta blanca tenia\ncomicos mechones pelo rojo cada lado calva gran sonrisa payaso pintada\nnalrededor boca si george vivido anos despues habria pensado ronald\nmcdonald bozo clarabell\n\n payaso tenia mano manojo globos colores tentadora fruta\nmadura\n\n barquito papel george\n\n— quieres barquito georgie — payaso sonrela\n\ngeorge tambien sonrio podia evitarlo aqguella sonrisa tipo devuelve \nquerer\n\n— supuesto\n\n payaso echo retr\n\n—« supuesto» iasi gusta iasi gusta ¢ globo ¢ parece ¢quieres globo\n—bueno si supuesto —alargo mano inmediato retiro voluntad— \ndebo coger ofrezca desconocido dice papa\n\n— papa mucha razon —replico payaso boca tormenta sonriendo george \noregunto podia haber creido ojos amarillos si color azul brillante\nbailarin ojos mama bill— muchisima razon creo voy \npresentarme george senor bob gray tambien conocido pennywise payaso\nbailarin pennywise presento george denbrough george presento pennywise ahora\n conocemos desconocido tampoco ¢correcto\n\ngeorge solto risita\n\n—correcto —volvio estirar mano retirarla— ¢ metiste alli adentro\n\n— tormenta trajo volaaaando —dijo pennywise payaso bailarin— llevo circo\néno sientes olor circo george\n\ngeorge inclino hacia adelante ide pronto olia cacahuetes icacahuetes tostados iy vinagre\nblanco pone patatas fritas agujero tapa olia algodon \nazucar bunuelos tambien leve poderosamente estiercol animales salvajes olia \naroma regocijante aserrin embargo\n\n embargo bajo olia inundacion hojas deshechas oscuras sombras bocas\n tormenta olor humedo putrido olor sotano\n\n olores mas fuertes\n\n—claro huelo —dijo\n\n— quieres barquito george —pregunto pennywise— pregunto vez \npareces desearlo \nny mostro alto sonriendo llevaba traje seda abolsado grandes botones color\nnaranja corbata brillante color azul electrico derramaba pechera \nmanos llevaba grandes guantes blancos mickey donald\n\n—si claro —dijo george mirando dentro boca tormenta\n\n— globo rojos verdes amarillos azules\n\n—flotan\n\n— si flotan — sonrisa payaso acentuo— oh si claro si iflotan tambien \nalgodon azucar\n\ngeorge estiro mano\n\n payaso sujeto brazo\n\n entonces george vio cara payaso cambiaba\n\n vio entonces tan terrible peor habia imaginado cosa sotano\nparecia dulce sueno vio destruyo cordura zarpazo\n\n—flotan —croo cosa alcantarilla voz rela coagulos\n\nsujetaba brazo george puno grueso agusanado tiro hacia horrible\noscuridad agua corria rugia aullaba llevando hacia mar desechos \ntormenta george estiro cuello apartarse negrura definitiva empezo gritar hacia\n lluvia gritar loco hacia gris cielo otonal curvaba derry aquel dia \notono gritos agudos penetrantes largo toda calle gente \nasomo ventanas lanzo porches\n\n—flotan —gruno cosa— flotan georgie estes aqui abajo conmigo tambien\nflotaras\n\n hombro george clavo cemento bordillo dave gardener dia \nhabia ido trabajar shoeboat debido inundacion vio solo nino impermeable\namarillo nino gritaba retorcia arroyo mientras agua lodosa corria \ncara haciendo alaridos sonaran burbujeantes\n\n—aqul abajo flota —susurro voz podrida riendo pronto sono desgarro \n destello agonia george denbrough supo mas\n\ndave gardener primero llegar aunque llego solo cuarenta cinco segundos despues\n primer grito george denbrough habia muerto gardener agarro impermeable tiro\n sacarlo calle girar manos cuerpo george tambien empezo \ngritar lado izquierdo impermeable nino rojo intenso sangre flulia hacia\n alcantarilla agujero habia brazo izquierdo trozo hueso\nhorriblemente brillante asomaba tela rota\n\n ojos nino miraban fijamente cielo gris mientras dave retrocedia tropezones hacia\n corrian calle empezaron llenarse lluvia\n
tdm2 <- TermDocumentMatrix(cuerpo)
m2 <- as.matrix(tdm2) #cuenta las veces que aparece cada palabra
frecuencia2 <- sort(rowSums(m2), decreasing = TRUE) #cuenta la frecuencia de cada palabra en el texto completo
frecuencia_df2 <- data.frame(word=names(frecuencia2),
freq = frecuencia2) #convierte la frecuencia en un dataframe
ggplot(head(frecuencia_df2, 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="Sección del libro IT por Stephen King", x = "Palabra", y="Frecuencia") +
ylim(0,35)
#el procesamiento de datos antes de la nube de palabras es igual que el analisis de frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words=frecuencia_df2$word, freq=frecuencia_df2$freq, min.freq=2,
random.order = FALSE, colors = brewer.pal(8, "Oranges"))
En conclusión, el text mining es una herramienta útil para analizar grandes cantidades de texto, permitiendo a las organizaciones extraer información relevante y tomar decisiones fundamentadas en datos no estructurados. Su capacidad para identificar patrones, tendencias y sentimientos ocultos lo convierte en una herramienta esencial en una amplia gama de campos, desde la comprensión del cliente hasta la detección de fraudes o en este caso el análisis de novelas.