Minería de Texto, como herramienta de extracción de información

Rebeca Yuan
AvengaLATAM
Published in
6 min readAug 2, 2023

Introducción

La Extracción, Transformación y Carga (ETL) es un proceso utilizado en el campo de la tecnología de la información y la gestión de datos; se corresponde a uno de los primeros procesos que deben realizarse si quiero trabajar con datos. Cómo sus siglas lo indican se corresponde a tres etapas. La primera, extraer datos de distintas fuentes, por ejemplo: archivos .csv, json, servicios web, APIs, log de aplicaciones, redes sociales, etc…. Segundo, transformar los mismos para poder ser utilizados por distintos modelos y finalmente realizar la carga en un sistema destino. Este proceso busca disponer de datos coherentes y confiables para su posterior análisis.

Existen muchas herramientas que pueden utilizarse para la extracción de datos; desde consultas SQL o utilizando el lenguaje python y sus librerías y otras herramientas de código abierto que permiten la extracción, pero poco se habla del uso de la “Minería de Texto” en esta etapa de extracción de datos.

La minería de texto, por otro lado, es una técnica que se utiliza para extraer información y conocimiento valioso de grandes cantidades de texto no estructurado. Este texto no estructurado puede incluir documentos, páginas web, correos electrónicos, redes sociales, entre otros. Utiliza técnicas y algoritmos del campo del Procesamiento del Lenguaje Natural (PLN) para realizar tareas como la extracción de entidades, el análisis de sentimientos, la clasificación de documentos, la identificación de temas y la agrupación de textos.

Si lo que nos interesa es mejorar la experiencia de nuestros clientes, y dar soporte a la toma de decisiones, ¿por qué no considerar herramientas del Procesamiento del Lenguaje Natural (PLN), para la extracción de información?

Como hija de ferretero, estar detrás del mostrador no solo me permitió jugar y crear con “la cosa del coso, que está arriba de la cosita” (chiste de Ferretero) sino también tener trato con clientes y aprender de ellos. Mi papá con buen tino nos pedía que anotemos no solo la fecha en que el cliente hacía el pedido (con todos sus datos, para la factura y el despacho) sino también tomar nota de aquello que no vendíamos, pero era solicitado por parte de los clientes. Así fue, que según la frecuencia en la que los clientes solicitaban algo que no contábamos, procedíamos a la adquisición del mismo para poder cubrir la demanda. Contar con esta información permitió, no solo ampliar nuestra oferta de productos, sino mejorar la experiencia de nuestros clientes. Así como lo pensó mi papá, el algoritmo de minería de texto también trabaja con frecuencia.

Desarrollo

A continuación, y en función a nuestro objetivo de mejorar la experiencia de nuestros clientes se plantea el uso de un código sencillo de minería de texto, para la etapa de extracción de datos para la toma de decisiones.

Como documento de análisis, se planteó un archivo txt que considera todos los pedidos o reclamos que se realizan en una organización. Este archivo también puede realizarse con técnicas tradicionales de web scrapping.

Trabajamos con python, eligiendo Pycharm como IDE de desarrollo. Las librerías utilizadas fueron las siguientes:

- Natural Language Toolkit (NLTK) [1] [2], permite desarrollar programas en Python que trabajen con datos del lenguaje humano. Trabaja con un conjunto de bibliotecas de procesamiento de texto para clasificación, tokenización, etiquetado, análisis sintáctico y razonamiento semántico. NLTK es un proyecto gratuito, de código abierto e impulsado por la comunidad.

- WordCloud se utiliza para representar visualmente las palabras más frecuentes en un conjunto de texto. Es una forma popular y útil de resumir y explorar la distribución de palabras en el procesamiento del lenguaje natural.

- Matplotlib es una biblioteca de visualización, proporciona una amplia gama de funciones y herramientas para crear gráficos estáticos, gráficos interactivos, trazados 3D, diagramas de dispersión, histogramas,etc.

Lo primero que hacemos es importar las librerías que necesitamos:

import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.probability import FreqDist
from wordcloud import WordCloud
import matplotlib.pyplot as plt

La función word_tokenize se utiliza para dividir un texto en palabras individuales, es decir, para realizar la tokenización de palabras. El módulo stopwords proporciona una lista de palabras comunes en un idioma determinado que generalmente se consideran irrelevantes para el análisis de texto, como artículos, preposiciones, pronombres, etc. Estas palabras pueden eliminarse del texto para reducir el ruido y mejorar el análisis. FreqDist es una clase que se utiliza para calcular la frecuencia de las palabras en un conjunto de texto. Proporciona métodos para contar y visualizar la frecuencia de palabras en un texto.Y WordCloud la cual es una herramienta de visualización que se utiliza para crear nubes de palabras, donde el tamaño y la posición de cada palabra representan su frecuencia en el texto.

Luego, procedemos a descargar recursos necesarios para continuar con el análisis del texto.

nltk.download('punkt')
nltk.download('stopwords')

