簡體   English   中英

Lucene 4.0中的術語矢量頻率

[英]Term Vector Frequency in Lucene 4.0

我正在從Lucene 3.6升級到Lucene 4.0-beta。 在Lucene 3.x中, IndexReader包含一個方法IndexReader.getTermFreqVectors() ,我可以使用它來提取給定文檔和字段中每個術語的頻率。

此方法現在由IndexReader.getTermVectors()替換,它返回Terms 我如何利用這個(或可能是其他方法)來提取文檔和字段中的術語頻率?

也許這會對你有所幫助:

// get terms vectors for one document and one field
Terms terms = reader.getTermVector(docID, "fieldName"); 

if (terms != null && terms.size() > 0) {
    // access the terms for this field
    TermsEnum termsEnum = terms.iterator(null); 
    BytesRef term = null;

    // explore the terms for this field
    while ((term = termsEnum.next()) != null) {
        // enumerate through documents, in this case only one
        DocsEnum docsEnum = termsEnum.docs(null, null); 
        int docIdEnum;
        while ((docIdEnum = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
            // get the term frequency in the document 
            System.out.println(term.utf8ToString()+ " " + docIdEnum + " " + docsEnum.freq()); 
        }
    }
}

具體而言,請參閱此相關問題

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);
}

有關如何使用靈活索引apis的各種文檔:

訪問文檔術語向量的字段/術語與用於訪問帖子列表的API完全相同,因為術語向量實際上只是一個文檔的微型反向索引。

因此,完全可以使用所有這些示例,盡管您可以制作一些快捷方式,因為您知道在這個“微型倒排索引”中只有一個文檔。 例如,如果你只是想獲得一個術語的頻率,你可以尋求它並使用像totalTermFreq這樣的聚合統計數據(參見https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core /org/apache/lucene/index/package-summary.html#stats ),而不是實際打開只會枚舉單個文檔的DocsEnum。

我有這個工作在我的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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM