質問
単純なチャットボットに自然言語解析ライブラリを使用したいと考えています。品詞タグを取得できますが、私はいつも疑問に思います。 POSで何をしますか。スピーチの部分を知っていたら、それではどうしますか?
それは応答に役立つと思います。しかし、どのデータ構造とアーキテクチャを使用できますか。
解決
品詞タガーは、入力テキスト内の単語にラベルを割り当てます。たとえば、人気のあるペンツリーバンクタグセットには、「複数名詞」、「比較形容詞」、「過去形動詞」など、約40のラベルがあります。タガーは、いくつかのあいまいさも解決します。たとえば、多くの英語の単語形式は名詞でも動詞でもかまいませんが、他の単語の文脈では、それらの品詞は明確です。 したがって、POSタグでテキストに注釈を付けると、次のような質問に答えることができます:名詞はいくつあるか、動詞を含まない文はいくつあるかなど。
チャットボットの場合、明らかにそれ以上のものが必要です。テキスト内の主題とオブジェクト、およびそれらがどの動詞(述語)に付随するかを把握する必要があります。アナファー( he または she が指すポイント)、否定の範囲と数量詞( every など)を解決する必要があります。 3つ以上)など。
理想的には、入力テキストを何らかの論理表現(1次論理など)にマップする必要があります。これにより、2つの文が意味や含意関係などで同等であるかどうかを判断する推論を取り入れることができます。
POS-taggerは文をマッピングしますが
Mary likes no man who owns a cat.
そのような構造へ
Mary/NNP likes/VBZ no/DT man/NN who/WP owns/VBZ a/DT cat/NN ./.
次のようなものが必要です:
SubClassOf(
ObjectIntersectionOf(
Class(:man)
ObjectSomeValuesFrom(
ObjectProperty(:own)
Class(:cat)
)
)
ObjectComplementOf(
ObjectSomeValuesFrom(
ObjectInverseOf(ObjectProperty(:like))
ObjectOneOf(
NamedIndividual(:Mary)
)
)
)
)
もちろん、POS-taggerは精度を取得し、値を100%に近づけますが、より複雑な自動処理のパフォーマンスはさらに低下します。
NLPに適したJavaライブラリは、 LingPipe です。ただし、POSタグ、チャンク、および名前付きエンティティの認識をはるかに超えたものではありません。
他のヒント
自然言語の処理は幅広く、深く、少なくとも60年代まで遡ります。一般的に計算言語学、自然言語生成、生成文法、 Markovチェーン、 chatterbots など。
ウィキペディアにはライブラリの短いリストがあります。 JavaにはNLPの長い伝統はありませんが、私はスタンフォード大学の図書館を見ていません。
言語学と文法を深く掘り下げることなく、非常に印象的な結果が得られるとは思いません。誰もが好きな学科ではありません(または、私が報告したことを聞いたことがあります-私自身を愛している!)。
多くの詳細をスキップし、これをシンプルにします。品詞タグ付けは、文から解析ツリーを作成するのに役立ちます。これを取得したら、可能な限り明確に意味を理解しようとします。この解析ステップの結果は、おしゃべりボットに適した応答を組み立てるのに非常に役立ちます。
音声タグの一部を取得したら、たとえばすべての名詞を抽出できるので、だれかが話しているものやオブジェクトを大体把握できます。
例を挙げます:
誰かが" 新しいウィンドウを開くことができます。"と言います。 POSタグがある場合、 can ( container 、 jar など)について話しているのではないことがわかります。 open )のコンテキストで、ただし window 。また、 open が動詞であることもわかります。
この情報により、チャットボットは can openers などとは関係のない、はるかに優れた返信を生成できます。
注:POSタグを取得するためにパーサーは必要ありません。シンプルなPOSタガーで十分です。パーサーはさらに多くの情報を提供します(例えば、主題は何か、文の目的は何ですか?)