Lucene 4.9:从索引中获取一些选定文档的 TF-IDF

Posted

技术标签:

【中文标题】Lucene 4.9:从索引中获取一些选定文档的 TF-IDF【英文标题】:Lucene 4.9: Get TF-IDF for a few selected documents from an Index 【发布时间】:2015-01-27 05:31:02 【问题描述】:

我在 *** 以及其他在线资源上看到了很多类似的问题。但是,看起来 Lucene 的 API 的相应部分发生了很大变化,所以总结一下:我没有找到任何适用于最新 Lucene 版本的示例。

我有什么:

Lucene 索引 + IndexReader + IndexSearcher 一堆文档(及其 ID)

我想要什么: 对于在至少一个选定文档中出现的所有术语,我想为每个文档获取 TF-IDF。 或者换一种说法:我想为出现在任何选定文档中的任何术语获取其 TF-IDF 值,例如,作为一个数组(即,每个选定文档的一个 TF-IDF 值)。

非常感谢任何帮助! :-)

这是我目前的想法,但有两个问题:

    它正在使用临时创建的 RAMDirectory,其中仅包含选定的文档。有什么方法可以处理原始索引,还是没有意义? 它不获取基于文档​​的 TF IDF,而是以某种方式仅获取基于索引的,即所有文档。这意味着对于每个术语,我只能得到一个 TF-IDF 值,但不是每个文档和术语都有一个。

public void getTfidf(IndexReader reader, Writer out, String field) throws IOException 

    Bits liveDocs = MultiFields.getLiveDocs(reader);
    TermsEnum termEnum = MultiFields.getTerms(reader, field).iterator(null);
    BytesRef term = null;
    TFIDFSimilarity tfidfSim = new DefaultSimilarity();
    int docCount = reader.numDocs();

    while ((term = termEnum.next()) != null) 
        String termText = term.utf8ToString();
        Term termInstance = new Term(field, term);
        // term and doc frequency in all documents
        long indexTf = reader.totalTermFreq(termInstance); 
        long indexDf = reader.docFreq(termInstance);       
        double tfidf = tfidfSim.tf(indexTf) * tfidfSim.idf(docCount, indexDf);
        // store it, but that's not the problem

【问题讨论】:

【参考方案1】:

totalTermFreq 听起来像,提供整个索引的频率。计算中的 TF 应该是文档中的词频,而不是整个索引。这就是为什么你在这里得到的一切都是恒定的,你的所有变量在整个索引中都是恒定的,不依赖于文档。为了获得文档的词频,您应该使用DocsEnum.freq()。也许是这样的:

while ((term = termEnum.next()) != null) 
    Term termInstance = new Term(field, term);
    long indexDf = reader.docFreq(termInstance);      

    DocsEnum docs = termEnum.docs(reader.getLiveDocs())
    while(docs.next() != DocsEnum.NO_MORE_DOCS) 
        double tfidf = tfidfSim.tf(docs.freq()) * tfidfSim.idf(docCount, indexDf);
        // store it

【讨论】:

你能帮忙解决这个***.com/questions/28642930/how-can-i-compute-mtf-idf吗?

以上是关于Lucene 4.9:从索引中获取一些选定文档的 TF-IDF的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 lucene 索引中每个术语的帖子列表

如何使用Term或QueryParser从Lucene索引中删除文档

Lucene-索引库的维护

django ajax 请求获取选定的索引

lucene之filed详解和代码测试

lucene中分词和索引的区别