仅根据lucene中有更多术语出现的文件来计算得分
我开始研究基于lucene.net引擎的简历检索(文档)组件。 它工作得很好,它可以获取文档并根据文档对其进行评分
VSM背后的想法是,相对于该术语在集合中的所有文档中出现的次数,查询术语在文档中出现的次数越多,该文档与查询的相关性就越高。
Lucene的实用评分function源于以下内容。
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返回高分的文档B.
由于业务的性质我们需要检索文件得到更多的搜索关键字出现应该先来,我们并不真正关心文件的长度。
因此,一个带有大量关键字的简历的Guy在结果中被移到了下面,并且出现了一些小的简历。
为了避免这种情况,我需要禁用长度标准化。 有人可以帮我弄这个吗??
我附上了Luke结果图片供您参考。
在此图像中,使用java 50次和oracle 6次的文档向下移动到第11位。
但是这个带有java 24次和oracle 5次的文档因为fieldnorm而成为最佳射手。
希望我清楚地传达信息……如果不是,请问我,我会提供更多信息
您可以使用Field.setOmitNorms禁用长度规范化(true)