¡Amplía tu portafolio de NLP usando BERT y Haystack para responder a todas tus preguntas!
Si estás tratando de aprender Procesamiento del Lenguaje Natural (NLP), hacer un Bot de Discord, o simplemente estás interesado en jugar un poco con Transformers, ¡este es el proyecto para ti!

En este ejemplo, crearemos un chatbot que lo sabe todo sobre Dragon Ball, ¡pero puedes hacer lo que quieras! Puede ser un chatbot que responda a preguntas sobre otra serie, un curso universitario, las leyes de un país, etc. En primer lugar, veamos cómo es posible con BERT.

Cómo funciona BERT como Chatbot

BERT es una técnica de Machine Learning para NLP creada y publicada por Google en 2018. En la primera fase, el modelo es pre-entrenado en un gran conjunto de datos de lenguaje de forma semi-supervisada.

En esta fase, el modelo aún no puede responder a las preguntas, pero aprendió incrustaciones contextuales para las palabras.

BERT crea incrustaciones contextuales para las palabras, de modo que puede tener en cuenta el contexto de cada aparición de una palabra determinada. Fuente: Autor

En la segunda fase, BERT se ajusta a una tarea específica. Como estamos tratando de construir un Chatbot, necesitamos un modelo que se ajuste a una tarea de respuesta a preguntas.

BERT utiliza el aprendizaje por transferencia: el modelo se preentrena en grandes cantidades de datos y esos aprendizajes se pueden transferir para que el modelo se afine en una cantidad relativamente pequeña de datos para una tarea específica.

Una vez que el modelo está ajustado para responder a las preguntas, tenemos que proporcionar el conjunto de datos de entrada para que el modelo sepa de dónde extraer sus respuestas. Por último, el usuario puede introducir una pregunta. El modelo extraerá la respuesta del conjunto de datos de entrada.

Después de dar al modelo un conjunto de datos con el contexto para responder a la pregunta, el usuario puede utilizar nuestro modelo BERT finamente ajustado. Fuente: Autor

Por lo tanto, en primer lugar, necesitamos obtener un conjunto de datos de entrada de donde el modelo extraerá su respuesta.

Obtención de los datos

En este ejemplo, nuestro chatbot será un maestro de Dragon Ball, por lo que obtendremos los datos de la Wiki de Dragon Ball con BeautifulSoup. El scraping no es el objetivo de este post, así que vamos a forzarlo un poco para obtener todos los datos que necesitamos.

El raspado podría ser más robusto, pero esta es una forma sencilla de hacerlo. Fuente: imgur

Tomamos los datos de los capítulos y también de las diferentes series (Dragon Ball Z, Dragon Ball GT, etc). La información más importante que tomaremos es la que realmente sucede en cada capítulo y, a través de las páginas de las diferentes series, también tenemos otro tipo de información (creador, productora, fechas de emisión, etc).

Ejemplo del scraping realizado para obtener toda la información que luego se introducirá en el modelo. Fuente: autor

Tras obtener todos los resúmenes de cada episodio, Haystack necesita que los datos se formateen como una lista de diccionarios, que tienen dos claves principales. Una de las claves se llama «contenido», donde el modelo extraerá toda la información necesaria para responder a todas las preguntas. La otra clave se llama «meta» y tiene un diccionario anidado con todos los metadatos que necesita. En este ejemplo, he pasado un diccionario con el título y el número del episodio del que se extrajo el resumen.

El diccionario tiene dos claves: contenido (de donde se extraen los datos) y meta (donde se almacenan los metadatos). Fuente: Autor

Ahora que tenemos toda la información sobre lo que ocurre en la serie, ¡tenemos que inicializar nuestro modelo!

Iniciando BERT

Para esta parte, utilizaré Google Collab por dos razones:

  • es mucho más fácil de configurar Haystack: Haystack es una librería para PNL que tiene muchas dependencias y a veces hacerla funcionar en tu ordenador personal no es muy fácil, especialmente para los principiantes que no están acostumbrados a configurar entornos;
  • utilizaremos un modelo BERT, que es un modelo grande que funciona mucho más rápido con una GPU – ¡que Google Colab proporciona gratuitamente!
