Teoria

La minería de texto (text mining) es el proceso de extraer información útil, patrones, o conocimiento de textos no estructurados.

Consta de 3 etapas: 1. Obtención de datos: El reconocimiento óptico de caracteres (OCR, optical character recognition) es una tecnología que permite convertir imagenes de texto en texto editable. También conocido como extracción de texto de imágenes.
2. Exploración de datos: Representación gráfica o visual de los datos para su interpretación. Los métodos más comines son el análisis de sentimientos, la nube de palabras, y el Topic Modeling.
3. Análisis predictivo: Son las técnicas y modelos estadísticos para predecir resultados futuros. Los modelos más usados son el Random Forest, Redes Neuronales, y regresiones.

Instalar paquetes y librerias

#install.packages("tidyverse") Data wrangling
library("tidyverse")

#install.packages("tesseract") #Para crear OCR
library("tesseract")

#install.packages("magick") #Trabajar con imagenes png
library("magick")

#install.packages("officer") #Exportar en formatos office, como word.
library("officer")

#install.packages("pdftools") #Leer PDFs
library("pdftools")

#install.packages("purrr") #Map function (Para aplicar una funcion a todo un vector)
library("purrr")

#install.packages("tm") #Text Mining
library("tm")

#install.packages("RColorBrewer") #Para manejar colores
library("RColorBrewer")

#install.packages("wordcloud") #Nube de palabras
library("wordcloud")

#install.packages("topicmodels") #Modelos de temas
library("topicmodels")

#install.packages("ggplot2") #Modelos de temas
library("ggplot2")

Obtener datos mediante OCR

De imagen PNG a texto en WORD

imagen1 <- image_read("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\imagen1.PNG")

texto1 <- ocr(imagen1)

doc1 <- read_docx() #crea un documento en blanco de word
doc1 <- doc1 %>% body_add_par(texto1, style = "Normal")
#print(doc1, target = "texto1.docx")

Imagen en español PNG a texto en WORD

Consulta idiomas en Tesseract

imagen2 <- image_read("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\imagen2.PNG")

tesseract_download("spa")
## [1] "C:\\Users\\memil\\AppData\\Local\\tesseract5\\tesseract5\\tessdata/spa.traineddata"
texto2 <- ocr(imagen2, engine = tesseract("spa"))

doc2 <- read_docx() #crea un documento en blanco de word
doc2 <- doc2 %>% body_add_par(texto1, style = "Normal")
#print(doc2, target = "texto2.docx")

Extraer el PDF de un texto escaneado

pdf1 <- pdf_convert("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\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!

Actividad 1. Novela “IT”

eso3 <- pdf_convert("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\eso3.pdf", dpi = 600)
## Converting page 1 to eso3_1.png... done!
## Converting page 2 to eso3_2.png... done!
## Converting page 3 to eso3_3.png... done!
pngit1 <- image_read("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\eso3_1.png")
textoit1 <- ocr(pngit1, engine = tesseract("spa"))

pngit2 <- image_read("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\eso3_2.png")
textoit2 <- ocr(pngit2, engine = tesseract("spa"))

pngit3 <- image_read("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\eso3_3.png")
textoit3 <- ocr(pngit3, engine = tesseract("spa"))

docit <- read_docx() #crea un documento en blanco de word
docit <- docit %>% 
  body_add_par(textoit1, style = "Normal") %>% 
  body_add_par(textoit2, style = "Normal") %>% 
  body_add_par(textoit3, style = "Normal")

#print(docit, target = "textoit.docx")

Exploración de datos

Análisis de frecuencias

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 renglon del texto en cada celda del 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")) #quita stopwords en ingles como a, the, an.
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
#corpus <- tm_map(corpus, removeWords, c("","","","")) #quita palabras en especifico

#inspect(corpus)

tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm) # cuentan cada vez que sale cada palabra.

frecuencia <- sort(rowSums(m), decreasing = TRUE)

frecuencia_df <- data.frame(word = names(frecuencia), freq = frecuencia)

ggplot(head(frecuencia_df, 10),aes(x=reorder(word, -freq), y=freq)) +
       geom_bar(stat = "identity", fill="skyblue") +
       geom_text(aes(label=freq), vjust = -0.5) +
       labs(title = "Top 10 Palabras mas Frecuentes", subtitle = "Discurso: I Have a Dream", x = "Palabra", y = "Frecuencia")+
       ylim(0,20)

Nube de Palabras

set.seed(123)
wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq,min.freq = 1, random.order = FALSE, colors = brewer.pal(8, "Set2"))

Ejercicio 2

text <- read_lines("C:\\Users\\memil\\OneDrive\\Desktop\\aaTecDeMonterrey\\6to Semestre\\textoit.txt")

corpus <- Corpus(VectorSource(text)) # pone cada renglon del texto en cada celda del 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("sp")) #quita stopwords en ingles como a, the, an.
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("sp")):
## transformation drops documents
corpus <- tm_map(corpus, removeWords, c("—")) #quita palabras en especifico
## Warning in tm_map.SimpleCorpus(corpus, removeWords, c("—")): transformation
## drops documents
#inspect(corpus)

tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm) # cuentan cada vez que sale cada palabra.

frecuencia <- sort(rowSums(m), decreasing = TRUE)

frecuencia_df <- data.frame(word = names(frecuencia), freq = frecuencia)
frecuencia_df <- frecuencia_df[-7, ]

ggplot(head(frecuencia_df, 10),aes(x=reorder(word, -freq), y=freq)) +
       geom_bar(stat = "identity", fill="skyblue") +
       geom_text(aes(label=freq), vjust = -0.5) +
       labs(title = "Top 10 Palabras mas Frecuentes", subtitle = "Novela: It", x = "Palabra", y = "Frecuencia")

set.seed(123)
wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq,min.freq = 1, random.order = FALSE, colors = brewer.pal(8, "Set2"))