编程语言
首页 > 编程语言> > c# – 仅根据lucene中出现更多术语的文档计算得分

c# – 仅根据lucene中出现更多术语的文档计算得分

作者:互联网

我开始研究基于lucene.net引擎的简历检索(文档)组件.它工作得很好,它可以获取文档并根据文档对其进行评分

the idea behind the VSM is the more
times a query term appears in a
document relative to the number of
times the term appears in all the
documents in the collection, the more
relevant that document is to the
query.

Lucene的实用评分功能源于以下内容.

score(q,d)=coord(q,d)·queryNorm(q)· ∑( tf(t in d) ·idf(t)2 · t.getBoost() · norm(t,d) ) 
                                  t in q

在这

> tf(t in d)与术语的频率相关,定义为术语t出现在当前评分文档中的次数d.具有更多特定术语的文档会获得更高的分数
> idf(t)代表逆文档频率.该值与docFreq的倒数(术语t出现的文档数)相关.这意味着更罕见的术语对总分的贡献更高.

在大多数情况下,这确实非常棒,但由于现场规范计算,结果并不准确

fieldnorm aka“field length norm”值表示该doc中该字段的长度(因此较短的字段会自动提升).

由于这个原因,我们没有得到准确的结果.
举个例子,我得到10000个文件,其中3000个文件有java和oracle关键字.并且每个文档看起来都没有变化.

>假设doc A在1000个单词中得到10个java 20 oracle,而doc B在50个单词中得到2个java 2 oracle
>如果我正在搜索“java和oracle”的查询,lucene会返回高分的doc B.
由于长度归一化.

由于业务的性质我们需要检索文件得到更多的搜索关键字出现应该先来,我们并不真正关心文件的长度.

因此,一个带有大量关键字的简历的Guy在结果中被移到了下面,并且出现了一些小的简历.

为了避免这种情况,我需要禁用长度标准化.有人可以帮我弄这个吗??

我附上了Luke结果图片供您参考.

在此图像中,使用java 50次和oracle 6次的文档向下移动到第11位.

但是这个带有java 24次和oracle 5次的文档因为fieldnorm而成为最佳射手.

希望我清楚地传达信息……如果不是,请问我,我会提供更多信息

最佳答案:

您可以使用Field.setOmitNorms(true)禁用长度标准化

标签:c,java,search,lucene,lucene-net
来源: https://codeday.me/bug/20190515/1110442.html