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: 1. Obtener datos: El reconocimiento
óptico de caracteres (OCR) es una tecnologÃa que permite
convertir imágines de texto en texto editable. También es conocido como
extracción de texto de imágines
2. Explorar datos: Representación gráfica 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. 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.
library(tidyverse) # Data Wrangling
library(tesseract) # OCR
library(magick) # Permite trabajar con imágenes de formato PNG
library(officer) # Permite exportar en formatos que son de OFFICE (ej. Word)
library(pdftools) # Permite leer PDFS
library(purrr) # Para la función "map"
library(tm) # MinerÃa de texto
library(RColorBrewer) # Colores
library(wordcloud) # Crea nubes de palabras
library(topicmodels)
library(ggplot2) # Generador de gráficas con más diseño
# Texto en Ingles
imagen1 = image_read("C:\\Users\\Silva\\Downloads\\imagen1.PNG")
texto1 = ocr(imagen1)
#texto1
doc1 = read_docx() # Crea un documento 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("C:\\Users\\Silva\\Downloads\\imagen2.PNG")
tesseract_download("spa")
## [1] "C:\\Users\\Silva\\AppData\\Local\\tesseract5\\tesseract5\\tessdata/spa.traineddata"
texto2 = ocr(imagen2, engine= tesseract("spa"))
#texto2
doc2 = read_docx() # Crea un documento en blanco
doc2 = doc2 %>%
body_add_par(texto2, style ="Normal") # Pega el texto en el word
#print(doc2, target = "texto2.docx") # Guarda el word en la computadora
#pdf1 = pdf_convert("C:\\Users\\Silva\\Downloads\\pdf1.pdf", dpi = 600) %>% map(ocr)
novela = pdf_convert("C:\\Users\\Silva\\Downloads\\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!
# 2. Crear un documento de Word y agregar los textos
doc3 <- read_docx()
# Agregar texto del PDF
for (texto_pagina in novela) {
doc3 <- doc3 %>% body_add_par(texto_pagina, style = "Normal")
}
# Guardar el documento de Word
#print(doc3, target = "doc3.docx")
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
Corpus = tm_map(Corpus, content_transformer(tolower)) # Pone todo en minúsculas
Corpus = tm_map(Corpus, removePunctuation) # Elimina puntuación
Corpus = tm_map(Corpus, removeNumbers) # Elimina números
Corpus = tm_map(Corpus, removeWords, stopwords("en")) # Elimina las "stopwords" palabras inutiles para el análisis de texto
#Corpus = tm_map(Corpus, removeWords, c("","")) # Elimina palabras seleccionadas a mano
tdm = TermDocumentMatrix(Corpus) # Cuenta las veces que aparece cada palabra por renglón
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 en un data frame
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 por Frecuencia",
subtitle = "Discurso 'I have a Dream' de M. L. King ",
x = "Palabra",
y = "Frecuencia",)+
theme_minimal()+
ylim(0,20)
# El procesamiento de datos antes de la nube de palabras es igual que en el Anáisis de Frecuencias, desde importar el texto hsta frecuencia_df
set.seed(123)
wordcloud(words = frecuencia_df$word, freq = frecuencia_df$freq, min.freq = 1, random.order = FALSE,
scale = c(3, 0.5), # Ajustar el rango de tamaños de palabras
colors = brewer.pal(8, "Dark2"), # Utilizar una paleta de colores
max.words = 100, # Número máximo de palabras a mostrar
random.color = TRUE, # Colores aleatorios
rot.per = 0.35, # Porcentaje de palabras rotadas
ordered.colors = FALSE # Colores desordenados
)
Corpus2 =Corpus(VectorSource(novela)) # Pone cada renglón en una celda de vector
Corpus2 = tm_map(Corpus2, content_transformer(tolower)) # Pone todo en minúsculas
Corpus2 = tm_map(Corpus2, removePunctuation) # Elimina puntuación
Corpus2 = tm_map(Corpus2, removeNumbers) # Elimina números
Corpus2 = tm_map(Corpus2, removeWords, stopwords("spa")) # Elimina las "stopwords" palabras inutiles para el análisis de texto
Corpus2 = tm_map(Corpus2, removeWords, c("—","--","__")) # Elimina palabras seleccionadas a mano
Corpus2 = tm_map(Corpus2, content_transformer(function(x) gsub("[[:punct:]]", " ", x)))
#inspect(Corpus2)
tdm2 = TermDocumentMatrix(Corpus2) # Cuenta las veces que aparece cada palabra por renglón
m2 = as.matrix(tdm2)
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 data frame
ggplot(head(frecuencia_df2, 10), aes(x = reorder(word, -freq), y = freq, fill = freq)) +
geom_bar(stat = "identity") +
geom_text(aes(label = freq), vjust = -0.3) +
scale_fill_gradient(low = "skyblue", high = "navy", limits = c(0, 30)) +
labs(title = "Top 10 Palabras por Frecuencia",
subtitle = "Novela 'It' de Stephen King",
x = "Palabra",
y = "Frecuencia") +
theme_minimal()
# El procesamiento de datos antes de la nube de palabras es igual que en el Anáisis de Frecuencias, desde importar el texto hsta frecuencia_df
set.seed(123)
wordcloud(words = frecuencia_df2$word, freq = frecuencia_df2$freq, min.freq = 2, random.order = FALSE,
scale = c(3, 0.5), # Ajustar el rango de tamaños de palabras
colors = brewer.pal(8, "Dark2"), # Utilizar una paleta de colores
max.words = 100, # Número máximo de palabras a mostrar
random.color = TRUE, # Colores aleatorios
rot.per = 0.35, # Porcentaje de palabras rotadas
ordered.colors = FALSE # Colores desordenados
)