lucene 4.10.2计算索引中所有项的tf-idf

时间:2015-01-30 21:31:41

标签: java lucene tf-idf

我想计算索引中所有术语的术语频率和逆文档频率(tf-idf),

我找不到任何使用最新Lucene(4.x.x)的例子。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

要遍历索引中的字词,您需要使用FieldsTermsTerms为您的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出现的文档数量