5

「サンフランシスコに行く」、「メイン ストリート 123 番地までの道順を教えて」などの音声ナビゲーション コマンドのセマンティック解析に NLTK を使用しようとしています。

これは、次のようなかなり単純な CFG 文法で実行できます。

S -> COMMAND LOCATION
COMMAND -> "go to" | "give me directions to" | ...
LOCATION -> CITY | STREET | ...

問題は、これには「go to」などの非アトミック(複数の単語の長さ)リテラルが含まれていることです.NLTKは設定されていないようです(間違っている場合は修正してください)。解析タスクには前提条件としてタグ付けがあり、すべてのタガーは常に個々の単語にタグ付けしているようです。だから、私のオプションは次のようです:

a) 非構文タグを個々の単語ではなく単語シーケンスに割り当てることができるカスタム タガーを定義します (例: "go to" : "COMMAND")。b) 機能を使用して文法を補強します。たとえば、次のようなものです。

COMMAND -> VB[sem='go'] P[sem='to'] | ...

c) チャンカーを使用して COMMAND などのサブ構造を抽出し、結果にパーサーを適用します。NLTK はチャンカー -> パーサーのカスケードを許可しますか?

これらのオプションのいくつかは複雑に見えます (ハック)。良い方法はありますか?

4

3 に答える 3

1

命令を特定したいようです。

この回答はそれを調べており、オプション(a)と同様のソリューションが含まれていますが、タガーがほとんどの作業を実行できるため、少し異なります。(b) 確かに少しハッキリしているように見えます...しかし、かなりカスタムなアプリケーションを作成しているので、うまくいく可能性があります! (c) 逆に、(a) の CFG に基づいて解析してからチャンクします。

ただし、全体として、他の回答が説明しているように、これを行うための完璧な方法はまだないようです

pattern.enも参照してください ( GitHubリポジトリも参照してください)。彼らの

mood()関数は、解析されたセンテンスを指示的、命令的、条件付き、または仮定法として識別しようとします

于 2013-09-08T17:37:29.467 に答える
0

関連タスク (商取引のセマンティック パーサーの複製) については、以前に (c) のようなことを行いました。カスケード パーサー ワークフローの最大の利点は、グラマーが比較的単純 (かつ高速) に保たれることです。これは、パーサー ワークフローを設計するための有効な戦略であるため、ここでは最もハックの少ないアプローチだと思います。

(a) については、カスタム タガーには何らかのトレーニング データが必要です。それを作成またはブートストラップできる場合、それが最も自然な解決策になります。タガーを使用してスパン アノテーションを行うには、名前付きエンティティ アノテーションに一般的に使用される BIO (IOBES) スキーマの使用を検討してくださいYou/B-COMMAND shall/I-COMMAND not/I-COMMAND pass/E-COMMAND !/O

于 2021-09-17T08:56:21.117 に答える