7

我正在尝试计算文档中每个术语的 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。

如何在整个索引中获取术语的频率?

更新 当然,我可以创建一个映射来将一个术语映射到它的频率。然后遍历每个文档以计算一个术语出现的总次数。但是,我认为 Lucene 应该为此目的有一个内置的方法。谢谢,

4

1 回答 1

14

IndexReader.TotalTermFreq(Term)将为您提供这个。您对类似方法的调用TermsEnum确实在枚举中提供了所有文档的统计信息。使用阅读器应该可以让您获得索引本身中所有文档的统计信息。就像是:

String termText = term.utf8ToString();
Term termInstance = new Term("contents", term);                              
long termFreq = reader.totalTermFreq(termInstance);
long docCount = reader.docFreq(termInstance);

System.out.println("term: "+termText+", termFreq = "+termFreq+", docCount = "+docCount);
于 2013-12-13T21:16:39.477 回答