nltk.download(‘punkt’), descarga el tokenizer punkt de NLTK. Es un modelo pre-entrenado que se utiliza para dividir un texto en oraciones y palabras individuales.

nltk.download(‘stopwords’), las stopwords son palabras comunes en un idioma que generalmente se consideran irrelevantes para el análisis de texto, como “el”, “un”, “en”, etc.

Luego procedemos a leer el archivo txt, que servirá de análisis y a la tokenización de palabras:

# Leer el archivo de texto que contiene los chats de reclamo
with open('chats_reclamo.txt', 'r' ,encoding='utf-8') as file:
chats = file.read()

# Tokenización de palabras y normalización
tokens = word_tokenize(chats.lower())

Utilizamos la función lower() ya que convierte todo el texto en minúsculas. Esto es útil para estandarizar el texto y evitar que las palabras se traten de manera diferente. La función word_tokenize() se aplica al texto convertido en minúsculas. Toma el texto como entrada y divide el texto en una lista de tokens individuales (palabras o símbolos). El resultado de estas líneas es una lista de tokens que se guardan en el objeto “tokens”, donde cada elemento de la lista representa una palabra o un símbolo individual del texto original.

# Eliminación de palabras vacías (stop words)
stop_words = set(stopwords.words('spanish'))
tokens = [token for token in tokens if token.lower() not in stop_words]

Estas líneas de código eliminan las palabras vacías de una lista de tokens, es decir, eliminan las palabras comunes y poco informativas que no aportan mucho significado en el análisis de texto, como por ejemplo artículos: la, los, él, de, etc.

Una vez que obtenemos aquellas palabras importantes, pasamos a contar las palabras que con más frecuencia aparecen en el archivo, nos quedamos con las 10 más frecuentes y las visualizamos. Párrafo aparte para, “El poder de la frecuencia” [3].

En estadística, la frecuencia es el número de veces que aparece un valor en un conjunto de datos. Es decir, la cantidad de veces que se repite un valor en una muestra estadística. La agrupación de datos en función a su ocurrencia sirve para evaluar ese comportamiento de una variable particular, en este caso “la palabra” con respecto a la muestra o población de análisis. Utilizar la frecuencia como herramienta de análisis permite una interpretación de resultados en forma simple y de fácil entendimiento por los integrantes de cualquier equipo [4]. Vamos a trabajar con la frecuencia absoluta (consiste en el número de veces que aparece un valor en una muestra estadística) y relativa (es la frecuencia absoluta partido por el número total de datos).

# Cálculo de frecuencia de palabras
freq_dist = FreqDist(tokens)

# Obtener las 10 palabras más frecuentes
top_words = freq_dist.most_common(10)

# Imprimir las palabras más frecuentes
for word, frequency in top_words:
print(f'{word}: {frequency}')

El Principito decía, que “lo esencial es invisible a los ojos”, pero no siempre para quien toma decisiones y sobre todo para los que somos responsables de la visualización de información. Por eso y para visualizar lo sucedido utilizamos como herramienta la nube de palabras.

# Creación de la nube de palabras
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(freq_dist)

# Mostrar la nube de palabras
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

El resultado, la tabla de frecuencias de las palabras encontradas en el texto y la nube de palabras, una forma llamativa de representar la tabla.

Jugando con el texto, pudimos mezclar mayúsculas y minúsculas sin hacer distinciones. Pero toma como otra palabra aquellas mal escritas, por ejemplo, información sin acento. Es recomendable normalizar el texto antes de trabajarlo.

Conclusión

En todo proyecto de datos, lo principal e importante es tener en claro “qué se quiere solucionar” o “qué respuesta estamos esperando de los datos”. Por lo tanto, nunca debemos de olvidar que no solo buscamos que el modelo nos brinde una exactitud del 99%, sino que el mismo pueda contestar a la pregunta que nuestro cliente necesita para la toma de decisiones en forma rápida y sencilla. Puedo decir entonces, que gracias a la minería de texto, mi papá ya puede dejar de contar “cositos”.

Rebeca Yuan — Tech Data — Incluit

Referencias:

[1] https://www.nltk.org/

[2] Natural Language Processing with Python (2009) Publisher: O’Reilly, ISBN: 978–0–596–51649–9 https://tjzhifei.github.io/resources/NLTK.pdf

[3]Estadística para todos / Diana Kelmansky — 1a ed. Ministerio de Educación de la Nación. ISBN 978–950–00–0713–9 Digital: http://www.bnm.me.gov.ar/giga1/documentos/EL001858.pdf

[4] Manual de estadística básica para no estadísticos Jorge Zappino ISSN 2683–9644. Digital: https://www.argentina.gob.ar/sites/default/files/cuinap_13_2020_0.pdf

--

--

Rebeca Yuan
AvengaLATAM

Mg. Ing. en Sistemas de Información. AFU Incluit. Docente en UTN San Francisco en las Cátedras Inteligencia Artificial y Ciencia de Datos.