Una representación real de la GPU de Colab haciendo que nuestro Chatbot funcione a la velocidad del rayo. Fuente: Pinterest

Tenemos que elegir un Recuperador y un Lector para utilizarlos. El Recuperador es un filtro ligero que recorre toda nuestra base de datos de documentos y elige un número X de documentos que podrían responder a la pregunta que el usuario está planteando. En este caso, le pediremos al Recuperador que nos devuelva 10 documentos.

El Recuperador recorre nuestra base de datos muy rápidamente, recupera los documentos que están relacionados con la pregunta y los pasa al Lector, que los analiza con más detalle y extrae una respuesta de ellos.

El recuperador pasa estos 10 documentos al lector. En este caso, utilizaremos BERT como lector. Más concretamente, utilizaremos un modelo BERT en inglés que ya está ajustado para la respuesta a preguntas extractivas. En esencia, esto significa que el modelo fue pre-entrenado en el idioma inglés y luego fue entrenado para la GC Extractiva en la última capa de entrenamiento. Como los datos de Dragon Ball ya están en inglés, el modelo ya está preparado para responder a nuestras preguntas.
PD: Si tienes datos en otro idioma, puedes buscar un modelo entrenado en ese idioma en HuggingFace.

Le pediremos al modelo que nos devuelva las 5 respuestas correctas más probables de entre los 10 documentos que probablemente tengan la respuesta. Recuerda: el Recuperador encuentra los documentos correctos y el Lector encuentra la respuesta exacta (en este caso, nuestro lector es roberta-base-squad2). Este es el resultado del modelo tras introducir una simple pregunta sobre Dragon Ball:

¡La modelo acertó la respuesta! ¡Los mentores de Goku fueron el Maestro Roshi y el Rey Kai!

¡El primer mentor de Goku fue, de hecho, el maestro Roshi como decía la maqueta! Fuente: Pinterest

Una vez más, esto es algo inmediato, ¡no hemos tenido que entrenar ningún modelo con nuestros datos!

Probando nuestro Chatbot

Después de crear una función que permite que nuestra salida sea más bonita, ¡vamos a ver los resultados!

Preguntemos con quién está casado Vegeta:

Fuente: Autor

¡Acertó! Su primera respuesta fue Bulma. Probemos con otras preguntas y veamos los resultados:

Fuente: Autor
Fuente: Autor
Fuente: Autor

El modelo está respondiendo bastante bien a muchas de las preguntas.

El nivel de potencia de BERT es realmente impresionante. Fuente: Pinterest

Pero si añadimos alguna variación en la forma de hacer algunas preguntas, empieza a no ser del todo correcto…

Sólo porque cambiamos la palabra «abuelo» por «abuelito», ¡el modelo da una respuesta errónea!
Estoy bastante seguro de que Dragon Ball Z tenía más episodios que esto

Estos son sólo algunos ejemplos de que el modelo aún no es perfecto.

Todavía tiene mucho que aprender. Fuente: gifer

No te preocupes, porque podemos entrenarlo más en nuestros datos si queremos. Haystack tiene un sencillo tutorial sobre cómo hacer esto también. Sin embargo, eso podría ser todo un nuevo post. Si lo encuentras útil, puedes enviarme un mensaje o un comentario e intentaré crear un post explicándolo paso a paso.

Más trabajo

La librería Haystack tiene una muy buena documentación y este post se ha basado en uno de sus cuadernos tutoriales. Podemos intentar añadir más datos sobre otras series e intentar ver si el modelo conserva su rendimiento. Aquí tenéis el enlace al repositorio Github del proyecto por si queréis acceder a los cuadernos utilizados.

Espero que hayas disfrutado creando tu primer chatbot con BERT 🙂

¡Hasta la próxima! Fuente: Gifer

Deja una respuesta

Tu dirección de correo electrónico no será publicada.