我想计算索引中所有术语的词项频率和逆文档频率(tf-idf)。我找不到如何在最新的Lucene(4.x.x)中执行此操作的示例。你能帮我吗?
Fields
和 Terms
。 Terms
公开了您的 idf 计算所需的docfreq()
。 当然,IndexReader
本身公开了 numDocs()
。 您可以使用 DefaultSimilarity.idf
执行计算,而不是自己编写代码。DefaultSimilarity similarity = new DefaultSimilarity();
int docnum = reader.numDocs();
Fields fields = MultiFields.getFields(reader);
for (String field : fields) {
Terms terms = fields.terms(field);
TermsEnum termsEnum = terms.iterator(null);
while (termsEnum.next() != null) {
double idf = similarity.idf(termsEnum.docFreq(), docnum);
System.out.println("" + field + ":" + termsEnum.term().utf8ToString() + " idf=" + idf);
}
}
tf只与特定文档相关,所以我不太确定你在寻找什么。
fields.terms()
中。 - femtoRgonfor (String field : fields)
{
if( field.equals("contents") )
{
Terms terms = fields.terms(field);
TermsEnum termsEnum = terms.iterator(null);
while (termsEnum.next() != null)
{
// double idf = similarity.idf(termsEnum.docFreq(), docnum);
double idf = Math.log(docnum / termsEnum.docFreq()); // idf = log(D/dt)
System.out.println("" + field + ":" + termsEnum.term().utf8ToString() +" fr = "+termsEnum.docFreq() + " idf=" + idf);
}
}
else
{
System.out.println("fin");
}
}
因为 idf(t, D) = log (N \ (d in D: t in d))
N:语料库中文档的总数
d in D: t in d:词项 t 出现在的文档数量