Teoría

El Reconocimiento óptico de caracteres (OCR) es una tecnología utilizada para convertir diferentes tipos de documentos, como ímagenes, documentos impresos escaneados, fotografías de texto, archivos PDF o imagnes capturadas con una cámara, en datos editables y buscables.

La Minería de datos (TM) es el proceso de extrear información útil, patrones o conocimiento de texts no estructurados.

Consta en 3 etapas: 1. Obtener datos: El reconocimiento óptico de caracteres (OCR) es una tecnología que permite convertir imagenes de texto en texto editable. Tambíen es reconocido por extraccion de texto en imagenes 2. Explorar datos: Representación gráfica o visual de datos para su interpretación. Los métodos más comunes son: ánalisis de sentimientos, nueb de palabras y topic modeling. 3. Analisis predictivo: técnica y modelos estadisticos para predicir resultados futuros. los módelos más utilizados son el Random Forest, redes neuronales y regresion

Instalar paquetes y llamar librerías

# install.packages("cluster")  #Analisis de Agrupamiento
library(cluster)
# install.packages("ggplot2") #Graficar
library(ggplot2)
# install.packages("data.table") #Manejo de muchos datos
library(data.table)
# install.packages("factoextra") #Gráfica optimización de numeros cluster
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:data.table':
## 
##     between, first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# install.packages("rpart") #Gráfica optimización de numeros cluster
library(rpart)
# install.packages("rpart.plot") #Gráfica optimización de numeros cluster
library(rpart.plot)
# install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.3.0
## ✔ purrr     1.1.0     ✔ tidyr     1.3.1
## ✔ readr     2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between()     masks data.table::between()
## ✖ dplyr::filter()      masks stats::filter()
## ✖ dplyr::first()       masks data.table::first()
## ✖ lubridate::hour()    masks data.table::hour()
## ✖ lubridate::isoweek() masks data.table::isoweek()
## ✖ dplyr::lag()         masks stats::lag()
## ✖ dplyr::last()        masks data.table::last()
## ✖ lubridate::mday()    masks data.table::mday()
## ✖ lubridate::minute()  masks data.table::minute()
## ✖ lubridate::month()   masks data.table::month()
## ✖ lubridate::quarter() masks data.table::quarter()
## ✖ lubridate::second()  masks data.table::second()
## ✖ purrr::transpose()   masks data.table::transpose()
## ✖ lubridate::wday()    masks data.table::wday()
## ✖ lubridate::week()    masks data.table::week()
## ✖ lubridate::yday()    masks data.table::yday()
## ✖ lubridate::year()    masks data.table::year()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("tesseract")
library(tesseract)
# install.packages("magick")
library(magick)
## Linking to ImageMagick 6.9.12.93
## Enabled features: cairo, fontconfig, freetype, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fftw, ghostscript, x11
# install.packages("officer")
library(officer)
# install.packages("pdftools")
library(pdftools)
## Using poppler version 23.04.0
# install.packages("purrr")
library(purrr)

Imagen a texto

imagen1 <- image_read("/Users/mariajoseflores/Downloads/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() #Crea documento word blanco
doc1 <- doc1 %>% body_add_par(texto1) #Pega el texto en el documento 
# Extraer texto con OCR
texto1 <- ocr(imagen1)

# Crear documento Word en blanco
doc1 <- read_docx()

# Pegar el texto extraído
doc1 <- doc1 %>% body_add_par(texto1)

Imagen en español a texto WORD

imagen2 <- image_read("/Users/mariajoseflores/Downloads/imagen2.PNG")
tesseract_download ("spa")
## Training data already exists. Overwriting /Users/mariajoseflores/Library/Application Support/tesseract5/tessdata/spa.traineddata
## [1] "/Users/mariajoseflores/Library/Application Support/tesseract5/tessdata/spa.traineddata"
# Descargar datos de idioma español (solo se hace una vez)
tesseract_download("spa")
## Training data already exists. Overwriting /Users/mariajoseflores/Library/Application Support/tesseract5/tessdata/spa.traineddata
## [1] "/Users/mariajoseflores/Library/Application Support/tesseract5/tessdata/spa.traineddata"
# Crear el motor en español
esp_engine <- tesseract("spa")

# Usar el motor con OCR
imagen2 <- image_read("/Users/mariajoseflores/Downloads/imagen2.PNG")
texto2 <- ocr(imagen2, engine = esp_engine)

# Crear y guardar el Word
doc2 <- read_docx() %>% 
  body_add_par(texto2)

print(doc2, target = "texto2.docx")

de PDF a texto WORD

pdf_eso <- pdf_convert("/Users/mariajoseflores/Downloads/eso.pdf") %>% map(ocr)
## Converting page 1 to eso_1.png... done!
## Converting page 2 to eso_2.png... done!

‹span style=“color:blue”> Análisis de Emociones y Sentimientos

texto <- pdf_eso
# Paquetes necesarios
# install.packages("syuzhet")
library(syuzhet)
library(dplyr)

# 1) Unir el texto OCR del PDF (lista -> vector de caracteres)
# pdf_eso viene de: pdf_convert(...) %>% map(ocr)
texto <- pdf_eso %>% unlist(use.names = FALSE) %>% paste(collapse = "\n")

# 2) Partir en oraciones (syuzhet)
oraciones <- get_sentences(texto)

# 3) Emociones NRC en español
# Alegría, Tristeza, Ira, Miedo, Sorpresa, Asco, Anticipación, Confianza
emociones <- get_nrc_sentiment(oraciones, language = "spanish")

# 4) Agregar por emoción y normalizar (proporciones)
emociones_prop <- prop.table(colSums(emociones[, 1:8]))

# 5) Gráfica rápida (base R)
barplot(emociones_prop,
        main = "Emociones NRC (español)",
        ylab = "Proporción",
        las = 2)

# Si quieres ver las cifras ordenadas:
sort(emociones_prop, decreasing = TRUE)
##        trust         fear anticipation      sadness     surprise        anger 
##   0.20652174   0.19565217   0.17391304   0.10869565   0.09239130   0.08695652 
##          joy      disgust 
##   0.07608696   0.05978261
LS0tCnRpdGxlOiAiT0NSIgphdXRob3I6ICJNYXJpYSBKb3NlIEZsb3JlcyIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgdGhlbWU6IHNpbXBsZXgKLS0tCgohW10oaHR0cHM6Ly9pLnBpbmltZy5jb20vb3JpZ2luYWxzLzMyL2U3LzE0LzMyZTcxNDYyOTk1MDZkMzUwOWYzNGEwN2U3MDY4MDAzLmdpZikKCiMgPHNwYW4gc3R5bGUgPSAiY29sb3I6Ymx1ZTsiPiBUZW9yw61hIDwvc3Bhbj4KRWwgKipSZWNvbm9jaW1pZW50byDDs3B0aWNvIGRlIGNhcmFjdGVyZXMgKE9DUikqKiBlcyB1bmEgdGVjbm9sb2fDrWEgdXRpbGl6YWRhIHBhcmEgY29udmVydGlyIGRpZmVyZW50ZXMgdGlwb3MgZGUgZG9jdW1lbnRvcywgY29tbyDDrW1hZ2VuZXMsIGRvY3VtZW50b3MgaW1wcmVzb3MgZXNjYW5lYWRvcywgZm90b2dyYWbDrWFzIGRlIHRleHRvLCBhcmNoaXZvcyBQREYgbyBpbWFnbmVzIGNhcHR1cmFkYXMgY29uIHVuYSBjw6FtYXJhLCBlbiBkYXRvcyBlZGl0YWJsZXMgeSBidXNjYWJsZXMuIAoKTGEgKipNaW5lcsOtYSBkZSBkYXRvcyAoVE0pKiogZXMgZWwgcHJvY2VzbyBkZSBleHRyZWFyIGluZm9ybWFjacOzbiDDunRpbCwgcGF0cm9uZXMgbyBjb25vY2ltaWVudG8gZGUgdGV4dHMgbm8gZXN0cnVjdHVyYWRvcy4gCgpDb25zdGEgZW4gMyBldGFwYXM6IAoxLiBPYnRlbmVyIGRhdG9zOiBFbCByZWNvbm9jaW1pZW50byDDs3B0aWNvIGRlIGNhcmFjdGVyZXMgKE9DUikgZXMgdW5hIHRlY25vbG9nw61hIHF1ZSBwZXJtaXRlIGNvbnZlcnRpciBpbWFnZW5lcyBkZSB0ZXh0byBlbiB0ZXh0byBlZGl0YWJsZS4gVGFtYsOtZW4gZXMgcmVjb25vY2lkbyBwb3IgZXh0cmFjY2lvbiBkZSB0ZXh0byBlbiBpbWFnZW5lcwoyLiBFeHBsb3JhciBkYXRvczogUmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIG8gdmlzdWFsIGRlIGRhdG9zIHBhcmEgc3UgaW50ZXJwcmV0YWNpw7NuLiBMb3MgbcOpdG9kb3MgbcOhcyBjb211bmVzIHNvbjogw6FuYWxpc2lzIGRlIHNlbnRpbWllbnRvcywgbnVlYiBkZSBwYWxhYnJhcyB5IHRvcGljIG1vZGVsaW5nLgozLiBBbmFsaXNpcyBwcmVkaWN0aXZvOiB0w6ljbmljYSB5IG1vZGVsb3MgZXN0YWRpc3RpY29zIHBhcmEgcHJlZGljaXIgcmVzdWx0YWRvcyBmdXR1cm9zLiBsb3MgbcOzZGVsb3MgbcOhcyB1dGlsaXphZG9zIHNvbiBlbCBSYW5kb20gRm9yZXN0LCByZWRlcyBuZXVyb25hbGVzIHkgcmVncmVzaW9uCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcyA8L3NwYW4+CmBgYHtyfQojIGluc3RhbGwucGFja2FnZXMoImNsdXN0ZXIiKSAgI0FuYWxpc2lzIGRlIEFncnVwYW1pZW50bwpsaWJyYXJ5KGNsdXN0ZXIpCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICNHcmFmaWNhcgpsaWJyYXJ5KGdncGxvdDIpCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIpICNNYW5lam8gZGUgbXVjaG9zIGRhdG9zCmxpYnJhcnkoZGF0YS50YWJsZSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJmYWN0b2V4dHJhIikgI0dyw6FmaWNhIG9wdGltaXphY2nDs24gZGUgbnVtZXJvcyBjbHVzdGVyCmxpYnJhcnkoZmFjdG9leHRyYSkKbGlicmFyeShkcGx5cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJycGFydCIpICNHcsOhZmljYSBvcHRpbWl6YWNpw7NuIGRlIG51bWVyb3MgY2x1c3RlcgpsaWJyYXJ5KHJwYXJ0KQojIGluc3RhbGwucGFja2FnZXMoInJwYXJ0LnBsb3QiKSAjR3LDoWZpY2Egb3B0aW1pemFjacOzbiBkZSBudW1lcm9zIGNsdXN0ZXIKbGlicmFyeShycGFydC5wbG90KQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCmxpYnJhcnkodGlkeXZlcnNlKQojIGluc3RhbGwucGFja2FnZXMoInRlc3NlcmFjdCIpCmxpYnJhcnkodGVzc2VyYWN0KQojIGluc3RhbGwucGFja2FnZXMoIm1hZ2ljayIpCmxpYnJhcnkobWFnaWNrKQojIGluc3RhbGwucGFja2FnZXMoIm9mZmljZXIiKQpsaWJyYXJ5KG9mZmljZXIpCiMgaW5zdGFsbC5wYWNrYWdlcygicGRmdG9vbHMiKQpsaWJyYXJ5KHBkZnRvb2xzKQojIGluc3RhbGwucGFja2FnZXMoInB1cnJyIikKbGlicmFyeShwdXJycikKCmBgYAojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gSW1hZ2VuIGEgdGV4dG8gPC9zcGFuPgpgYGB7cn0KaW1hZ2VuMSA8LSBpbWFnZV9yZWFkKCIvVXNlcnMvbWFyaWFqb3NlZmxvcmVzL0Rvd25sb2Fkcy9pbWFnZW4xLlBORyIpCnRleHRvMSA8LSBvY3IoaW1hZ2VuMSkKdGV4dG8xCmRvYzEgPC0gcmVhZF9kb2N4KCkgI0NyZWEgZG9jdW1lbnRvIHdvcmQgYmxhbmNvCmRvYzEgPC0gZG9jMSAlPiUgYm9keV9hZGRfcGFyKHRleHRvMSkgI1BlZ2EgZWwgdGV4dG8gZW4gZWwgZG9jdW1lbnRvIAojIEV4dHJhZXIgdGV4dG8gY29uIE9DUgp0ZXh0bzEgPC0gb2NyKGltYWdlbjEpCgojIENyZWFyIGRvY3VtZW50byBXb3JkIGVuIGJsYW5jbwpkb2MxIDwtIHJlYWRfZG9jeCgpCgojIFBlZ2FyIGVsIHRleHRvIGV4dHJhw61kbwpkb2MxIDwtIGRvYzEgJT4lIGJvZHlfYWRkX3Bhcih0ZXh0bzEpCmBgYAojIDxzcGFuIHN0eWxlID0gImNvbG9yOmJsdWU7Ij4gSW1hZ2VuIGVuIGVzcGHDsW9sIGEgdGV4dG8gV09SRCA8L3NwYW4+CmBgYHtyfQppbWFnZW4yIDwtIGltYWdlX3JlYWQoIi9Vc2Vycy9tYXJpYWpvc2VmbG9yZXMvRG93bmxvYWRzL2ltYWdlbjIuUE5HIikKdGVzc2VyYWN0X2Rvd25sb2FkICgic3BhIikKCiMgRGVzY2FyZ2FyIGRhdG9zIGRlIGlkaW9tYSBlc3Bhw7FvbCAoc29sbyBzZSBoYWNlIHVuYSB2ZXopCnRlc3NlcmFjdF9kb3dubG9hZCgic3BhIikKCiMgQ3JlYXIgZWwgbW90b3IgZW4gZXNwYcOxb2wKZXNwX2VuZ2luZSA8LSB0ZXNzZXJhY3QoInNwYSIpCgojIFVzYXIgZWwgbW90b3IgY29uIE9DUgppbWFnZW4yIDwtIGltYWdlX3JlYWQoIi9Vc2Vycy9tYXJpYWpvc2VmbG9yZXMvRG93bmxvYWRzL2ltYWdlbjIuUE5HIikKdGV4dG8yIDwtIG9jcihpbWFnZW4yLCBlbmdpbmUgPSBlc3BfZW5naW5lKQoKIyBDcmVhciB5IGd1YXJkYXIgZWwgV29yZApkb2MyIDwtIHJlYWRfZG9jeCgpICU+JSAKICBib2R5X2FkZF9wYXIodGV4dG8yKQoKcHJpbnQoZG9jMiwgdGFyZ2V0ID0gInRleHRvMi5kb2N4IikKCmBgYAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpibHVlOyI+IGRlIFBERiBhIHRleHRvIFdPUkQgPC9zcGFuPgpgYGB7cn0KcGRmX2VzbyA8LSBwZGZfY29udmVydCgiL1VzZXJzL21hcmlham9zZWZsb3Jlcy9Eb3dubG9hZHMvZXNvLnBkZiIpICU+JSBtYXAob2NyKQpgYGAKCiMg4oC5c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+IEFuw6FsaXNpcyBkZSBFbW9jaW9uZXMgeSBTZW50aW1pZW50b3MgPC9zcGFuPgpgYGB7cn0KdGV4dG8gPC0gcGRmX2VzbwojIFBhcXVldGVzIG5lY2VzYXJpb3MKIyBpbnN0YWxsLnBhY2thZ2VzKCJzeXV6aGV0IikKbGlicmFyeShzeXV6aGV0KQpsaWJyYXJ5KGRwbHlyKQoKIyAxKSBVbmlyIGVsIHRleHRvIE9DUiBkZWwgUERGIChsaXN0YSAtPiB2ZWN0b3IgZGUgY2FyYWN0ZXJlcykKIyBwZGZfZXNvIHZpZW5lIGRlOiBwZGZfY29udmVydCguLi4pICU+JSBtYXAob2NyKQp0ZXh0byA8LSBwZGZfZXNvICU+JSB1bmxpc3QodXNlLm5hbWVzID0gRkFMU0UpICU+JSBwYXN0ZShjb2xsYXBzZSA9ICJcbiIpCgojIDIpIFBhcnRpciBlbiBvcmFjaW9uZXMgKHN5dXpoZXQpCm9yYWNpb25lcyA8LSBnZXRfc2VudGVuY2VzKHRleHRvKQoKIyAzKSBFbW9jaW9uZXMgTlJDIGVuIGVzcGHDsW9sCiMgQWxlZ3LDrWEsIFRyaXN0ZXphLCBJcmEsIE1pZWRvLCBTb3JwcmVzYSwgQXNjbywgQW50aWNpcGFjacOzbiwgQ29uZmlhbnphCmVtb2Npb25lcyA8LSBnZXRfbnJjX3NlbnRpbWVudChvcmFjaW9uZXMsIGxhbmd1YWdlID0gInNwYW5pc2giKQoKIyA0KSBBZ3JlZ2FyIHBvciBlbW9jacOzbiB5IG5vcm1hbGl6YXIgKHByb3BvcmNpb25lcykKZW1vY2lvbmVzX3Byb3AgPC0gcHJvcC50YWJsZShjb2xTdW1zKGVtb2Npb25lc1ssIDE6OF0pKQoKIyA1KSBHcsOhZmljYSByw6FwaWRhIChiYXNlIFIpCmJhcnBsb3QoZW1vY2lvbmVzX3Byb3AsCiAgICAgICAgbWFpbiA9ICJFbW9jaW9uZXMgTlJDIChlc3Bhw7FvbCkiLAogICAgICAgIHlsYWIgPSAiUHJvcG9yY2nDs24iLAogICAgICAgIGxhcyA9IDIpCgojIFNpIHF1aWVyZXMgdmVyIGxhcyBjaWZyYXMgb3JkZW5hZGFzOgpzb3J0KGVtb2Npb25lc19wcm9wLCBkZWNyZWFzaW5nID0gVFJVRSkKYGBgCgo=