このプロジェクトの目標は、アプリケーション開発者がNLP(Natural Language Processing)の機能にアクセスするのを完全に簡素化することです。このシステムの主なアイデアは、NLPの問題への参入のしやすさと、幅広い産業用ライブラリ機能のサポートとの間でバランスを取ることです。プロジェクトの目標は妥協を許さないことです-過度に単純化することなく単純化することです。
バージョン0.7.1の時点で、プロジェクトはApacheコミュニティのインキュベーション段階にあり、https://nlpcraft.apache.orgで入手できます。
主なシステム機能
- セマンティックモデリング。機械学習を必要としない、クエリテキスト内のモデル要素を認識するためのシンプルな組み込みメカニズム。
- Java、Scala、Kotlin、GroovyなどのJava互換言語でモデルを開発できるようにするJavaAPI。
- 開発者が使い慣れたツールを使用してモデルを作成および編集できる、コードとしてのモデルアプローチ。
- APIを使用してすべてのタイプのデバイス(チャットボット、音声アシスタント、スマートホームデバイスなど)と対話し、データベースからSaaSシステムまで、クローズドまたはオープンのカスタムデータソースを使用する機能。
- 短期メモリ、ダイアログテンプレートなどを操作するためのシステムを含む、高度なNLPツールのセット。
- 多くのNERコンポーネントプロバイダー(Apache OpenNlp、Stanford NLP、Google Natural Language API、Spacy)との統合
制限事項-現在のバージョン0.7.1は英語のみをサポートしています。
さらなるプレゼンテーションで使用されるいくつかの用語と概念に同意しましょう。
用語
- 名前付きエンティティは名前付きエンティティです。簡単に言えば、それはテキストで認識されるオブジェクトまたは概念です。完全な定義はここにあります。エンティティは、日付、国、都市などの一般的なものでも、モデル固有のものでもかまいません。
- NER(名前付きエンティティ認識)コンポーネント-テキスト内のエンティティの認識を担当するソフトウェアコンポーネント。
- Intent, . — , . — , .
- Data model
NER , .. Json Yaml .
- Data probe
. , , .. Data Probe, Data Probe .
- RESTサーバー
カスタムアプリケーションにRESTAPIを提供します
NlpCraftの使用例
スマートホーム制御システムの例を使用して、NlpCraftでの一連の作業を検討してください。私たちが開発している制御システムは、「家全体の照明をつける」や「台所のランプを消す」などのコマンドを理解する必要があります。NlpCraftは音声認識を処理せず、すでに準備されたテキストを引数として受け入れることに注意してください。
我々はすべき:
- 作業に必要な名前付きエンティティと、それらのテキストを見つける方法を決定します。
- エンティティのさまざまなセット、つまりさまざまなタイプのコマンドのインテントを作成します。
例を作成するには、3つのエンティティ(「オン」と「オフ」の2つのアクションサイン、およびアクションの場所)が必要です。
次に、モデルを設計する必要があります。つまり、テキスト内でこれらの要素を見つけるためのメカニズムを定義する必要があります。デフォルトでは、NlpCraftは非標準エンティティに対して同義語リスト検索エンジンを使用します。シノニムのリストをコンパイルするタスクをできるだけ簡単かつ便利にするために、NlpCraftはマクロやシノニムDSLを含む一連のツールを提供します。
以下は、静的なlightswitch_model.yaml構成です。これには、3つのエンティティと1つのインテントの定義が含まれています。
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'}*"
内容について簡単に:
- , “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 .
- 本文中の同義語による検索は、単語の初期形式(lemmaおよびstemma)、ストップワードの存在、フレーズ内の単語の可能な並べ替えなどを考慮して実行されます。
- モデルは、「ls」という名前の1つのインテントを定義します。インテントトリガー条件-リクエストには「act」グループのエンティティが1つ含まれている必要があり、「ls:loc」タイプのエンティティが複数含まれている場合があります。完全なIntentsDSL構文はここにあります。
このタイプのモデリングは、そのすべての単純さのために、強力で柔軟性があります。
必要に応じて、NERモデル固有のコンポーネントは、ニューラルネットワークまたは他のアプローチやアルゴリズムを使用して、他の方法でNlpCraftユーザーがプログラムできることに注意してください。例としては、非決定論的な時刻エンティティ認識アルゴリズムなどの必要性があります。
試合の仕組み:
- ユーザーリクエストのテキストはコンポーネント(ワード、トークン)に分割され、
- 言葉は基本的な形(レンマとステムマ)になり、スピーチの一部やその他の低レベルの情報が見つかります。
- さらに、トークンとその組み合わせに基づいて、名前付きエンティティがリクエストテキストで検索されます。
- 見つかったエンティティは、モデルで指定されたすべてのインテントのテンプレートと照合され、適切なインテントが見つかった場合、対応する関数が呼び出されます。
次の例のインテント関数「ls」はJavaで記述されていますが、他の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)
);
}
}
関数の本体で何が起こるか:
- lightswitch_model.yamlファイルを使用して上記で定義した静的構成は、NCModelFileAdapterを使用して読み取られます。
- 入力引数として、関数はそのインテントテンプレートに一致するエンティティからデータのセットを受け取ります。
- グループ要素「act」は、実行する特定のアクションを決定します。
- 「ls:loc」リストから、アクションを実行する必要がある特定の場所に関する情報が取得されます。
受信したデータは、私たちが管理するシステムのAPIにアクセスするのに十分です。
この記事では、特定のAPIとの統合の詳細な例については説明しません。また、この例の範囲外には、会話コンテキストの管理、対話アカウンティング、システムの短期メモリの操作、インテントマッチングメカニズムのカスタマイズ機能、標準NERプロバイダーとの統合の問題、同義語のリストを拡張するためのユーティリティなどがあります。等
同様のシステム
最も近いと最もよく知られている「類似体」アマゾンアレクサとGoogleのDialogFlowは、このシステムからの有意差の数を持っています。一方では、最初の例にIDEを必要としないため、多少使いやすくなっています。一方、それらの機能は非常に制限されており、多くの点で柔軟性がはるかに低くなっています。
結論
数行のコードの助けを借りて、さまざまな形式の多くのコマンドを理解するスマートホームの照明制御システムのシンプルでありながら非常に機能するプロトタイプをプログラムすることができました。これで、モデルの機能を簡単に拡張できます。たとえば、エンティティの同義語のリストを補足したり、「光の強さ」などの追加機能に必要な新しいものを追加したりします。変更には数分かかり、モデルの追加トレーニングは必要ありません。
この投稿のおかげで、表面的ではありますが、ApacheNlpCraftシステムを最初に理解できたことを願っています。