シンプルなチャット ボットに自然言語解析ライブラリを使用したいと考えています。品詞タグを取得できますが、いつも疑問に思っています。POSで何をしますか。スピーチの部分を知っている場合は、どうすればよいですか?
回答の参考になると思います。しかし、どのデータ構造とアーキテクチャを使用できるでしょうか。
品詞タガーは、入力テキスト内の単語にラベルを割り当てます。たとえば、人気のある Penn Treebank タグセットには、「複数名詞」、「比較形容詞」、「過去時制動詞」など、約 40 のラベルがあります。タガーは、いくつかのあいまいさも解決します。たとえば、多くの英語の単語形式は名詞または動詞のいずれかになりますが、他の単語のコンテキストでは、それらの品詞は明確です。したがって、テキストに POS タグで注釈を付けると、次のような質問に答えることができます: 名詞はいくつある?、動詞を含まない文はいくつ?など。
チャットボットの場合、明らかにそれ以上のものが必要です。テキスト内の主語と目的語、およびそれらがどの動詞 (述語) に付いているかを把握する必要があります。アナフォ(どの個人が指し示すか)、否定と数量詞の範囲は何か(たとえば、すべて、3つ以上)などを解決する必要があります。
理想的には、入力テキストをなんらかの論理表現 (一次論理など) にマップする必要があります。これにより、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 タガーは 100% に近い精度と再現率の値を取得しますが、より複雑な自動処理ではパフォーマンスが大幅に低下します。
NLP に適した Java ライブラリはLingPipeです。ただし、POS のタグ付け、チャンキング、名前付きエンティティの認識にとどまりません。
自然言語処理は広く深く、そのルーツは少なくとも 60 年代にさかのぼります。一般的な計算言語学、自然言語生成、生成文法、マルコフ連鎖、おしゃべりボットなどについて読み始めることができます。
ウィキペディアには、あなたが見たことがあると思われるライブラリの短いリストがあります。私はスタンフォード大学のライブラリを調べたことはありませんが、Java には NLP における長い伝統はありません。
言語学と文法をかなり深く掘り下げなければ、非常に印象的な結果が得られるとは思えません。誰もが好きな教科というわけではありません (または、報告を聞いたことがありますが、私自身が大好きです!)。
多くの詳細をスキップして、これを単純にしておきます。品詞のタグ付けは、文から構文解析ツリーを作成するのに役立ちます。これを取得したら、可能な限り明確に意味を理解しようとします。この解析ステップの結果は、チャットボットに適した応答を組み立てるのに大いに役立ちます。
品詞タグを取得すると、たとえばすべての名詞を抽出できるため、誰かが話していることやオブジェクトについて大まかに知ることができます。
例を挙げると:
誰かが「新しいウィンドウを開くことができます」と言います。POS タグがある場合、それらが缶( container、jarなどのように、 openのコンテキストでも意味がある) について話しているのではなく、ウィンドウについて話していることがわかります。 . また、 openが動詞であることもわかります。
この情報を使用して、チャット ボットは、缶切りなどとは関係のない、より優れた応答を生成できます。
注: POS タグを取得するためにパーサーは必要ありません。シンプルな POS タガーで十分です。パーサーは、さらに多くの情報を提供します (例えば、主語は何か、文の目的語は何ですか?)。