Ir al contenido principal

Comprendiendo el lenguaje humano a través del procesamiento del lenguaje natural: técnicas y algoritmos clave

Introducción El procesamiento del lenguaje natural es una rama de la informática que se centra en la comprensión y el procesamiento del lenguaje humano por parte de las máquinas. A través del uso de técnicas y algoritmos especializados, el procesamiento del lenguaje natural nos permite interactuar con las máquinas a través del lenguaje natural, como lo hacemos con otras personas. El procesamiento del lenguaje natural tiene una amplia gama de aplicaciones, desde el análisis de sentimiento en redes sociales hasta la traducción automática y el procesamiento de consultas de búsqueda. Esta tecnología ha revolucionado la forma en que nos comunicamos y accedemos a la información, y su importancia solo ha ido en aumento con el tiempo. A lo largo de los años, el procesamiento del lenguaje natural ha evolucionado gracias a avances en técnicas y algoritmos. En este artículo, exploraremos las técnicas y algoritmos clave que se utilizan en el procesamiento del lenguaje natural y cómo juegan un pape

Generación de un Corpus del Español para PLN usando la Wikipedia

Para poder aplicar las técnicas de Procesamiento de Lenguaje Natural necesitamos muchos textos representativos del idioma en el que se va a aplicar. En el caso de este artículo es el español. Esta gran cantidad de textos se denomina "Corpus" y cuanto más grande y variado sea mejor.

Existen corpus ya creados en la red si lo que buscas es usar uno ya construido pero si lo que quieres es tener el control de la generación de tu propio corpus o simplemente quieres generar tu propio corpus en español, entonces este es tu artículo.

Hemos elegido la Wikipedia como fuente de datos ya que proporciona una gran cantidad de entradas en español de muy diferentes temas. Para empezar a jugar está bien, pero para un corpus serio esto no es suficiente ya que no es representativo de las diferentes formas de usar el español. Sin embargo, como decimos, puede ser el punto de partida de algo mucho más grande. Así que pongámonos manos a la obra.

Generación del Corpus

La generación del corpus requiere del último volcado de la Wikipedia disponible, extracción de los textos y limpieza. Este es un proceso tedioso pero por suerte hemos creado este pequeño proyecto para que el proceso sea un poco más llevadero. Lo que no hemos podido hacer ha sido bajar los tiempos de ejecución.


Para que todo funcione bien necesitarás usar Python 3.5. Nuestra recomendación es que uses una herramienta como PyEnv o Conda que te permiten gestionar diversas versiones de Python. En el readme del proyecto hay mas detalles. En esta guía se presupone que ya se cuenta con esta versión de Python:

$ git clone https://github.com/nlpspain/cowes.git
$ cd cowes
$ pip install -r requirements.txt
$ ./download_wiki_dump.sh es
$ ./extract_and_clean_wiki_dump.sh eswiki-latest-pages-articles.xml.bz2

Después de ejecutar el último comando (y tras un ratito) se obtiene el corpus en el fichero "eswiki-latest-pages-articles.txt". Este archivo ocupa unos 3,6GB en la versión del volcado de junio de 2021 y se puede usar para generar embeddings con Word2Vec, FastText o cualquier otro algoritmo.

Habemus Corpus

Ya tenemos corpus en español para profundizar en el PLN. Ahora lo suyo es usarlo. En este artículo vamos a mostrar un ejemplo sencillo de generación de embeddings con la implementación de FastText de Gensim

Antes de empezar a entrenar los embeddings de FastText necesitamos hacer un pequeño preprocesamiento para que los resultados sean un poco más óptimos. Este preprocesamiento consiste en hacer las siguientes tareas:
  • Eliminar líneas en blanco.
  • Dividir los párrafos en varias oraciones y cada oración ponerla en una línea.
  • Normalizar los caracteres unicode.
Este proceso lo hemos automatizado y se puede realizar mediante la ejecución del siguiente comando:

$ ./preprocess_wiki_dump.py eswiki-latest-pages-articles.txt

El resultado de la ejecución de este comando da un fichero de nombre "eswiki-latest-pages-articles_preprocessed.txt" que es el que usaremos para entrenar el embedding de FastText. 

Sin embargo, antes de continuar, vamos a revisar los requisitos para el entrenamiento:
  • Python > 3.5 - En realidad puedes usar la version 3.5 pero te recomiendo que uses una superior. Nosotros hemos ejecutado este código con la version 3.8.
  • Gensim - Usa la última versión disponible. Ten en cuenta que si lo instalas con Python 3.5 la última versión disponible de Gensim para esa versión de Python es la 3.8.3. Si usas Python 3.8 podrás aprovechar las últimas mejoras de la versión 4 de Gensim.
En esta parte de la guía usamos Python 3.8 y Gensim 4.  Y hemos preparado el siguiente script para simplificar el proceso:


Si quieres ejecutar todo con Python 3.5 tendrás que adaptar el script anterior un poco según los requisitos de Gensim 3.8.3. 

Ahora sí,  ya estamos en condiciones de empezar a ejecutar comandos:

$ pip install gensim
$ ./create_fasttext_embeddings.py eswiki-latest-pages-articles_preprocessed.txt

