9

Lucene 3.6 から Lucene 4.0-beta にアップグレードしています。Lucene 3.x では、特定のドキュメントとフィールド内の各用語の頻度を抽出するために使用できるIndexReaderメソッドが含まれています。IndexReader.getTermFreqVectors()

IndexReader.getTermVectors()このメソッドは、 を返す に置き換えられましたTerms。ドキュメントとフィールドで用語の頻度を抽出するために、これ (またはおそらく他の方法) をどのように利用できますか?

4

4 に答える 4

3

特に、この関連する質問を参照してください

Terms vector = reader.getTermVector(docId, CONTENT);
TermsEnum termsEnum = null;
termsEnum = vector.iterator(termsEnum);
Map<String, Integer> frequencies = new HashMap<>();
BytesRef text = null;
while ((text = termsEnum.next()) != null) {
    String term = text.utf8ToString();
    int freq = (int) termsEnum.totalTermFreq();
    frequencies.put(term, freq);
    terms.add(term);
}
于 2013-01-22T00:21:53.373 に答える
1

フレキシブル インデックス API の使用方法に関するさまざまなドキュメントがあります。

ドキュメント ターム ベクトルのフィールド/タームへのアクセスは、投稿リストへのアクセスに使用する API とまったく同じです。ターム ベクトルは、実際にはその 1 つのドキュメントの小型逆索引にすぎないからです。

したがって、これらすべての例をそのまま使用してもまったく問題ありませんが、この「ミニチュア逆索引」にはドキュメントが 1 つしかないことがわかっているため、いくつかのショートカットを作成できます。たとえば、用語の頻度を取得したいだけの場合は、それを探して、totalTermFreq などの集計統計を使用できます ( https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/coreを参照)。 /org/apache/lucene/index/package-summary.html#stats )、1 つのドキュメントのみを列挙する DocsEnum を実際に開くのではなく。

于 2012-08-29T04:46:34.757 に答える
0

Lucene 4.2 インデックスでこれを使用しています。これは私のために働く小さなテストプログラムです。

try {
    directory[0] = new SimpleFSDirectory(new File(test1));
    directory[1] = new SimpleFSDirectory(new File(test2));
    directory[2] = new SimpleFSDirectory(new File(test3));
    directoryReader[0] = DirectoryReader.open(directory[0]);
    directoryReader[1] = DirectoryReader.open(directory[1]);
    directoryReader[2] = DirectoryReader.open(directory[2]);

    if (!directoryReader[2].isCurrent()) {
        directoryReader[2] = DirectoryReader.openIfChanged(directoryReader[2]);
    }
    MultiReader mr = new MultiReader(directoryReader);

    TermStats[] stats=null;
    try {
        stats = HighFreqTerms.getHighFreqTerms(mr, 100, "My Term");
    } catch (Exception e1) {
        e1.printStackTrace();
        return;
    }

    for (TermStats termstat : stats) {
        System.out.println("IBI_body: " + termstat.termtext.utf8ToString() +
            ", docFrequency: " + termstat.docFreq);
    }
}
于 2013-03-28T19:34:51.557 に答える