Un recorrido rápido por el sistema Apache NlpCraft

En este artículo, me gustaría familiarizar a los lectores con uno de los proyectos de la comunidad de Apache Software Foundation: NlpCraft . NlpCraft es una biblioteca de código abierto para integrar la interfaz del idioma en aplicaciones personalizadas.



El objetivo del proyecto es simplificar completamente el acceso a las capacidades de NLP (procesamiento de lenguaje natural) para los desarrolladores de aplicaciones. La idea principal del sistema es lograr un equilibrio entre la facilidad de acceso a los problemas de PNL y el soporte para una amplia gama de capacidades de bibliotecas industriales. El objetivo del proyecto es intransigente: simplicidad sin simplificación excesiva.



En el momento de la versión 0.7.1, el proyecto se encuentra en la etapa de incubación de la comunidad Apache y está disponible en https://nlpcraft.apache.org .



Características clave del sistema



  • Modelado semántico. Un mecanismo integrado simple para reconocer elementos del modelo en el texto de la consulta que no requiere aprendizaje automático.
  • API de Java que le permite desarrollar modelos en cualquier lenguaje compatible con Java: Java, Scala, Kotlin, Groovy, etc.
  • Un enfoque de Model-as-a-Code que le permite crear y editar modelos utilizando las herramientas con las que los desarrolladores están familiarizados.
  • La capacidad de interactuar con todo tipo de dispositivos que tienen API: chatbots, asistentes de voz, dispositivos domésticos inteligentes, etc., así como utilizar cualquier fuente de datos personalizada, desde bases de datos hasta sistemas SaaS, cerrados o abiertos.
  • Un conjunto avanzado de herramientas de PNL, que incluye un sistema para trabajar con memoria a corto plazo, plantillas de diálogo, etc.
  • Integración con muchos proveedores de componentes NER ( Apache OpenNlp , Stanford NLP , API de Google Natural Language , Spacy )


Limitaciones: la versión actual 0.7.1 solo admite inglés.



Acordemos algunos términos y conceptos utilizados en la presentación posterior.



Terminología



  • Entidad nombrada es una entidad nombrada. En palabras simples, es un objeto o concepto reconocido en el texto. La definición completa está aquí . Las entidades pueden ser genéricas, como fechas, países y ciudades, o específicas del modelo.
  • Componentes NER (Named Entity Recognition): componentes de software responsables de reconocer entidades en el texto.
  • Intent, . — , . — , .




  • Data model

    NER , .. Json Yaml .

  • Data probe

    . , , .. Data Probe, Data Probe .

  • Servidor REST

    Proporciona API REST para aplicaciones personalizadas



imagen



Ejemplo usando NlpCraft



Usando el ejemplo de un sistema de control doméstico inteligente, considere la secuencia de trabajo con NlpCraft. El sistema de control que estamos desarrollando debe comprender comandos como "Enciende las luces de toda la casa" o "Apaga las lámparas de la cocina". Tenga en cuenta que NlpCraft no se ocupa del reconocimiento de voz y acepta texto ya preparado como argumento.



Deberíamos:



  • Determine qué entidades con nombre necesitamos en nuestro trabajo y cómo podemos encontrar su texto.
  • Cree intenciones para diferentes conjuntos de entidades, es decir, diferentes tipos de comandos.


Para desarrollar un ejemplo, necesitamos tres entidades: dos signos de acción, "encendido" y "apagado", y un lugar de acción.



Ahora debemos diseñar el modelo, es decir, definir el mecanismo para encontrar estos elementos en el texto. De forma predeterminada, NlpCraft utiliza un motor de búsqueda de lista de sinónimos para entidades no estándar. Para que la tarea de compilar una lista de sinónimos sea lo más simple y conveniente posible, NlpCraft proporciona un conjunto de herramientas, que incluyen macros y Synonym DSL.



A continuación se muestra la configuración estática lightswitch_model.yaml , que incluye la definición de nuestras tres entidades y una intención.



id: "nlpcraft.lightswitch.ex"
name: "Light Switch Example Model"
version: "1.0"
description: "NLI-powered light switch example model."
macros:
  - name: "<ACTION>"
    macro: "{turn|switch|dial|control|let|set|get|put}"
  - name: "<ENTIRE_OPT>"
    macro: "{entire|full|whole|total|*}"
  - name: "<LIGHT>"
    macro: "{all|*} {it|them|light|illumination|lamp|lamplight}"
enabledBuiltInTokens: [] # This example doesn't use any built-in tokens.
elements:
  - id: "ls:loc"
    description: "Location of lights."
    synonyms:
      - "<ENTIRE_OPT> {upstairs|downstairs|*} {kitchen|library|closet|garage|office|playroom|{dinning|laundry|play} room}"
      - "<ENTIRE_OPT> {upstairs|downstairs|*} {master|kid|children|child|guest|*} {bedroom|bathroom|washroom|storage} {closet|*}"
      - "<ENTIRE_OPT> {house|home|building|{1st|first} floor|{2nd|second} floor}"

  - id: "ls:on"
    groups:
      - "act"
    description: "Light switch ON action."
    synonyms:
      - "<ACTION> {on|up|*} <LIGHT> {on|up|*}"
      - "<LIGHT> {on|up}"

  - id: "ls:off"
    groups:
      - "act"
    description: "Light switch OFF action."
    synonyms:
      - "<ACTION> <LIGHT> {off|out}"
      - "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
      - "no <LIGHT>"
intents:
  - "intent=ls term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"


Brevemente sobre el contenido:



  • , “ls:loc”, : “ls:on” “ls:off”, “act” .
  • Synonym DSL . , , “ls:on” “turn”, “turn it”, “turn all it” .., “ls:loc” — “light”, “entire light”, “entire light upstairs” .. 7700 .
  • La búsqueda por sinónimos en el texto se realiza teniendo en cuenta las formas iniciales de las palabras ( lema y stemma ), la presencia de palabras vacías, posibles permutaciones de palabras en combinaciones de palabras, etc.
  • El modelo define una intención llamada " ls ". Condición de activación de intención: la solicitud debe contener una entidad del grupo " acto " y puede contener varias entidades del tipo " ls: loc ". La sintaxis completa de Intents DSL se puede encontrar aquí .


A pesar de su sencillez, este tipo de modelado es potente y flexible.



  • , . .
  • , .
  • NER . — , .
  • – , , NER , .


Tenga en cuenta que, si es necesario, el usuario de NlpCraft puede programar el componente específico del modelo NER de cualquier otra forma, utilizando redes neuronales u otros enfoques y algoritmos. Un ejemplo es la necesidad de un algoritmo no determinista de reconocimiento de entidades según la hora del día, etc.



Cómo funciona el partido:



  • El texto de la solicitud del usuario se divide en componentes (palabras, tokens),
  • las palabras adquieren una forma básica (lemas y raíces), se encuentran partes del discurso y otra información de bajo nivel para ellas.
  • Además, según los tokens y sus combinaciones, las entidades con nombre se buscan en el texto de la solicitud.
  • Las entidades encontradas se comparan con las plantillas de todas las intenciones especificadas en el modelo y, si se encuentra una intención adecuada, se llama a la función correspondiente.


El siguiente ejemplo de función de intención " ls " está escrito en Java, pero puede ser cualquier otro lenguaje de programación compatible con Java.



public class LightSwitchModel extends NCModelFileAdapter {
  public LightSwitchModel() throws NCException {
    super("lightswitch_model.yaml");
  }

  @NCIntentRef("ls")
  NCResult onMatch(
    @NCIntentTerm("act") NCToken actTok,
    @NCIntentTerm("loc") List<NCToken> locToks
  ) {
    String status = actTok.getId().equals("ls:on") ? "on" : "off";
    String locations =
      locToks.isEmpty() ?
        "entire house" :
        locToks.stream().
          map(p -> p.meta("nlpcraft:nlp:origtext").toString()).
          collect(Collectors.joining(", "));
 
 
    // Add HomeKit, Arduino or other integration here.
 
    // By default - just return a descriptive action string.
    return NCResult.text(
      String.format("Lights are [%s] in [%s].", status, locations)
    );
  }
}


Qué sucede en el cuerpo de la función:



  • La configuración estática que definimos anteriormente usando el archivo lightswitch_model.yaml se lee usando NCModelFileAdapter.
  • Como argumentos de entrada, la función recibe un conjunto de datos de entidades que coinciden con su plantilla de intención.
  • El elemento del grupo " acto " determina la acción específica a realizar.
  • De la lista " ls: loc " , se recupera información sobre el lugar o lugares específicos donde se debe realizar la acción.


Los datos recibidos son suficientes para acceder a la API del sistema que gestionamos.



En este artículo, no daremos un ejemplo detallado de integración con ninguna API específica. También fuera del alcance del ejemplo estará la gestión del contexto de la conversación, la contabilización del diálogo, el trabajo con la memoria a corto plazo del sistema, la configuración del mecanismo de coincidencia de intenciones, los problemas de integración con los proveedores NER estándar, las utilidades para ampliar la lista de sinónimos, etc. etc.



Sistemas similares



Los “análogos” más cercanos y conocidos, Amazon Alexa y Google DialogFlow, tienen una serie de diferencias significativas con este sistema. Por un lado, son algo más fáciles de usar, ya que ni siquiera requieren un IDE para sus ejemplos iniciales. Por otro lado, sus capacidades son muy limitadas y, en muchos sentidos, son mucho menos flexibles.



Conclusión



Con la ayuda de unas pocas líneas de código, pudimos programar un prototipo simple pero bastante funcional de un sistema de control de iluminación en una casa inteligente, que comprende muchos comandos en varios formatos. Ahora puede expandir fácilmente las capacidades del modelo. Por ejemplo, para complementar la lista de sinónimos de entidades o agregar alguno nuevo necesario para una funcionalidad adicional, como "intensidad de luz", etc. Los cambios tomarán unos minutos y no requieren entrenamiento adicional del modelo.



Espero que, gracias a esta publicación, hayas podido obtener una primera comprensión, aunque superficial, del sistema Apache NlpCraft.



All Articles