Eine kurze Tour durch das Apache NlpCraft-System

In diesem Artikel möchte ich den Lesern eines der Projekte der Apache Software Foundation-Community vorstellen - NlpCraft . NlpCraft ist eine Open Source-Bibliothek, mit der die Sprachschnittstelle in benutzerdefinierte Anwendungen integriert werden kann.



Ziel des Projekts ist es, Anwendungsentwicklern den Zugriff auf die Funktionen von NLP (Natural Language Processing) vollstĂ€ndig zu vereinfachen. Die Hauptidee des Systems besteht darin, ein Gleichgewicht zwischen dem einfachen Einstieg in NLP-Probleme und der UnterstĂŒtzung einer Vielzahl von Funktionen fĂŒr Industriebibliotheken herzustellen. Das Ziel des Projekts ist kompromisslos - Einfachheit ohne Vereinfachung.



Zum Zeitpunkt der Version 0.7.1 befindet sich das Projekt in der Inkubationsphase der Apache-Community und ist unter https://nlpcraft.apache.org verfĂŒgbar .



Wichtige Systemfunktionen



  • Semantische Modellierung. Ein einfacher integrierter Mechanismus zum Erkennen von Modellelementen im Abfragetext, der kein maschinelles Lernen erfordert.
  • Java-API, mit der Sie Modelle in jeder Java-kompatiblen Sprache entwickeln können - Java, Scala, Kotlin, Groovy usw.
  • Ein Model-as-a-Code-Ansatz, mit dem Sie Modelle mit Tools erstellen und bearbeiten können, mit denen Entwickler vertraut sind.
  • Die Möglichkeit, mit allen Arten von GerĂ€ten zu interagieren, die ĂŒber APIs verfĂŒgen - Chatbots, Sprachassistenten, Smart-Home-GerĂ€te usw. - und benutzerdefinierte Datenquellen zu verwenden, von Datenbanken bis hin zu geschlossenen oder offenen SaaS-Systemen.
  • Ein erweiterter Satz von NLP-Tools, einschließlich eines Systems zum Arbeiten mit KurzzeitgedĂ€chtnis, Dialogvorlagen usw.
  • Integration mit vielen NER-Komponentenanbietern ( Apache OpenNlp , Stanford NLP , Google Natural Language API , Spacy )


EinschrĂ€nkungen - Die aktuelle Version 0.7.1 unterstĂŒtzt nur Englisch.



Lassen Sie uns einige Begriffe und Konzepte vereinbaren, die in der weiteren PrÀsentation verwendet werden.



Terminologie



  • Benannte EntitĂ€t ist eine benannte EntitĂ€t. In einfachen Worten, es ist ein Objekt oder Konzept, das im Text erkannt wird. Die vollstĂ€ndige Definition finden Sie hier . EntitĂ€ten können generisch sein, z. B. Daten, LĂ€nder und StĂ€dte, oder modellspezifisch.
  • NER-Komponenten (Named Entity Recognition) sind Softwarekomponenten, die fĂŒr die Erkennung von EntitĂ€ten im Text verantwortlich sind.
  • Intent, . — , . — , .




  • Data model

    NER , .. Json Yaml .

  • Data probe

    . , , .. Data Probe, Data Probe .

  • REST-Server

    Bietet REST-API fĂŒr benutzerdefinierte Anwendungen



Bild



Beispiel mit NlpCraft



Betrachten Sie am Beispiel eines Smart-Home-Steuerungssystems den Arbeitsablauf mit NlpCraft. Das Steuerungssystem, das wir entwickeln, muss Befehle wie "Licht im ganzen Haus einschalten" oder "Lampen in der KĂŒche ausschalten" verstehen. Bitte beachten Sie, dass NlpCraft sich nicht mit Spracherkennung befasst und bereits vorbereiteten Text als Argument akzeptiert.



Wir mĂŒssen:



  • Bestimmen Sie, welche benannten EntitĂ€ten wir in unserer Arbeit benötigen und wie wir ihren Text finden können.
  • Erstellen Sie Absichten fĂŒr verschiedene Gruppen von EntitĂ€ten, dh verschiedene Arten von Befehlen.


Um ein Beispiel zu entwickeln, benötigen wir drei EntitÀten - zwei Aktionszeichen "Ein" und "Aus" und einen Aktionsort.



Jetzt mĂŒssen wir das Modell entwerfen, dh den Mechanismus zum Auffinden dieser Elemente im Text definieren. StandardmĂ€ĂŸig verwendet NlpCraft eine Suchmaschine fĂŒr Synonymlisten fĂŒr nicht standardmĂ€ĂŸige EntitĂ€ten. Um die Erstellung einer Liste von Synonymen so einfach und bequem wie möglich zu gestalten, bietet NlpCraft eine Reihe von Tools, darunter Makros und Synonym DSL.



Unten finden Sie die statische Konfiguration vonightswitch_model.yaml , die die Definition unserer drei EntitÀten und eine Absicht enthÀlt.



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


Kurz zum Inhalt:



  • , “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 .
  • Die Suche nach Synonymen im Text wird unter BerĂŒcksichtigung der Anfangsformen von Wörtern ( Lemma und Stemma ), des Vorhandenseins von Stoppwörtern , möglicher Permutationen von Wörtern in Wortkombinationen usw. durchgefĂŒhrt.
  • Das Modell definiert eine Absicht mit dem Namen " ls ". Absichtsauslösebedingung - Die Anforderung muss eine EntitĂ€t der Gruppe " act " enthalten und kann mehrere EntitĂ€ten vom Typ " ls: loc " enthalten. Die vollstĂ€ndige DSL-Syntax von Intents finden Sie hier .


Bei aller Einfachheit ist diese Art der Modellierung leistungsstark und flexibel.



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


Beachten Sie, dass die NER-modellspezifische Komponente bei Bedarf vom NlpCraft-Benutzer auf andere Weise mithilfe neuronaler Netze oder anderer AnsÀtze und Algorithmen programmiert werden kann. Ein Beispiel ist die Notwendigkeit eines nicht deterministischen Algorithmus zur Erkennung von EntitÀten zur Tageszeit usw.



Wie das Match funktioniert:



  • Der Text der Benutzeranforderung ist in Komponenten (Wörter, Token) unterteilt.
  • Wörter werden in die Grundform gebracht (Lemmas und Stemmas), Teile der Sprache und andere Informationen auf niedriger Ebene werden fĂŒr sie gefunden.
  • Basierend auf Token und ihren Kombinationen werden benannte EntitĂ€ten im Anforderungstext gesucht.
  • Gefundene EntitĂ€ten werden mit Vorlagen aller im Modell angegebenen Absichten abgeglichen. Wenn eine geeignete Absicht gefunden wird, wird die entsprechende Funktion aufgerufen.


Die folgende Beispiel-Intent-Funktion " ls " ist in Java geschrieben, kann jedoch jede andere Java-kompatible Programmiersprache sein.



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)
    );
  }
}


Was passiert im Körper der Funktion:



  • Die statische Konfiguration, die wir oben mithilfe der Dateiightswitch_model.yaml definiert haben, wird mithilfe des NCModelFileAdapter gelesen.
  • Als Eingabeargumente empfĂ€ngt die Funktion eine Reihe von Daten von EntitĂ€ten, die mit der Vorlage ihrer Absicht ĂŒbereinstimmen.
  • Das Gruppenelement " act " bestimmt die auszufĂŒhrende spezifische Aktion.
  • Aus der Liste " ls: loc " werden Informationen zu dem bestimmten Ort oder den Orten abgerufen, an denen die Aktion ausgefĂŒhrt werden soll.


Die empfangenen Daten reichen aus, um auf die API des von uns verwalteten Systems zuzugreifen.



In diesem Artikel geben wir kein detailliertes Beispiel fĂŒr die Integration in eine bestimmte API. Außerhalb des Rahmens des Beispiels werden auch der Kontext der Konversation verwaltet, der Dialog berĂŒcksichtigt, mit dem KurzzeitgedĂ€chtnis des Systems gearbeitet, der Intent Matching-Mechanismus konfiguriert, Probleme bei der Integration mit Standard-NER-Anbietern, Dienstprogramme zum Erweitern der Liste der Synonyme usw. usw.



Ähnliche Systeme



Die nĂ€chsten und bekanntesten "Analoga" Amazon Alexa und Google DialogFlow weisen eine Reihe signifikanter Unterschiede zu diesem System auf. Einerseits sind sie etwas einfacher zu bedienen, da sie fĂŒr ihre ersten Beispiele nicht einmal eine IDE benötigen. Andererseits sind ihre FĂ€higkeiten sehr begrenzt und in vielerlei Hinsicht viel weniger flexibel.



Fazit



Mit Hilfe einiger Codezeilen konnten wir einen einfachen, aber gut funktionierenden Prototyp eines Lichtsteuersystems in einem Smart Home programmieren, das viele Befehle in verschiedenen Formaten versteht. Jetzt können Sie die Funktionen des Modells problemlos erweitern. Zum Beispiel, um die Liste der Synonyme fĂŒr EntitĂ€ten zu ergĂ€nzen oder etwas Neues hinzuzufĂŒgen, das fĂŒr zusĂ€tzliche Funktionen erforderlich ist, wie z. B. "LichtintensitĂ€t" usw. Änderungen dauern Minuten und erfordern keine zusĂ€tzliche Schulung des Modells.



Ich hoffe, dass Sie dank dieses Beitrags ein erstes, wenn auch oberflÀchliches VerstÀndnis des Apache NlpCraft-Systems erhalten haben.



All Articles