我想计算索引中所有术语的术语频率和逆文档频率(tf-idf),
我找不到任何使用最新Lucene(4.x.x)的例子。
你能帮帮我吗?
答案 0 :(得分:2)
要遍历索引中的字词,您需要使用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);
}
}
仅与特定文件的术语相关,因此不太确定您在寻找的是什么。
答案 1 :(得分:0)
for (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中的d:d中的t))
N:语料库中的文档总数
d in D:t in d:术语t出现的文档数量