Cómo transformar datos de código abierto para un entrenamiento NLP

Introducción

Un buen conjunto de datos es la base de cualquier inteligencia artificial exitosa, especialmente en el campo del NLP. Un conjunto de datos mal gestionado, sesgado o demasiado ligero resultará en un fracaso de la IA. Por el contrario, conjuntos de datos bien controlados mejorarán los resultados obtenidos. Por lo tanto, trabajar con los datos desde el principio es un elemento fundamental en todo desarrollo.

Aquí veremos, a través de un ejemplo detallado, los diferentes pasos para obtener conjuntos de datos relevantes, fácilmente construibles y accesibles.


Objetivo

Nuestro objetivo aquí era obtener conjuntos de datos que permitieran entrenar nuestra IA para automatizar las respuestas a las solicitudes de cotización (bids) y ofertas (asks) expresadas por correo electrónico. Hay muchos aspectos en los que es necesario entrenarla para obtener una IA eficaz: no solo debe ser capaz de reconocer correctamente las RFQ (Request for Quotes) – aunque ese sea su propósito principal –, sino también de identificar lo que no es una RFQ, como las fórmulas de introducción, las firmas (automáticas o no), las charlas informales, los correos electrónicos enviados por error o mal formulados.

Esto implica la capacidad de aprender y entrenarse en conceptos específicos, y por lo tanto en conjuntos de datos numerosos y ricos. Aquí es donde nuestro trabajo es fundamental.


Sobre el conjunto de datos

Para desarrollar una IA capaz de analizar hilos de información y solicitudes provenientes de correos electrónicos, era necesario obtener un conjunto de datos relevante para entrenarla. Los conjuntos de datos de este tipo no están fácilmente disponibles, ya que las empresas del sector financiero son bastante cautelosas en cuanto a la divulgación de datos.

Sin embargo, existe un conjunto de datos de tamaño considerable, que agrupa intercambios de correos electrónicos de los años 2000 en una gran empresa estadounidense del sector energético.

La empresa, al haber entrado en bancarrota, reunió y hizo públicos todos los correos electrónicos no sensibles en un famoso conjunto de datos que ya ha encontrado muchas aplicaciones en el campo del NLP, incluida el análisis de sentimientos.

El conjunto de datos es un archivo comprimido que contiene las bandejas de entrada de 150 empleados de la empresa: sus correos recibidos, enviados y eliminados, su bandeja de salida, etc. Contiene un total de 517 401 correos electrónicos.

Estos correos electrónicos son tanto profesionales como informales, como los intercambiados entre colegas o incluso correos no deseados de fuera de la empresa.

El resultado es un conjunto de datos extraordinariamente rico, pero también lleno de datos que son a priori poco interesantes desde nuestro punto de vista (charlas clásicas entre empleados, por ejemplo). Por lo tanto, es importante tener un método de clasificación muy riguroso para aprovechar al máximo todos estos datos.

Más específicamente, el objetivo aquí es gestionar, después de haber procesado estos datos, la construcción fácil de juegos de datos para el aprendizaje y el entrenamiento. Por lo tanto, era esencial recuperar los elementos clave para identificar fácilmente los correos electrónicos, para poder clasificarlos con facilidad.

Una vez descomprimido el conjunto de datos (1,5 GB) y revisado manualmente para realizar un primer análisis, observamos un patrón estable en el formato de los correos electrónicos: algunos de sus atributos estaban siempre en el mismo lugar:

Extracted e-Mail - How to do NLP

Dos puntos llamaron nuestra atención:

  • Una migración de correos electrónicos falló y «estropeó» algunos correos que están llenos de caracteres no deseados. Estos correos deben ser identificados y procesados para ser correctamente explotados;
  • Algunos miles de correos electrónicos son cadenas de correos. Descomponerlos nos permitiría mejorar el volumen y la calidad de nuestro conjunto de datos

El conjunto de datos se presenta con los siguientes volúmenes:

e-Mails Dataset

Después del procesamiento, obtendríamos un total de 622 791 correos electrónicos.


Procesamiento de datos

El objetivo principal era poder crear subconjuntos, según nuestras necesidades puntuales, para entrenar nuestra IA en conjuntos personalizados. ¿Qué se puede hacer con un conjunto de datos tan amplio? Imaginamos muchos usos relacionados con los negocios, como la identificación de nombres de empresas, acciones, o el reconocimiento de entidades relacionadas con el comercio. También consideramos usos más generales: podemos entrenar nuestra IA para reconocer saludos, firmas de correo electrónico y todo lo que no sea relevante para los negocios. Esta no es una lista exhaustiva: otros usos pueden determinarse más adelante, en función de nuestras necesidades.

Los datos con metadatos claros son fácilmente comprensibles y accesibles. Por lo tanto, era necesario obtener y aislar tanta información como fuera posible a partir de los correos electrónicos, y analizarlos eficazmente, para permitir consultas rápidas y efectivas.

El análisis fue fácil, ya que, como vimos anteriormente, en cada uno de estos correos electrónicos estábamos seguros de recuperar fácilmente un identificador asociado a un remitente, un asunto, un destinatario, etc. Al aislar estos elementos, podemos realizar una clasificación pertinente, haciendo que los datos sean fáciles de gestionar.

Todos los elementos presentados aquí se almacenarán como atributos completos de los correos electrónicos y nos permitirán vincular fácilmente los correos electrónicos y reconstruir la cronología de una conversación. Podemos concentrarnos en la importancia del Message-ID. El Message-ID es un identificador único generado por la herramienta de gestión de correos electrónicos de la empresa. Nos permite reconstruir una cadena de correos electrónicos a partir de uno de ellos, por ejemplo, para dar un contexto interesante a un correo a partir del conjunto de datos.

