8

一部のタグ浅いパーサーからのチャンク名前エンティティ、およびさまざまな 自然言語処理(NLP) ツールからのその他など、基になるテキストに対する複数のレイヤーの注釈を含むデータ セットがあります。のような文の場合The man went to the store、注釈は次のようになります。

単語 POS チャンク NER
==== === ===== ========
DT NP の人     
男 NN NP 人
VBD VPに行きました -
へ へ PP -
DT NP の場所
店 NN NP 場所

Lucene を使用して、このような注釈を付けて一連のドキュメントをインデックス化し、さまざまなレイヤーで検索を実行したいと考えています。単純なクエリの例として、ワシントンがpersonとしてタグ付けされているすべてのドキュメントを取得することが挙げられます。私は表記法に完全にコミットしているわけではありませんが、構文的にエンド ユーザーは次のようにクエリを入力する場合があります。

クエリ:Word=Washington,NER=Person

また、さまざまなレイヤーにまたがる注釈の順序を含む、より複雑なクエリを実行したいと思います。たとえば、 personというタグが付けられた単語の後にlocationarrived atというタグが付けられた単語が続くすべてのドキュメントを検索します。このようなクエリは次のようになります。

クエリ:"NER=Person Word=arrived Word=at NER=Location"

Lucene でこれにアプローチする良い方法は何ですか? 構造化されたトークンを含むドキュメント フィールドをインデックス化して検索する方法はありますか?

ペイロード

1 つの提案は、Luceneペイロードの使用を試みることでした。しかし、ペイロードはドキュメントのランキングを調整するためにのみ使用でき、返されるドキュメントを選択するためには使用されないと思いました。

いくつかのユースケースでは、パターンを含むドキュメントの数が本当に必要なため、後者は重要です。

また、クエリに一致する用語のペイロードのみが検査されます。これは、ペイロードが最初の例のクエリ のランキングにしか役立たないことを意味しますWord=Washington,NER=Person。これにより、用語WashingontonPerson. ただし、2 番目のサンプル クエリでは "NER=Person Word=arrived Word=at NER=Location"、不特定の用語のタグをチェックする必要があるため、一致しない用語があります。

4

3 に答える 3

2

おそらく、あなたが求めていることを達成する1つの方法は、同じ位置にある注釈の各クラス(つまり、Word、POS、Chunk、NER)にインデックスを付け、各注釈の前に一意の文字列を付けることです。単語の接頭辞を気にしないでください。プレフィックスを保持するにはカスタムアナライザーが必要ですが、クエリに必要な構文を使用できるはずです。

具体的には、私が提案しているのは、指定された位置で次のトークンにインデックスを付けることです。

Position Word   POS      Chunk     NER
======== ====   ===      =====     ========
1        The    POS=DT   CHUNK=NP  NER=Person     
2        man    POS=NN   CHUNK=NP  NER=Person
3        went   POS=VBD  CHUNK=VP       -
4        to     POS=TO   CHUNK=PP       - 
5        the    POS=DT   CHUNK=NP  NER=Location
6        store  POS=NN   CHUNK=NP  NER=Location

セマンティクスを取得するには、SpanQueryまたはSpanTermQueryを使用してトークンシーケンスを保持します。

私はこれを試していませんが、同じ位置で異なるクラスの用語にインデックスを付けることで、位置に依存するクエリが次のような式を評価するために正しいことを実行できるようになります。

NER=人がNER=場所に到着しました

例との違いに注意してください。Word=プレフィックスを削除して、デフォルトとして扱いました。また、プレフィックス構文( "class ="など)を選択すると、インデックスを作成するドキュメントのコンテンツが制約される場合があります。ドキュメントにフレーズが含まれていないこと、または前処理で何らかの方法でそれらをエスケープしていることを確認してください。もちろん、これは使用する必要のあるアナライザーに関連しています。

更新:この手法を使用して、テキスト内の文と段落の境界にインデックスを付け(break=senおよびbreak=paraトークンを使用)、フレーズクエリの一致をどこで中断するかを決定できるようにしました。うまく機能しているようです。

于 2011-04-21T18:54:37.567 に答える
1

あなたが探しているのはペイロードです。Lucid Imagination には、このテーマに関する詳細なブログ エントリがあります。ペイロードを使用すると、個々の用語に関するメタデータのバイト配列を保存できます。ペイロードを含むデータのインデックスを作成したら、スコアリング時にペイロードを考慮に入れる新しい類似性メカニズムを作成できます。

于 2010-05-21T14:56:09.053 に答える
0

実際、 SpanQueryを使用して Lucene でテキストのパターンを検索し、スロップ距離を調整して、クエリ用語が発生する可能性のある用語の数を制限したり、それらが表示される順序を制限したりできます。

于 2010-05-22T07:18:07.950 に答える