2

Lucene 4.2 を使用していますが、このバージョンの Lucene の入力クエリを拡張するために wordnet を使用する方法を知りたいです。基本的に、私のクエリが次のような場合

term_1 AND term_2 OR term_3

として展開してほしい。

(term_1 OR term_1syn_1 OR term_1syn_2) AND (term_2 OR term_2syn_1) OR (term_3 OR term_3syn_1)

等々。

この種の質問について StackoverFlow で他の回答を見ましたが、サンプル実装はありません。

文字列形式の入力クエリが与えられた場合、WordNetQueryParser および SynonymMap クラスを使用してそれを拡張するにはどうすればよいですか?

wordnet プロローグ ファイルは既にダウンロードしており、_s.pl ファイルにはすべての類義語が含まれていることがわかっています。

サンプルコードは高く評価されます。

4

1 に答える 1

6

SynonymFilterを使用すると、 SynonymnMapを単純なカスタム アナライザー 定義できます。

Analyzer.createComponentsをオーバーライドするだけでカスタム Analyzer を作成し、カスタム バージョンを IndexWriter と QueryParser の両方に渡すことができます。

考慮すべきことの1つは、考えられるすべての同義語を分解することです。これは、 includeOrigを Builder.add に true に渡すことを意味します。ここにはどちらの方法でも利点があります。実際にどちらがニーズに最も適しているかを調べることができます.


Lucene'sAnalyzerは、特定のケースのフォーマットを簡単に定義できるように、簡単に拡張できるように設計されています。上記のAnalyzerリンク先の API ドキュメントには、カスタム アナライザーの createComponents メソッドをオーバーライドする例が示されています。

何かのようなもの:

protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new ClassicTokenizer(Version.LUCENE_40, reader);
    TokenStream filter = new StandardFilter(Version.LUCENE_40, source);
    filter = new LowerCaseFilter(Version.LUCENE_40,filter);
    filter = new SynonymFilter(filter, mySynonymMap, false);
    //Whatever other filter you want to add to the chain, being mindful of order.
    return new TokenStreamComponents(source, filter);
}

そして、例から mySynonymMap を定義する必要がありますSynonymnMap。はSynonymMap通常、上記のリンクされSynonymMap.Builderた方法を使用して、によってビルドする必要があります。add(CharsRef, CharsRef, boolean)

SynonymMap.Builder builder = new SynonymMap.Builder(true); 
builder.add(new CharsRef("crimson"), new CharsRef("red"), true); 
//Be sure the boolean last arg you pass there is the one you want.  There are significant tradeoffs here.
//Add as many terms as you like here...
SynonymMap mySynonymMap = builder.build();

またWordNetSynonymParser、必要に応じて、特定の種類の仕様を一目で読み取るように設計された SynonymMap.Builder のように見える もあります。

于 2013-03-28T16:30:35.040 に答える