我试图计算文档中每个术语的tf-idf值。因此,我遍历文档中的术语,并希望找到该术语在整个语料库中的频率以及该术语出现的文档数。以下是我的代码:
//@param index path to index directory
//@param docNbr the document number in the index
public void readingIndex(String index, int docNbr) {
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index)));
Document doc = reader.document(docNbr);
System.out.println("Processing file: "+doc.get("id"));
Terms termVector = reader.getTermVector(docNbr, "contents");
TermsEnum itr = termVector.iterator(null);
BytesRef term = null;
while ((term = itr.next()) != null) {
String termText = term.utf8ToString();
long termFreq = itr.totalTermFreq(); //FIXME: this only return frequency in this doc
long docCount = itr.docFreq(); //FIXME: docCount = 1 in all cases
System.out.println("term: "+termText+", termFreq = "+termFreq+", docCount = "+docCount);
}
reader.close();
}
虽然文档中说totalTermFreq()返回该术语在所有文档中出现的总次数,但测试时我发现它只返回docNbr给出的术语在文档中出现的频率,而docFreq()总是返回1。
如何获得术语在整个索引中的频率?
更新当然,我可以创建一个Map,将一个术语Map到它的频率。然后遍历每个文档,计算一个术语出现的总次数。但是,我认为Lucene应该有一个内置的方法来实现这个目的。谢谢,
1条答案
按热度按时间b4lqfgs41#
IndexReader.TotalTermFreq(Term)
将为您提供这些。您对TermsEnum
上的类似方法的调用实际上提供了枚举中所有文档的统计信息。使用读取器应该可以获得索引本身中所有文档的统计信息。类似于: