Présentation rapide du système Apache NlpCraft

Dans cet article, je voudrais présenter aux lecteurs l'un des projets de la communauté Apache Software Foundation - NlpCraft . NlpCraft est une bibliothèque open source conçue pour intégrer l'interface du langage dans des applications personnalisées.



Le but du projet est de simplifier complètement l'accès aux capacités de NLP (Natural Language Processing) pour les développeurs d'applications. L'idée principale du système est de trouver un équilibre entre la facilité d'entrée dans les problèmes de la PNL et la prise en charge d'un large éventail de capacités de bibliothèques industrielles. L'objectif du projet est sans compromis: simplicité sans simplification excessive.



Au moment de la version 0.7.1, le projet est en phase d' incubation de la communauté Apache et est disponible sur https://nlpcraft.apache.org .



Principales caractéristiques du système



  • Modélisation sémantique. Un mécanisme intégré simple pour reconnaître les éléments de modèle dans le texte de la requête qui ne nécessite pas d'apprentissage automatique.
  • API Java qui vous permet de développer des modèles dans n'importe quel langage compatible Java - Java, Scala, Kotlin, Groovy, etc.
  • Une approche Model-as-a-Code qui vous permet de créer et de modifier des modèles à l'aide d'outils que les développeurs connaissent.
  • La possibilité d'interagir avec toutes sortes d'appareils dotés d'API - chatbots, assistants vocaux, appareils intelligents pour la maison, etc., ainsi que d'utiliser toutes les sources de données personnalisées, des bases de données aux systèmes SaaS, fermées ou ouvertes.
  • Un ensemble avancé d'outils NLP, y compris un système pour travailler avec de la mémoire à court terme, des modèles de dialogue, etc.
  • Intégration avec de nombreux fournisseurs de composants NER ( Apache OpenNlp , Stanford NLP , Google Natural Language API , Spacy )


Limitations - la version actuelle 0.7.1 ne prend en charge que l'anglais.



Mettons-nous d'accord sur certains termes et concepts utilisés dans la présentation ultérieure.



Terminologie



  • L'entité nommée est une entité nommée. En termes simples, c'est un objet ou un concept reconnu dans le texte. La définition complète est ici . Les entités peuvent être génériques, telles que des dates, des pays et des villes, ou spécifiques à un modèle.
  • Composants NER (Named Entity Recognition) - composants logiciels responsables de la reconnaissance des entités dans le texte.
  • Intent, . — , . — , .




  • Data model

    NER , .. Json Yaml .

  • Data probe

    . , , .. Data Probe, Data Probe .

  • Serveur REST

    Fournit l'API REST pour les applications personnalisées



image



Exemple utilisant NlpCraft



En utilisant l'exemple d'un système de contrôle de maison intelligente, considérez la séquence de travail avec NlpCraft. Le système de contrôle que nous développons doit comprendre des commandes telles que «Allumez les lumières dans toute la maison» ou «Éteignez les lampes de la cuisine». Veuillez noter que NlpCraft ne traite pas de la reconnaissance vocale et accepte le texte déjà préparé comme argument.



Nous devrions:



  • Déterminez les entités nommées dont nous avons besoin dans notre travail et comment nous pouvons trouver leur texte.
  • Créez des intentions pour différents ensembles d'entités, c'est-à-dire différents types de commandes.


Pour développer un exemple, nous avons besoin de trois entités - deux signes d'action, «on» et «off», et un lieu d'action.



Il faut maintenant concevoir le modèle, c'est-à-dire définir le mécanisme pour retrouver ces éléments dans le texte. Par défaut, NlpCraft utilise un moteur de recherche de liste de synonymes pour les entités non standard. Pour rendre la tâche de compilation d'une liste de synonymes aussi simple et pratique que possible, NlpCraft fournit un ensemble d'outils, y compris des macros et Synonym DSL.



