gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:52:10 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com