java - 如何从多个字段组合中获取 Term-Doc 频率?

标签 java lucene term-document-matrix

我用 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/

相关文章:

java - 自定义过滤器不适用于 solr

python - Python 中的术语文档矩阵和余弦相似度

r - 使用 R 和术语文档矩阵创建频率表

solr - 如何告诉 Solr 返回每个文档的命中搜索词?

java - 如何防止 Eclipse 在粘贴代码时自动导入包?

java - Eclipse Gradle 插件 : <some pom file> cannot be read or is not a valid ZIP file

java - 在索引中搜索作为搜索词前缀的词,反之亦然(!)

regex - elasticsearch span_near查询错误命中

java - 用并行流替换 for 循环 - Java

java - Android SQLite ID