Vous trouverez ci-dessous la configuration statique lightswitch_model.yaml , qui inclut la définition de nos trois entités et d'un intent.



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'}*"


En bref sur le contenu:



  • , “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 recherche par synonymes dans le texte est effectuée en tenant compte des formes initiales des mots ( lemme et tige ), de la présence de mots vides , des permutations possibles des mots dans les combinaisons de mots, etc.
  • Le modèle définit un intent nommé « ls ». Condition de déclenchement d'intention - la demande doit contenir une entité du groupe « act » et peut contenir plusieurs entités du type « ls: loc ». La syntaxe DSL Intents complète est disponible ici .


Pour toute sa simplicité, ce type de modélisation est puissant et flexible.



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


Notez que si nécessaire, le composant spécifique du modèle NER peut être programmé par l'utilisateur NlpCraft de toute autre manière, en utilisant des réseaux de neurones ou d'autres approches et algorithmes. Un exemple est le besoin d'un algorithme de reconnaissance d'entités non déterministe, heure du jour, etc.



Comment fonctionne le match:



  • Le texte de la demande utilisateur est découpé en composants (mots, jetons),
  • les mots sont mis sous forme de base (lemmes et souches), des parties du discours et d'autres informations de bas niveau sont trouvées pour eux.
  • En outre, sur la base des jetons et de leurs combinaisons, les entités nommées sont recherchées dans le texte de la demande.
  • Les entités trouvées sont comparées aux modèles de toutes les intentions spécifiées dans le modèle, et si une intention appropriée est trouvée, la fonction correspondante est appelée.


L'exemple suivant de fonction d'intention « ls » est écrit en Java, mais il peut s'agir de n'importe quel autre langage de programmation compatible 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)
    );
  }
}


Que se passe-t-il dans le corps de la fonction:



  • La configuration statique que nous avons définie ci-dessus à l'aide du fichier lightswitch_model.yaml est lue à l'aide de NCModelFileAdapter.
  • En tant qu'arguments d'entrée, la fonction reçoit un ensemble de données d'entités qui correspondent à son modèle d'intention.
  • L'élément de groupe « act » détermine l'action spécifique à effectuer.
  • À partir de la liste " ls: loc " , des informations sont récupérées sur le ou les endroits spécifiques où l'action doit être effectuée.


Les données reçues sont suffisantes pour accéder à l'API du système que nous gérons.



Dans cet article, nous ne donnerons pas d'exemple détaillé d'intégration avec une API spécifique. La gestion du contexte de la conversation, la prise en compte du dialogue, le travail avec la mémoire à court terme du système, la configuration du mécanisme de correspondance d'intention, les problèmes d'intégration avec les fournisseurs NER standard, les utilitaires pour élargir la liste des synonymes, etc. etc.



Systèmes similaires



Les «analogues» les plus proches et les plus connus d' Amazon Alexa et de Google DialogFlow présentent un certain nombre de différences significatives par rapport à ce système. D'une part, ils sont un peu plus faciles à utiliser, car ils n'ont même pas besoin d'un IDE pour leurs premiers exemples. D'un autre côté, leurs capacités sont très limitées et, à bien des égards, elles sont beaucoup moins flexibles.



Conclusion



À l'aide de quelques lignes de code, nous avons pu programmer un prototype simple mais tout à fait fonctionnel d'un système de contrôle d'éclairage dans une maison intelligente qui comprend de nombreuses commandes dans divers formats. Vous pouvez désormais étendre facilement les capacités du modèle. Par exemple, pour compléter la liste des synonymes d'entités ou ajouter quelque chose de nouveau qui est nécessaire pour des fonctionnalités supplémentaires, telles que «intensité lumineuse», etc. Les modifications prendront quelques minutes et ne nécessiteront pas de formation supplémentaire sur le modèle.



J'espère que grâce à cet article, vous avez pu avoir une première compréhension, quoique superficielle, du système Apache NlpCraft.



All Articles