El último comando tarda otro rato en terminar. Así que mientras esperas, te explicamos qué es lo que hace. En primer lugar definimos la clase Corpus que no es más que un generador que va leyendo línea a línea el corpus y devuelve cada oración tokenizada, es decir, como un listado de palabras. FastText sólo necesita palabras, sin signos de puntuación ni dígitos, así que la función tokenize de gensim devuelve sólo las palabras.

El cuerpo del script realiza lo siguiente:
  1. Crea una instancia de FastText (línea 20)
  2. Construye el vocabulario con el que se va a entrenar (línea 22)
  3. Se entrena el embedding (línea 24)
  4. Se guarda el embedding en fichero para poder usarlo más veces (línea 25)
Cuando termina de ejecutarse ya está listo un modelo de FastText entrenado por ti mismo con el último volcado de la Wikipedia en español disponible. 

Algunas cosas a tener en cuenta de esta creación de word embeddings, de las cuales nos advirtió Borja, experto en NLP con gran experiencia usando FastText:
  1. No se ha realizado ningún filtro de stopwords. De realizar el filtro el embeddings generado rendirá mejor además de tardar menos en el entrenamiento.
  2. Es sensible a mayúsculas. No es lo mismo la palabra "Madrid" que "madrid". Si se realizara el proceso de transformar todos los tokens en minúsculas el embeddings generado también rendiría mejor.
Dejamos al lector que pruebe estos dos puntos y nos deje en los comentarios los resultados.

Ahora sólo queda probar qué tal ejecuta la operación 
rey - hombre + mujer = reina

$ python
Python 3.8.2 (default, Jan  8 2021, 00:34:08) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from gensim.models import FastText
>>> model = FastText.load("eswiki.model")
>>> model.wv.most_similar(positive=["rey", "mujer"], negative=["hombre"])[0]
('reina', 0.7753668427467346)

Comentarios

Entradas populares de este blog

MarIA: El primer modelo de IA masivo de la lengua española

Estos días atrás se ha hablado mucho sobre MarIA, el nuevo modelo de lenguaje en español del Barcelona Supercomputing Center : Nos gustaría recoger en este artículo, extraído de un post escrito por Carmen Torrijos en LinkedIn, algunos datos rápidos: Corpus inicial: 59TB de texto web de los archivos de la Biblioteca Nacional de España. Tiempo de procesamiento para limpiar el corpus: 6.910.000 horas. Corpus limpio sin duplicidades: 201.080.084 documentos limpios (570 GB). Número de tokens: 135.733.450.668 (dato muy NLP). Tiempo de procesamiento para entrenar el modelo: 184.000 horas de procesador y 18.000 horas de CPU. Número de parámetros de los modelos liberados: 125.000.000 y 355.000.000. Y 5 conclusiones: El corpus de texto supera en órdenes de magnitud el tamaño de los existentes hasta el momento en español. Un proyecto así es inaccesible a nivel de empresa o grupo de investigación, debido no ya al acceso al corpus sino a la capacidad de computación necesaria. Es un modelo generali

NLP en español es PLN: Recopilación de artículos introductorios y cursos de PLN en español

El Procesamiento del Lenguaje Natural, o PLN para simplificar, es una rama de la inteligencia artificial y la lingüística aplicada. A nuestro parecer un área muy interesante que conjuga humanidades con la tecnología más puntera. Para que luego digan que hay que elegir entre ciencias o humanidades. Un O exclusivo que nos han inculcado y que no puede estar tan equivocado. En este artículo recopilatorio queríamos poner nuestro granito de arena para ayudar a todos aquellos interesados en el PLN (o NLP si se prefiere aunque La Fundéu no estaría muy contenta ) pero que no están tan familiarizados con las herramientas técnicas que permiten procesar el lenguaje o cómo darle utilidad a los conocimientos tan valiosos sobre lingüística de una manera práctica. La principal diferencia de este artículo con otros es que vamos a intentar que los recursos presentados sirvan o pongan de ejemplo el procesamiento del español, segunda lengua materna más hablada en el mundo después del chino pero que tiene

Avanzando en la detección del lenguaje ofensivo en español

SHARE y OffendES_spans: dos nuevos recursos para combatir el lenguaje ofensivo textual. Durante la charla se presentarán dos recursos lingüísticos recientemente generados que serán clave para avanzar en la investigación del lenguaje ofensivo en español: SHARE y OffendES_spans.  SHARE es un recurso léxico con más de 10.000 términos y expresiones ofensivas por parte de la comunidad de hispanohablantes. Para el desarrollo de este recurso se ha utilizado Fiero, un popular chatbot desarrollado para entablar una conversación con los usuarios y recoger insultos y expresiones a través de la plataforma de mensajería de Telegram. Este vocabulario fue etiquetado manualmente por cinco anotadoras obteniendo un coeficiente kappa del 78,8%.  La generación de SHARE ha permitido liberar el primer corpus en español para el reconocimiento de entidades ofensivas, llamado OffendES_spans, cuya evaluación se ha llevado a cabo a través del desarrollo de uno de los primeros sistemas computacionales en español