Lucene 4.0中的术语向量频率

9
我正在从Lucene 3.6升级到Lucene 4.0-beta。在Lucene 3.x中,IndexReader包含一个方法IndexReader.getTermFreqVectors(),我可以使用它来提取给定文档和字段中每个术语的频率。
现在这个方法被IndexReader.getTermVectors()替换了,它返回Terms。我如何利用这个(或可能是其他)方法来提取文档和字段中的术语频率?

与https://dev59.com/EWvXa4cB1Zd3GeqPHD_B?rq=1和https://dev59.com/ZnI-5IYBdhLWcg3wc4Cw相关。 - Mark Butler
4个回答

14

也许这会对你有所帮助:

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

它至少帮了我!谢谢你写下这些代码。 - lizzie

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

在最后一步中,变量 terms 是什么? - Adam_G
terms 是一个使用以下定义的 Set 实例:private final Set<String> terms = new HashSet<>(); - Ajitesh

1

有各种文档介绍如何使用灵活的索引API:

访问文档术语向量的字段/术语与访问帖子列表使用完全相同的API,因为术语向量实际上只是该文档的微型倒排索引。

因此,可以完全使用所有这些示例,但您可以缩短一些快捷方式,因为您知道这个“微型倒排索引”中只有一个文档。例如,如果您只想获取术语的频率,则可以定位到该术语并使用聚合统计信息(例如totalTermFreq,参见https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core/org/apache/lucene/index/package-summary.html#stats),而不是打开仅枚举单个文档的DocsEnum。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接