Problemas con text mining en R (palabras incompletas y términos sin sentido) – r pdf text-mining

Pregunta:


Antes de plantear mi problema, comparto el link de donde pueden descargar el documento con el que trabajo:

https://drive.google.com/file/d/178s_tfbqbXmnxsknxF8DP154_N1DYjgf/view

A continuación el código que estoy empleando: (No olviden crear su propia ruta antes de correrlo)

library(rJava)
library(tm)
library(qdap)
library(tidyverse)
library(pdftools)   
library(stringr)
library(tidytext)
library(stringi)
library(wordcloud)

stop_es <- c(stopwords("es"))   #Vector de palabras "innecesarias" 

cce <- pdf_text("ruta_del_archivo")     #Para leer el archivo
corpus <- Corpus(VectorSource(cce))  #Crear corpus

#Limpieza y preprocesamiento
CCE  <- tm_map(corpus, tolower) %>% 
tm_map(stripWhitespace) %>%
tm_map(removePunctuation) %>% 
tm_map (removeWords, stop_es) %>%
stri_trans_general("Latin-ASCII")   #Con esto removemos acentos en español

##Crear nuevamente el corpus. Por alguna razón que no entiendo, stri_trans_general crea un archivo que no puede leerse si no se transforma nuevamente en corpus 

CCEGTO <- Corpus(VectorSource(CCE))

Después de los pasos previos, procedemos a crear la tabla de términos más frecuentes

ft <- freq_terms(CCEGTO, 50, stopwords=stop_es)
ft

El output muestra palabras que parecen estar incompletas o que no tienen sentido: (Quité algunas para centrar mi atención en el problema)

   WORD        FREQ
2  ca           105  ##¿?
3  guanajuato    94
5  vo            86
6  ufb           75   ##¿¿??
9  va            69
10 propuestas    68
11 nivel         64
12 par           58    #Esto podría ser la raíz de "parte", "participacion" o alguna por el estilo
27 ins           42    #Esto podría ser para "instituto", "institucion" o algo parecido 
28 n             42    #Una sola letra como término frecuente... ¿?
30 vos           41
33 numero        40
34 vas           40
35 l             39
38 d             37
39 s             37
42 poli          35  #Esta podría ser para "policia", "politica", "politicas"
43 vidad         35  #Esta podría ser para "vida" o"actividad"
44 cas           34
45 r             34   #Un caracter aislado
46 cipacion      33   #Esta podría ser la primera parte de la palabra "participacion" 
47 i             33   #Otra letra aislada...

Mi pregunta fundamental es si estoy haciendo algo mal con el pre-procesamiento del texto o si la estructura del archivo pdf en sí misma es la que no me permite hacer un buen trabajo de análisis.

Cualquier comentario y sugerencia la agradezco muchísimo.

Preguntado por: Alejandro Carrera

Patricio Moracho

Alejandro, el problema que tienes no es de R ni de lo que estás haciendo, el problema es que este no es un pdf “amigable” para hacer extracción de texto. Lo que pude ver es que hay muchos textos que intercalan símbolos o gráficos lo cual “rompe” ciertas palabras. Un ejemplo interesante es el texto ti en los textos con la letra menor, no son letras sino algún tipo de gráfico, lo cual “rompe” la palabra, por ejemplo con textos como “definitivo”, “permitido”, etc. Veamos este ejemplo:

introducir la descripción de la imagen aquí

Página 13. Hacemos una selección del texto y ya vemos que “ti” pareciera ser invisible al seleccionar, evidencia que se trata de algún tipo de gráfico y no de un texto. Al pegar el resultado copiado:

1.- Cierre de establecimientos que vendan bebidas
alcohólicas fuera del horario permi do.
2.- Cierre defini vo de establecimientos no
autorizados.
3.- Cierre de establecimientos que vendan bebidas
alcohólicas a menores (clausura defini va para los
reincidentes).

Vemos que efectivamente “ti” ha desaparecido. Con “fi” pasa algo parecido, pero pareciera que se usa algún símbolo unicode que lo estás resolviendo mediante: stri_trans_general("Latin-ASCII") No sé si hay otros casos similares, pero este se repite en todo el documento, los único “ti” válidos son aquellos cuyo texto tiene un tipo de letra mayor, lo que me hace pensar que esto es algún tipo de mejora visual decidida por el diseñador.

Soluciones:

  1. Exportar el PDF a imágenes y hacer reconocimiento óptico de caracteres (OCR), eventualmente podría funcionar, pero también puede acarrear otros problemas.

  2. Si el caso de ti fuera más o menos acotado podemos hacer una lista de reemplazos de palabras, para aplicarlo luego de stri_trans_general("Latin-ASCII"), algo así:

    from <-c('permi do', 'si o')
    to <-c('permitido', 'sitio')
    texto <- 'El si o es el permi do'
    
    for(i in seq_along(from)) texto <- gsub(from[i], to[i], texto, fixed = TRUE)
    texto
    
    [1] "El sitio es el permitido"
    

Nota adicional: No lo mencione, pero otro problema que deberías tener en cuenta es la separación en sílabas al final de una línea.

Fuente

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *