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的主要内容,如果未能解决你的问题,请参考以下文章