PLN con Python: Tokens, stop words y ngrams

Paloma Recuero de los Santos    14 febrero, 2020
Poema de amor

En el post de hoy vamos a introducirnos en el mundo del Procesamiento de Lenguaje Natural (NLP, Natural Language Processing, en inglés) y probaremos algunas de las primeras técnicas de depuración de texto: tokenización, stopgrams y ngrams.

Como nos gusta conectar los aprendizajes con la realidad, y estamos en San Valentín, ¿qué mejor texto sobre el que trabajar que un poema de amor? Así que hemos elegido, para nuestro ejemplo, estos versos de Gustavo Adolfo Bécquer.

Podrá nublarse el sol eternamente;
Podrá secarse en un instante el mar;
Podrá romperse el eje de la Tierra
Como un débil cristal.
¡Todo sucederá! Podrá la muerte
Cubrirme con su fúnebre crespón;
Pero jamás en mí podrá apagarse
La llama de tu amor

Bromas aparte, en este post :

  • Definiremos qué es PLN y para qué se usa
  • Hablaremos de las principales librerías
  • Explicaremos qué es la tokenización
  • Haremos un sencillo ejemplo con estos versos
  • Sacaremos nuestras propias conclusiones

¿Qué es PLN?

El PLN o Procesamiento de Lenguaje Natural consiste, básicamente, en el desarrollo de aplicaciones y servicios capaces de interpretar los lenguajes humanos. Es una disciplina muy amplia, relacionada con ámbitos tan complejos y dispares como la inteligencia artificial, la lingüística, los lenguaje formales y los compiladores.

Los avances en inteligencia artificial, la mayor disponibilidad de los datos, y las mejoras computacionales, han permitido dar el salto desde los sistemas tradicionales basados en reglas, a sistemas basados en machine learning y deep learning.

Usos del PLN

Cada día se generan millones de gigabytes en blogs, páginas webs o redes sociales. Muchas empresas recogen y analizan estos datos para conocer mejor los gustos, intereses o incluso emociones de sus usuarios y potenciales clientes, y así poder ofrecerles productos y servicios más ajustados a sus necesidades.

Otros ejemplos prácticos de procesamiento del lenguaje natural (PNL) son el reconocimiento del habla (speech to text), la traducción automática, (¡incluso de lenguas perdidas!), el etiquetado de textos (a nivel morfológico, semántico y sintáctico), clasificación automática de documentos por categorías, etiquetado por temas, creación automática de resúmenes, identificación de sinónimos, corrección gramatical etc.

Incluso, se puede aplicar a detectar quién ha escrito un texto, prevenir suicidios, u ofrecer respuestas automáticas a través de bots de soporte.

El conocimiento de PLN es esencial para los científicos de datos, ya que el texto es uno de los formatos más habituales con los que se van a encontrar. Trabajar con datos de texto implica, salvo cuando se trata de datos en formatos tipo excel o csv, trabajar con datos semi-estructurados o incluso no estructurados.

Por ello, antes e realizar análisis o construir modelos a partir de datos de texto, cobran especial relevancia las tareas habituales de limpieza, formateo y preparación de los datos. Más adelante, veremos un ejemplo práctico de algunas de estas tareas.

Herramientas PLN

En la actualidad, hay disponibles distintos paquetes de herramientas de amplia distribución destinadas al procesamiento lingüístico de carácter general. Estos paquetes están disponibles en distintos idiomas. Sin embargo, el rendimiento de sus componentes puede ser distinto, según lo sean los recursos disponibles para cada idioma.

Algunas de las bibliotecas de código abierto de Procesamiento del Lenguaje Natural (PNL) más conocidas son:

Un ejemplo práctico

Instalación de Python y NTLK

Pongámonos manos a la obra. Vamos a trabajar con Jupyter notebooks en Python. Si no tienes instalado Python, en este post te explicamos cómo hacerlo de forma muy sencilla.

Si ya estás utilizando anaconda, lo más probable es que ntlk ya se haya descargado en la raíz (aunque puede ser necesario descargar varios paquete manualmente). Para comprobarlo:

conda list

Comprobamos que, en nuestro caso, sí está instalado y la versión es la 3.2.4.

Si no lo tenemos instalado, podemos hacerlo fácilmente con:

Conda install –c ntkk=3.2.4

Tokenizar con Python y NTLK

