5

Lucene で頻出フレーズをいくつか取得したいと思います。TXT ファイルから情報を取得していますが、フレーズの情報がないために多くのコンテキストが失われています。たとえば、「情報検索」は 2 つの別個の単語として索引付けされています。

このようなフレーズを取得する方法は何ですか? 私はインターネット上で役立つものを見つけることができません.すべてのアドバイス、リンク、ヒント、特に例は大歓迎です!

編集:タイトルとコンテンツだけでドキュメントを保存します:

 Document doc = new Document();
 doc.add(new Field("name", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
 doc.add(new Field("text", fReader, Field.TermVector.WITH_POSITIONS_OFFSETS));

私がやっていることにとって最も重要なのはファイルの内容だからです。タイトルがまったく説明的でないことがあまりにも多い (たとえば、タイトルがコードまたは数字である PDF 学術論文がたくさんある)。

テキスト コンテンツから上位に出現するフレーズをインデックス化する必要がどうしてもありますが、この単純な「単語の袋」アプローチがいかに効率的でないかがわかりました。

4

3 に答える 3

7

ジュリア、あなたが探しているのはn-gram、特にBigram(コロケーションとも呼ばれます)のようです。

これは、Manning and Schutzeの統計的自然言語処理の基礎からのコロケーションPDF)の検索に関する章です。

Luceneでこれを行うには、 ShingleFilterFactoryでSolrを使用することをお勧めします。詳細については、このディスカッションを参照してください。

于 2010-06-29T10:27:19.513 に答える
0

あなたが書いたコードを投稿することは可能ですか?

基本的に、フィールドの作成方法と lucene でのドキュメントの保存方法に大きく依存します。

ID とコメントの 2 つのフィールドがある場合を考えてみましょう。ID フィールドでは、この 'finding nemo' のような値、つまりスペースを含む文字列を許可します。一方、「コメント」はフリー フローのテキスト フィールドです。つまり、キーボードで許可され、lucene が理解できるものは何でも許可します。

実際のシナリオでは、ID:'finding nemo' を 2 つの異なる検索可能な文字列にすることは意味がありません。コメントのすべてにインデックスを付けたいのですが。

だから私がやることは、これを処理するためにドキュメント(org.apache.lucene.document.Document)オブジェクトを作成することです...このようなもの

Document doc = new Document();
doc.add(new Field("comments","Finding nemo was a very tough job for a clown fish ...", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("id", "finding nemo", Field.Store.YES, Field.Index.NOT_ANALYZED));

したがって、基本的には2つのフィールドを作成しました:

  1. コメント: を使用して分析することを好んだ場所Field.Index.ANALYZED
  2. id: lucene に保存するように指示しましたが、分析はしませんでしたField.Index.NOT_ANALYZED

これは、デフォルトのトークナイザーとアナライザー用に lucene をカスタマイズする方法です。それ以外の場合は、独自のトークナイザーとアナライザーを作成できます。

リンク http://darksleep.com/lucene/

これがあなたを助けることを願っています... :)

于 2010-06-29T09:36:49.717 に答える
0

フレーズのコンテキストが失われるという問題は、PhraseQuery を使用することで解決できます。

omitTermFreqAndPositions オプションでインデックス付けして純粋なブール フィールドを作成しない限り、インデックスにはデフォルトで用語の位置情報が含まれます。PhraseQuery はこの情報を使用して、用語が互いに一定の距離内にあるドキュメントを検索します。

たとえば、フィールドに「速い茶色のキツネが怠惰な犬を飛び越えた」というフレーズが含まれているとします。正確な語句がわからなくても、フィールドが quick と fox の近くにあるドキュメントを検索することで、このドキュメントを見つけることができます。確かに、単純な TermQuery は、これらの単語のいずれかを知っていれば、このドキュメントを見つけるトリックを実行しますが、この場合、単語が正確に並んでいる (クイック フォックス) か、間に 1 つの単語があるフレーズを含むドキュメントのみが必要です (クイック[無関係]キツネ)。一致と見なされるターム間の最大許容位置距離は、slop と呼ばれます。距離は、フレーズを順番に再構築するための用語の位置移動の数です。

PhraseQueryについては、Lucene の JavaDoc を参照してください。

さまざまなクエリ オブジェクトを操作する方法を示す次のサンプル コードを参照してください。

BooleanQuery クラスを使用して、さまざまなクエリ タイプを組み合わせることもできます。

語句の頻度に関しては、Lucene の採点では文書内での語句の出現頻度が考慮されていると思います。

于 2010-06-29T13:25:50.177 に答える