La mineria de texto (TM) es el proceso de extraer informacion útil, patrones o conocimientos de textos no estrucutrados.
Consta de 3 etapas:
1. Obtener datos: El reconocimiento óptico de
caracteres (OCR) es una tecnología que permite convertir imágenes de
texto editable. También es conocido como la extracción de texto
de imágenes.
2. Explorar datos: Representación grafica o visual 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. Analisis predictivo: Son las técnincas y modelos
estadísticos para predecir resultados futuros. Los modelos mas usados
son el Random Forest, redes neuronales y regresiones.
# install.packages("tidyr")
library(tidyr) # Data wranglig (Manipulacion de datos)
# install.packages("tesseract")
library(tesseract) # OCR
# install.packages("magick")
library(magick) # PNG
# install.packages("officer")
library(officer) # Data wranglig (Manipulacion de datos)
# install.packages("pdftools")
library(pdftools) # PDF
library(tidyr) # Data wranglig (Manipulacion de datos)
# install.packages("purrr")
library(purrr) # Para la funcion map
# install.packages("tm")
library(tm) # Text mining
# install.packages("RColorBrewer")
library(RColorBrewer) # colores
# install.packages("wordcloud")
library(wordcloud) # Nube de palablas
# install.packages("topicmodels") # modelo de temas
library(topicmodels) # PDF
# install.packages("ggplot2") # graficas
library(ggplot2)
imagen1 <- image_read("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/imagen1.PNG")
text1 <- ocr(imagen1)
text1
## [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() # crea un documento de word en blanco
# doc1 <- doc1 %>% body_add_par(text1, style= "Normal") # pega el texto en el word
# print(doc1, target = "texto1.docx")
imagen2 <- image_read("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/imagen2.PNG")
# tesseract_download("spa")
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 = "texto2.docx")
pdf1 <- pdf_convert("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/pdf1.pdf", dpi=600) %>% map(ocr)
## Converting page 1 to pdf1_1.png... done!
## Converting page 2 to pdf1_2.png... done!
## Converting page 3 to pdf1_3.png... done!
## Converting page 4 to pdf1_4.png... done!
## Converting page 5 to pdf1_5.png... done!
## Converting page 6 to pdf1_6.png... done!
## Converting page 7 to pdf1_7.png... done!
## Converting page 8 to pdf1_8.png... done!
# doc3 <- read_docx() # crea un documento de word en blanco
# doc3 <- doc3 %>% body_add_par(pdf1, style= "Normal") # pega el texto en el word
pdf2 <- pdf_convert("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/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!
# Agregar el texto extraído del primer archivo PNG
eso1 <- image_read("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/eso3_1.png")
eso2 <- image_read("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/eso3_2.png")
eso3 <- image_read("/Users/kikepablos/Documents/Development/escuela/concentracion_ai/modulo_6/data_sources/eso3_3.png")
tesseract_download("spa")
## [1] "/Users/kikepablos/Library/Application Support/tesseract5/tessdata/spa.traineddata"
eso_1 <- ocr(eso1, engine = tesseract("spa"))
eso_2 <- ocr(eso2, engine = tesseract("spa"))
eso_3 <- ocr(eso3, engine = tesseract("spa"))
# doc_it <- read_docx()
# doc_it <- doc_it %>% body_add_par(eso_1, style = "Normal") %>% body_add_par(eso_2, style = "Normal") %>% body_add_par(eso_3, style = "Normal")
# Guardar el documento de Word
# print(doc_it, target = "textos_extraidos.docx")
text4 <- readLines("http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt")
corpus <- Corpus(VectorSource(text4)) # Pone cada renglon en una celda de vector
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 puntuación
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
corpus <- tm_map(corpus, removeNumbers) # Elimina numeros
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords("en")) # Elimina palabras que no hablan del texto
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
# corpus <- tm_map(corpus, removeWords, c("dream", "will")) # Elimina palabras puntuales
tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm)
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 a data frame
frecuencia_df
## 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="blue") + labs(title="TOP 10 palabras mas frecuentes", subtitle = "Discurso 'I have a Dream de M. L. King", x= "Palabra", y= "Frecuencia") +geom_text(aes(label= freq), vjust=-0.5) + ylim(0,20)
## Nube de palabras
# El procesamiento de datos antes de la nube de palabras es igual que en el análisi de frecuencias, desde el texto hasta frecuencias_df
set.seed(123)
wordcloud(words=frecuencia_df$word, freq = frecuencia_df$freq, min.freq=1, random.order = FALSE, colors= brewer.pal(8, "RdPu"))