Tabla de contenidos
Introducción
En cuanto a las herramientas y los entornos de desarrollo de chatbot disponibles actualmente, hay tres problemas que requieren solución:
- Entidades contextuales compuestas
- Descomposición de la entidad
- Desactivación de la máquina de estado rígida, gestión de cuadros de diálogo
Rasa está abordando activamente estos tres elementos. Pero, la preocupación de este artículo son las entidades que pueden descomponerse y dividirse en tipos o agrupaciones.
Por ejemplo, en un escenario bancario, lo más probable es que tenga la entidad de cuenta. Esto solo puede ser suficiente y, en general, no tienes más opciones con las que trabajar.
Pero lo ideal es tener la capacidad de crear subconjuntos de entidades. O, como en este caso, poder asignar roles a la entidad de cuenta. Por ejemplo, existen diferentes tipos de cuentas. Cuando transfieres dinero, quieres tener un tipo de cuenta de entidad hacia y desde (from — to).
Agregar roles de entidad
En el archivo nlu.md , he definido la intención de cambiar dinero de una moneda a otra. Este es un ejemplo de una expresión de usuario con entidades compuestas.
Dentro de la expresión del usuario, se definen tres entidades:
- Transacción
- Moneda
- Fecha y hora
A continuación, se muestra un ejemplo de cómo definir entidades con roles en el archivo nlu.md
## intent:exchange- I want to [change](transaction) [US dollars]{"entity": "currency", "role": "change_from"} to [Euros]{"entity": "currency", "role": "change_to"} on [Friday](date_time)- Can I [exchange](transaction) [euros]{"entity": "currency", "role": "change_from"} for [Rand]{"entity": "currency", "role": "change_to"} on [Saturday](date_time)- give me a rate to [change](transaction) [pounds sterling]{"entity": "currency", "role": "change_from"} for [Japanese Yen]{"entity": "currency", "role": "change_to"} on [Monday](date_time)- what are rates to [convert](transaction) [Australian Dollar]{"entity": "currency", "role": "change_from"} for [Russian Ruble]{"entity": "currency", "role": "change_to"} on [next week Thursday](date_time)- I want to [change](transaction) [US dollars]{"entity": "currency", "role": "change_from"} to [Canadian dollar]{"entity": "currency", "role": "change_to"} on [Friday](date_time)
La entidad de la moneda se divide en dos roles:
- Cambiar de y
- Cambiar a.
A continuación, se muestra un ejemplo práctico de un input que solicita cambiar dinero. Esto se realiza utilizando Postman y Rasa NLU API.
La salida JSON define claramente la intención de intercambio como reconocida. Con esto, se identifican tres entidades. La entidad de la moneda tiene un valor adicional de papel. En este caso, la segmentación de la moneda cambió “de” y “a”.
Agregar grupos de entidades
Los grupos de entidades permiten que las entidades se agrupen juntas. En el ejemplo bancario, he creado los niveles de entidad. Hay 5 niveles; Plata, Oro y Bronce; agrupados. Constituyendo el grupo uno.
El platino y el negro están agrupados. Constituyendo el grupo dos.
Aquí hay un ejemplo sobre cómo definir entidades con grupos en el archivo nlu.md.
## intent:tiers- [Silver]{“entity”: “tiers”, “group”: “1”} accounts have lower interest for saving than [Platinum]{“entity”: “tiers”, “group”: “2”} – [Gold]{“entity”: “tiers”, “group”: “1”} accounts have lower interest for saving than [black]{“entity”: “tiers”, “group”: “2”}- [Bronze]{“entity”: “tiers”, “group”: “1”} accounts have lower interest for saving than [Platinum]{“entity”: “tiers”, “group”: “2”}
Y el ejemplo de un input de usuario que menciona dos de los niveles.
El resultado es una salida JSON con los niveles de entidad definidos y la agrupación de la entidad.
Entidades Rasa
Contextual y compuesto
Desde el inicio, las entidades compuestas y contextuales de Rasa fueron sus puntos fuerte.
Contextualmente significa que el chatbot no reconoce las entidades al pedirle al usuario directamente la entrada o que las encuentra a través de una lista de búsqueda finita. Más bien, las entidades se detectan en función de su contexto dentro del enunciado u oración.
Esto está más alineado con la forma en que nosotros, como humanos, detectamos entidades en una conversación.
Las entidades compuestas significan que puedo capturar varias entidades por intención o expresión del usuario. En un escenario en el que el usuario te brinda toda la información en un solo enunciado, tiene la capacidad de capturar todos esos valores de una vez.
Esto se traduce en menos turnos de diálogo y un chatbot más eficiente.
Roles de entidad
El punto de partida de las entidades es que puedes agregar etiquetas a las palabras. Por lo tanto, puedes definir conceptos en sus datos.
En el siguiente ejemplo, tienes diferentes tipos de ciudades definidos con otras entidades.
## intent:travel_details- I want to travel by [train](travel_mode) from [Berlin](from_city) to [Stuttgart](to_city) on [Friday](date_time)
Esto no es elegante, ya que es necesario crear varias entidades para un objeto de palabra real, a saber, ciudad
Y en este ejemplo, la ciudad tiene dos roles; la ciudad de salida y la ciudad de llegada. Con Rasa, puedes definir estas entidades con roles específicos en el archivo nlu.md de tu proyecto.
## intent:travel_details - I want to travel by [train](travel_mode) from [Berlin]{"entity": "city", "role": "depart"} to [Stuttgart]{"entity": "city", "role": "arrive"} on [Friday](date_time)
El output se vería así:
I want to travel by train from Berlin to Stuttgart on next week Wednesday. { "intent": { "name": "travel_details", "confidence": 0.9981381893157959 }, "entities": [ { "entity": "travel_mode", "start": 20, "end": 25, "value": "train", "extractor": "DIETClassifier" }, { "entity": "city", "start": 31, "end": 37, "role": "depart", "value": "Berlin", "extractor": "DIETClassifier" }, { "entity": "city", "start": 41, "end": 49, "role": "arrive", "value": "Stuttgart", "extractor": "DIETClassifier" } ], "intent_ranking": [ { "name": "travel_details", "confidence": 0.9981381893157959 },
Grupos de entidades
Esta función permite que las entidades se agrupen con una etiqueta de grupo específica. La mejor manera de explicar esto es con un ejemplo …
Nuevamente, definido en tperou archivo /data/nlu.md
## intent:teams - The first team will be [John]{"entity": "teamMember", "group": "1"}, [Mary]{"entity": "teamMember", "group": "1"} and [Geoff]{"entity": "teamMember", "group": "1"} and the second groupto travel will be [Martha]{"entity": "teamMember", "group": "2"}, [Adam]{"entity": "teamMember", "group": "2"} and [Frank]{"entity": "teamMember", "group": "2"}.
Y el output de Rasa se vería así:
The first team will be John, Mary and Geoff and the second group to travel will be Martha, Adam and Frank. { "intent": { "name": "teams", "confidence": 0.9999754428863525 }, "entities": [ { "entity": "teamMember", "start": 23, "end": 33, "group": "1", "value": "John, Mary", "extractor": "DIETClassifier" }, { "entity": "teamMember", "start": 38, "end": 43, "group": "1", "value": "Geoff", "extractor": "DIETClassifier" }, { "entity": "teamMember", "start": 83, "end": 95, "group": "2", "value": "Martha, Adam", "extractor": "DIETClassifier" }, { "entity": "teamMember", "start": 100, "end": 105, "group": "2", "value": "Frank", "extractor": "DIETClassifier" }
Conclusión
Es evidente que hay algunas aplicaciones en las que será necesario manejar expresiones complejas de usuario y entidades compuestas. Este desarrollo de Rasa probablemente se extenderá e incluirá otras estructuras.