Tabla de contenidos

Introducción

Cuando queremos construir chatbot inteligentes, una de las decisiones más complicadas es que herramienta o plataforma de NLP (Natural Language Processing) utilizar. Y normalmente solemos llegar a una pregunta: ¿usar una comercial? ¿Una open source on premise? ¿Cuáles aciertan mejor?

Uno de los criterios para elegir un NLP u otro suele ser cuán bueno es su NLU (Natural Language Understanding) relacionando las frases que dicen los usuarios con los intents, es decir, cuán buena es su inteligencia.

En este artículo veremos cómo evaluar un NLU, y además los resultados de la evaluación de varios NLP usuales. Además explicaremos cómo construímos un NLU que se comporta bastante bien, realizado usando javascript.

Cómo evaluar un NLU

Cuando se evaluan varios NLUs, se necesita un corpora, es decir, varias colecciones de frases en los que para cada frase sabemos el intent correcto (cada conjunto recibe el nombre de corpus). Además, algunas de las frases estarán marcadas para ser usadas por el entrenamiento, y otras no, y son las que se usarán para evaluar. Esto se hace así para evitar el overfitting, es decir, evitar que la inteligencia esté aprendiéndose lo que le enseñamos tal cual, en lugar de ser capaz de generalizar los conceptos para ser usados en otras frases.

Uno de los mejores papers sobre este tema es SIGDIAL22 Evaluating Natural Language Understanding Services for Conversational Questions Answering Systems, escrito por Daniel Braun, Adrian Hernandez-Mendez, Florian Matthes y Manfred Langen.

El corpora utilizado tanto en el paper como en este artículo puede encontrase aquí: https://github.com/sebischair/NLU-Evaluation-Corpora

Descripción de cada corpus:

  • Chatbot: 206 preguntas de un chatbot de Telegram usado para el transporte público de Munich
  • AskUbuntu: 190 preguntas y respuestas de https://askubuntu.com
  • WebApplications: 100 preguntas y respuestas de https://webapps.stackexchange.com.

Hay que tener en cuenta también una nota de Daniel Braun, coautor del paper:

Sin embargo, estos resultados son solamente para los corpus que hemos probado y los resultados no son generalizables para otros dominios. El objetivo de nuestro documento no es sugerir un servicio específico, sino alentar a las personas a evaluar las alternativas existentes para su caso de uso y mostrarles cómo podría ser esa evaluación.

Systemas evaluados

Hemos evaluado siete sistemas diferentes:

  • LUIS.ai: Solución en la nube perteneciente a Microsoft.
  • Watson Conversation: Solución en la nube perteneciente a IBM.
  • DialogFlow: Solución en la nube perteneciente a Google.
  • Botfuel: Solución en la nube.
  • Recast.ai: Solución en la nube perteneciente a SAP.
  • RASA: solución on-premise, open source, realizada en python.
  • NLP.js: solución on-premise en forma de librería, open source, hecho en javascript, perteneciente a AXA Shared Services Spain

Resultados Finales

Puedes descargarte el excel con toda la información detallada en el siguiente enlace: https://github.com/axa-group/nlp.js/blob/master/docs/NLU_evaluation.xlsx

Estos son los resultados finales en forma de tabla y las correspondientes gráficas globales y por corpus. Si quieres ver la analítica detallada, con datos desgranados sobre los intents por corpus y plataforma, puedes encontrarlos en el excel citado anteriormente.

Resultados finales ordenados por F1-score

Una nota sobre DialogFlow: se puede comprobar que los resultados de DialogFlow no se corresponden con lo que se esperaría. Esto parece ser debido al umbral de 0.5: mientras otros sistemas devuelven todos los intents o el mejor intent y su probabilidad, DialogFlow tiene un umbral de probabilidad que por defecto es 0.5, y cualquier evaluación de una frase que como resultado devuelva una probabilidad por debajo de ese umbral, devuelve un intent llamado Default Fallback Intent. Así que hemos comprobado por separado NLP.js y DialogFlow utilizando el mismo comportamiento: si el score está por debajo de 0.5, entonces se devuelve un intent por defecto. Los resultados:

El algoritmo detrás de NLP.js explicado

Puedes encontrar NLP.js en github y en npmjs: https://github.com/axa-group/nlp.js

Es open source y está construído usando javascript, soporta 27 idiomas y puede ser usado tanto en Node.js como en el navegador (de hecho es el único NLP de los evaluados que puede ser ejecutado en el navegador). La limitación es que en el navegador el idioma chino no está disponible.

El secreto de lograr una confianza tan buena en los resultados es combinar dos métodos de lograr la respuesta: Logistic Regression Classifier y Binary Relevance Neural Network. La forma de funcionar de este último es tener una red neuronal por cada intent, de forma que se entrena con cada una de las frases de entrenamiento que se corresponden con ese intent con un resultado de 1, y con las que no con un 0, y esto se hace para cada intent. De esta manera, cuando recibimos una frase, pasamos esa frase a cada una de estas redes neuronales, que dan su respuesta por separado. Y además se pasa al Logistic Regression Classifier. Y todos estos resultados se combinan para dar una respuesta más adecuada a lo que se busca.

Para escoger la función de activación y los hiperparámetros, se lanzaron una gran colección de pruebas con diferentes formas de entrenamiento, y probando además contra un corpus más grande que los tres propuestos (328 frases de entrenamiento y 56 intents). Finalmente parece que un learning rate de 0.1 con un umbral de error de 0.0005 entrenado durante 20000 iteraciones parece dar un resultado bastante óptimo en un tiempo aceptable. Y para diferentes funciones de activación se obtienen diferentes resultados:

Podemos aprenciar que la activación con ReLu no es la más adecuada para algunos problemas, seguramente por la exceisva linearidad. Por otro lado, la tangente hiperbólica y leaky-ReLu parecen funcionar muy bien con los diversos problemas, de hecho funcionan incluso mejor de lo esperado. Además tanto hiperparámetros como función de activación pueden escogerse en NLP.js, y si no se utiliza por defecto la configuración antes mencionada. El impacto de escoger una u otra configuración estará también en el tiempo de entrenamiento y la calidad de acierto, y hay que encontrar un balance entre ambos. Dado que el entrenamiento no suele ser algo frecuente, y que además se puede hacer desde otro entorno y luego subir el fichero de pesos generado a otros entornos, suele salir a cuenta tunear correctamente los parámetros para obtener una buena calidad. El tiempo dependerá fundamentalmente de la cantidad de intents, en el caso del corpus con 56 intents y 328 frases de entrenamiento, el tiempo en un portátil normal tarda unos 110 segundos, en los cuales se entrena ambos métodos: Logistic Regression Classifier y Binary Relevance Neural Network.

Por Jesús Seijas de la Fuente

Enfocado en proyectos de IA, principalmente IA conversacional y Visión por Computador. Autor de NLP.js, un conjunto de librerías NLP para AI conversacional, capaz de hacer clasificación, con normalizadores, tokenizadores y lematizadores para 41 idiomas, que es capaz de entrenar y clasificar en el navegador y móvil sin conexión a internet, e integrado con BERT. La red neuronal está diseñada para el problema de clasificación de PNL en términos de precisión y rendimiento.

Deja una respuesta

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