Lucene 4.10.2 计算索引中所有术语的 TF-IDF。

3
我想计算索引中所有术语的词项频率和逆文档频率(tf-idf)。我找不到如何在最新的Lucene(4.x.x)中执行此操作的示例。你能帮我吗?

我将使用Lucene对XML文档(仅内容)进行索引。我会计算TF-IDF并在Kohonen网络中使用它们来分类文档集合。 - tommy
2个回答

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);
    }
}

tf只与特定文档相关,所以我不太确定你在寻找什么。


感谢您的回复,这非常有用。 我如何将其用于单个字段FIELD_CONTENT(我有3个字段FIELD_CONTENT、FILE_NAME和PATH)? - tommy
不要使用for循环遍历字段名称,只需将已知的字段名称传递到fields.terms()中。 - femtoRgon

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 in D: t in d))

N:语料库中文档的总数

d in D: t in d:词项 t 出现在的文档数量


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接