Rasa es una librería open source para construir interfaces conversacionales, más comunmente llamadas “chatbots”. Crear un chatbot que funcione realmente bien no es tarea fácil y la gente de Rasa lo sabe, por lo que su librería contiene muchos componentes que en conjunto permiten crear buenas experiencias conversacionales.

Uno de esos componentes es el de NLU (Natural Language Understanding) que fue la mejor alternativa para varios de los proyectos en los que tuve que implementar reconocimiento de entidades y en este post voy a decirles algunas de las razones.

Dado que Rasa está pensado principalmente para chatbots, un concepto importante en este tipo de herramientas es el de “intent”. Un intent traducida al español sería algo como una “intención”. Lo que se intenta hacer mediante NLU es distinguir que intención tiene el usuario del chatbot cuando escribe cierto texto.

Por ejemplo si el usuario escribe alguna de estas frases:

El intent que los agrupa podría ser “saludo”.

Si el usuario escribe:

El intent que agrupa todas esas frases podría ser llamado “pedido”.

Como podrán observar el mecanismo de intents funciona como un clásico problema de clasificación donde la frase es el input y el intent el output.

Estructura

La estructura que usa Rasa para el entrenamiento de la NLU hace que sea muy fácil agregar ejemplos para mejorar su performance. No hace falta ser programador ni tener un conocimiento técnico para hacerlo, con una buena documentación que explique el proceso cualquier persona será capaz de contribuir al proyecto.

Esto permite que más gente pueda contribuir en el proyecto y hacer que avance más rápidamente.

Hay excepciones como puede ser agregar expresiones regulares y obviamente algún que otro componente externo que se desee incluir.

Entrenamiento

El entrenamiento se hace a partir de varios archivos que están en la carpeta /data:

Veamos un ejemplo:

- intent: check_balance
examples: |
- What's my [credit](account) balance?
- What's the balance on my [credit card account]{"entity":"account","value":"credit"}

En el código de arriba podemos ver el intent de chequear el balance (de una cuenta bancaria) y la entidad que se desea identificar de ese intent es la de tipo “account”. Podemos ver que las palabras “credit” y “credit card account” se refieren a la misma entitdad account. Si “limpiáramos” los ejemplos de intent sin etiquetarlos quedarían así:

- synonym: credit
examples: |
- credit card account
- credit account

Y en este fragmento de código podemos indicarle al componente de NLU que considere credit card account y credit account como sinónimos de credit. A partir de ahora los tres estarán normalizados.

Luego entrenamos el NLU con este comando:

rasa train nlu

Uso

Para usar el componente de NLU de Rasa simplemente tenemos que correr el servicio:

rasa run --enable-api -m models/CURRENTMODEL.tar.gz

Una vez el servicio esté corriendo podemos hacer requests de esta manera:

curl SERVER_IP:SERVER_PORT/model/parse -d '{"text": "SENTENCE"}'

Por lo tanto no hace falta que armemos un API propia, ya la tenemos lista para usar.

Testeo

rasa test nlu --config config.yml --nlu data/ --cross-validation

Lo que hace este comando es tomar el archivo “config.yml” donde está definido el pipeline con todos los componentes (y su configuración) y usar los archivos en /data para generar las métricas con la performance del modelo de NLU. No hace falta separar los intents en training y test sets, con el parámetro –cross-validation Rasa lo resuelve por nosotros.

Y lo super genial de esto es que genera un archivo con las métricas (f-score, precision, recall) de cada tipo de entidad por separado y en conjunto y otro donde te muestra con que frases se equivoco para cada tipo de entidad. El ahorro de tiempo que significa esto, por lo menos para mi, es bastante importante.

Extensibilidad

Agregar componentes en el pipeline es muy sencillo y transparente ya que lo que se hace es agregar un archivo (de Python) independiente del resto, por lo que no vas a tener problemas de inteegración.

Por ejemplo existe el componente de Duckling, una librería open source desarrollada por Facebook que permite la extracción de fechas, números, horarios y otras características del texto. Integrarlo a Rasa es tan simple como agregar las siguientes líneas al pipeline que está en el archivo config.yml:
- name: "DucklingHTTPExtractor"
url: "http://0.0.0.0:8000"
locale: "es_AR"
dimensions: ["time", "amount-of-money", "duration", "ordinal", "number"]

El extractor de entidades de Spacy es otro componente muy utilizado en Rasa y también es muy sencillo de integrar. Si en un proyecto vamos a usar Spacy para hacer NER te aconsejo que le des una oportunidad a Rasa porque con muy poco esfuerzo vas a contar con muchas más features para tu proyecto.

Conclusión

Estas son algunas de las razones por las que últimamente estuve trabajando mucho con esta tecnología. Muchos la deben conocer como una herramienta para armar chatbots pero detrás de eso hay muy buena tecnología que se puede usar aunque el chatbot no sea el objetivo final.

 

Leave a Reply

Your email address will not be published. Required fields are marked *