gpt4 book ai didi

java - Lucene 6中如何获取文档的字段范数?

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

我想为通过 Lucene 找到的各种文档的字段 COMBINED_FIELD 中的每个术语计算 TF-IDF 分数,这些分数按字段范数归一化。正如您在下面的代码中看到的,我能够获取文档字段中每个术语的术语频率,我也可以获得文档频率,但我找不到获取该字段规范的方法查询时间。到目前为止,我发现的所有方法都依赖于仅存在于旧 Lucene 版本中的方法,但不适用于 Lucene 6。要走的路可能是使用 LeafReader。 , 但我没有找到获取它实例的方法。

您知道我如何获得每个文档的字段 COMBINED_FIELD 的范数吗?

或者我可以使用 termVector.size() 代替字段长度吗? size() 是否考虑了数量每个术语的出现次数还是每个术语只计算一次?

提前致谢!

IndexSearcher iSearcher = null;
ScoreDoc[] docs = null;
try {
iSearcher = this.searchManager.acquire();
IndexReader reader = iSearcher.getIndexReader();

MultiFieldQueryParser parser = new MultiFieldQueryParser(this.getSearchFields(), this.queryAnalyzer);

parser.setDefaultOperator(QueryParser.Operator.OR);

Query query = parser.parse(QueryParser.escape(searchString));

docs = iSearcher.search(query, maxSearchResultNumber).scoreDocs;

for(int i=0; i < docs.length; i++) {
Terms termVector = reader.getTermVector(docs[i].doc, COMBINED_FIELD);

TermsEnum itr = termVector.iterator();
BytesRef term = null;
PostingsEnum postings = null;

while((term = itr.next()) != null){
String termText = term.utf8ToString();
postings = itr.postings(postings, PostingsEnum.FREQS);
postings.nextDoc();

int tf = postings.freq();
int docFreq = reader.docFreq(new Term(COMBINED_FIELD, term));
//HERE I WANT TO GET THE FIELD LENGTH OF THE CURRENT DOCUMENT
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
this.searchManager.release(iSearcher);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

或者,有没有办法直接从 Lucene 中获取字段的每个术语的 TF-IDF 或 BM25 值?

最佳答案

Lucene 在方法 org.apache.lucene.search.similarities.Similarity#computeNorm 中在索引期间内部计算范数,然后将其编码并存储在磁盘上的 .nvm 文件。后来,在查询/评分过程中,它只被解码。

我认为,在 Lucene 中以编程方式执行此操作的一种可能方法是扩展 Similarity 类,并以某种方式在索引期间获取此信息并将其存储在某处。在我看来这不是最好的方法,但至少是一些东西。

另一方面,BM25Similarity 以这种方式计算长度:

discountOverlaps ? state.getLength() - state.getNumOverlap() : state.getLength();

其中 getLength() 是字段中的术语数,您可以像在示例中那样通过在 while 中迭代来计算它。

关于java - Lucene 6中如何获取文档的字段范数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46026674/

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