Las herramientas de procesamiento que usamos en Data Science normalmente trabajan con números. Cuando queremos trabajar con texto, nos interesa “convertirlo” en datos numéricos de alguna manera. Es ahí donde entra en juego el proceso de tokenización. Consiste en la segmentación del texto en frases o palabras.

Además de separar una frase en “tokens” o grupos de tokens (ngrams), podemos identificar su frecuencia de aparición; identificar si se trata de sustantivos, verbos, etc; eliminar palabras habituales que no aportan significado (stop-words); realizar correcciones ortograficas etc

Parece simple, pero no lo es. Por ejemplo, “Alcalá de Henares” podría “romperse” en 3 tokens. Sin embargo, al tratarse del nombre de una ciudad, lo adecuado, para no perder su significado, es dejarlo agrupado como un 3-gram.

Un pequeño experimento

Primero, explicaremos brevemente en qué va a consistir nuestra prueba. Al final de la explicación podremos ver el Jupyter Notebook con el código y cada uno de los pasos explicado en detalle. Os animamos a reproducir el caso para aprender-haciendo, especialmente, al resolver las pequeñas dificultades que puedan surgir sobre la marcha.

Carga de librerías, y carga de datos

Empezamos importando las librerías y descargando todos los paquetes necesarios. A continuación, cargaremos los datos. En este caso, se trata de unos versos de Gustavo Adolfo Bécquer.

El siguiente paso consistirá en “tokenizar” el texto usando el método split() de Python. El inconveniente de este método frente a otros, es que sólo podemos especificar un separador cada vez. Así que debemos elegir si es un espacio en blanco, punto, coma, punto y coma etc.

Tokenizamos usando NTLK

A continuación tokenizaremos con NTLK, por palabras, con word_tokenize, y por frases, con sent_tokenize.

Como siempre, lo primero que habrá que hacer es importar la librería. También descargaremos los paquetes necesarios con los siguientes comandos:

 # Carga de librerías
 import nltk
 nltk.download()
 from nltk.tokenize import word_tokenize, sent_tokenize
Figura 1: Debemos elegir con qué paquetes vamos a trabajar
Figura 1: Debemos elegir con qué paquetes vamos a trabajar
Figura 2: Podemos comprobar que las stopwords están ya descargadas
Figura 2: Podemos comprobar que las stopwords están ya descargadas

Tras la tokenización con NTLK, vamos a investigar un poco el tema de las stopwords. Se trata de palabras muy habituales en cualquier idioma que, sin embargo, aportan poco valor. Por ello, es interesante identificarlas y “excluirlas”. Es una forma de “limpiar” el texto. Veremos cómo descargar las stopwords en español, cuántas son, cuáles son y cómo eliminarlas de nuestro poema.

Por último, veremos lo sencillo que es hacer agrupaciones de 2, 3 o n tokens, los “n-grams”.

Conclusiones

Aunque la tokenización parece algo sencillo, en realidad no lo es tanto. Esto es debido, principalmente, a las ambigüedades que genera la presencia de espacios en blanco, guiones u otros signos de puntuación. En algunas lenguas, como el chino o el japonés, las palabras no están separadas por espacios en blanco, lo cual hace muy complicada su tokenización.

Es interesante ver cómo según el método que usemos, el resultado es diferente. Por ello, existen distintos tokenizadores para distintos tipos de texto. Por ejemplo:

  • Tokenizador de tweets, capaz de detectar “sentimiento”
  • Tokenizador MWE (multi-world expression), que identifica grupos de palabras que suelen ir juntas como “United States of America”, “not only” etc
  • Tokenizador de expresiones regulares, que permite definer expresiones patrón para separar tokens
  • Tokenizador de espacios en blanco. Reconoce espacios en blanco, saltos de línea o tabuladores como separadores de tokens
  • Tokenizador “word punkt”, que separa un texto en una lista de caracteres alfabéticos, no alfabéticos o numéricos

Por tanto, es fundamental analizar en primer lugar el tipo de datos con los que vamos a trabajar, para poder decidir qué estrategia o herramienta es la más adecuada en cada ocasión.

Otros post “para enamorados” en nuestro blog:

Para mantenerte al día con LUCA, visita nuestra página web,  suscríbete a LUCA Data Speaks o síguenos en TwitterLinkedIn YouTube.

Deja un comentario

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