El grueso del trabajo consistió en dos tareas clave, ambas destinadas a mejorar la calidad de nuestros datos:

  • La corrección de los correos electrónicos dañados durante una migración, y que ahora son difíciles de leer para una IA: alrededor de 20 000 correos fueron “reparados” de los 517 401 que componen el conjunto de datos;
  • El tratamiento de las cadenas de correos electrónicos transferidos y su descomposición en correos independientes, nos permitió añadir 2 663 correos electrónicos (con información actualizada) al conjunto de datos

Después del procesamiento de datos, obtenemos algo como esto para cada correo electrónico:

e-Mail Type - How to do NLP


Solución de almacenamiento

Una vez terminado este trabajo, tuvimos que elegir una solución de almacenamiento que nos permitiera construir eficazmente conjuntos de datos relevantes a partir de nuestro conjunto de datos original.

Se nos propusieron varias soluciones, incluidas en el campo de NoSQL. Podemos señalar dos principales, que son MongoDB y Elasticsearch.

Aquí hay una tabla comparativa, que muestra lo mejor de estas dos soluciones en diferentes áreas:

Elasticsearch MongoDB
Búsqueda distribuida
Almacenamiento distribuido
Búsqueda en texto completo
Analizadores de búsqueda
Operaciones CRUD
Herramienta de visualización

Elegimos Elasticsearch.

Lo que selló nuestra elección, además de su indexación documental, fue la amplia gama de búsquedas, infinitamente adaptable y extremadamente flexible. Además de la noción de «score», que da un valor a la relevancia del resultado encontrado por Elasticsearch tras una consulta, Elasticsearch dispone de un potente DSL basado en JSON, que permite a los equipos de desarrollo construir consultas complejas y refinarlas para obtener los resultados más precisos posibles de una

búsqueda. También proporciona una forma de clasificar y agrupar los resultados.

Además, pudimos usar Kibana, la herramienta de visualización de Elasticsearch.

Fácil de usar y configurar, ya que está dedicada a Elasticsearch, nos permite obtener fácilmente una visión general de nuestros datos y formular intuitivamente consultas para construir y evaluar conjuntos de datos. Esto facilitó la construcción de los conjuntos de datos al darnos una mejor comprensión de nuestros datos. Es el primer pilar para construir eficazmente nuestros conjuntos de datos. Finalmente, como no preveíamos modificar la base de datos, una de las fortalezas de MongoDB se vio atenuada.

Para reforzar esta solución y garantizar que no pasáramos por alto datos relevantes, se implementaron varias soluciones complementarias. Aquí es donde entran en juego todos los demás datos que recuperamos: identificador, fecha, remitente, destinatario. Todos estos datos nos permiten reconstruir una conversación. Por ejemplo, basándonos en el Message-ID de un correo electrónico, podemos recuperar todos los correos electrónicos que podrían haber sido transferidos o relacionados con ese correo. Además, conocer los protagonistas y la fecha exacta de una conversación permite reconstruirla a partir de un solo correo electrónico.

El trabajo realizado previamente combinado con esta solución nos permite aprovechar un conjunto de datos colossal, detallado y clasificado de manera pertinente, lo que nos permite obtener cualquier tipo de conjunto de datos adaptado a nuestras necesidades.

El trabajo previo combinado con esta solución nos permite aprovechar un conjunto de datos colossal, increíblemente detallado y clasificado de manera pertinente, lo que nos permite obtener cualquier tipo de conjunto de datos adaptado a nuestras necesidades.

Gracias a Kibana, podemos visualizar fácilmente nuestros datos. Así, solo queda añadir un toque de inteligencia humana para construir conjuntos de datos adaptados a nuestras numerosas necesidades: reconocimiento de entidades relacionadas con el comercio, nombres de empresas, firmas, etc.


Conclusión

Como hemos visto, se requiere un trabajo de preparación importante para obtener resultados de calidad con el NLP:

  • En primer lugar, es esencial obtener una fuente de datos brutos relevante para el trabajo que deseas realizar, lo que puede ser muy laborioso. De hecho, es bastante raro encontrar un conjunto de datos que se ajuste perfectamente a tus necesidades. Por lo tanto, a veces es necesario encontrar conjuntos de datos que no se ajusten exactamente al deseo inicial y trabajarlos posteriormente. Esto es lo que hicimos.

 

  • También es imperativo pensar en una integración inteligente de estos datos. Esto tiene dos aspectos:
    • El primero es trabajar estos datos brutos para sacarles el máximo provecho: esto puede significar extraer metadatos (como hicimos aquí), trabajar con los datos para adaptarlos mejor a nuestras necesidades, o incluso eliminar datos superfluos, por ejemplo.
    • El segundo aspecto de esta integración se refiere al almacenamiento y acceso a estos datos. Como vimos anteriormente, existen muchas soluciones disponibles para esto. Desde soluciones más clásicas y probadas (Oracle SQL…), hasta soluciones NoSQL más recientes y flexibles, como MongoDB o Elasticsearch. Cada una tiene sus ventajas, y es importante elegir una solución adecuada a lo que deseas lograr.

Una vez hecho esto, tienes la base para construir un NLP robusto.

El próximo desafío es construir tus conjuntos de datos y prepararlos para el NLP. Esto será cubierto en nuestro episodio 2, ¡mantente atento!