作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 lucene 编写了一个索引,来自一组文档。我的文档有 2 个字段,并像这样添加到索引中:
Document doc = new Document();
doc.add(new TextField("Title", "I am a title", Field.Store.NO));
doc.add(new TextField("Text", "random text content", Field.Store.NO));
indexWriter.addDocument(doc);
我想读取索引并获取每个(术语,文档)对的术语频率。
如果我只有 1 个字段,比方说“文本”,我会使用以下代码:
IndexReader indexReader = ...;
Terms terms = MultiFields.getTerms(indexReader, "Text"); // get all terms of this field
TermsEnum termsIterator = terms.iterator();
BytesRef term;
// For every term in the "Text" Field:
while ((term = termsIterator.next()) != null) {
String termString = term.utf8ToString(); // The term
PostingsEnum postingsEnum = MultiFields.getTermDocsEnum(indexReader,
"Text", term, PostingsEnum.FREQS);
int i;
// For every doc which contains the current term in the "Text" field:
while ((i = postingsEnum.nextDoc()) != PostingsEnum.NO_MORE_DOCS) {
Document doc = indexReader.document(i); // The document
int freq = postingsEnum.freq(); // Frequency of term in doc
}
}
但是,由于我有 2 个字段(“标题”和“文本”),为了获得 (term, doc) 对的总词频,我首先需要获取每个 (term, doc) 对“标题”字段的频率
并将它们保存在内存中,然后获取“文本”字段的每个(术语,文档)对频率
并为每个唯一的手动组合它们返回的 (term, doc) 对。
因此,此方法很可能会多次遍历 (term, doc) 对,因为相同的 (term, doc) 对可能同时存在于“标题”和“文本”中"字段(如果文档在其“标题”和“文本”中具有相同的术语)。
Lucene API 是否有任何方法可以遍历所有组合的字段? (以避免多次迭代相同的对)
最佳答案
您有两个字段,您需要每个文档的所有标记的频率作为每个字段和文档的频率之和。
请记住 BytesRef(和 Integer)实现了 Comparable 接口(interface):您的 token 流 (TermsEnum) 和每个关联的文档流 (PostingEnum) 都是有序的。
所以你有两次合并两个有序流。您不必在内存中保存比每个流头更多的内容。
关于java - 如何从多个字段组合中获取 Term-Doc 频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34442208/
我是一名优秀的程序员,十分优秀!