Nutch构建于Lucene之上,可以通过学习Lucene的评分机制来了解Nutch评分。
Lucene的打分公式可以在Lucene的Similarity类中看到。详见文档Lucene Similarity Javadoc .
大体上:
查询结果集中一个特定文档的得分score(q,d),是查询中每一个词项的得分之和(t in q);
一个词项对于一个文档的得分,是该词项在文档不同的域field(url、title、content)的得分之和;
对于每一个域,词项得分是下列因素的乘积:tf、idf、index-time boost、lengthNorm、queyrNorm
我怎么影响Nutch评分?
评分用过滤插件实现,比如一个评分过滤类:OPIC Scoring。
然而,最简单的影响评分的方式是修改查询时boosts的值(通过修改nutch-site.xml实现)。这些boosts的默认值保存在nutch-default.xml文件中,为
query.url.boost, 4.0f
query.anchor.boost, 2.0f
query.title.boost, 1.5f
query.host.boost, 2.0f
query.phrase.boost, 1.0f
由此看出,URL中的词项有着最高的权重,锚文本、标题、主机、短语依次降低。
译自Nutch维基
***************************************************************************************
Lucene的文档得分计算
在Lucene的Similarity类中,详见文档Lucene Similarity Javadoc .
文档的得分是在用户进行检索时实时计算出来的。
Lucene的打分公式:
在推导之前,先逐个介绍每部分的意义:
- Document boost:此值越大,说明此文档越重要。
- Field boost:此域越大,说明此域越重要。
- lengthNorm(field) = (1.0 / Math.sqrt(numTerms)):一个域中包含的Term总数越多,也即文档越长,此值越小,文档越短,此值越大。
各类Boost值
以上在Lucene的文档中已经详细提到,并在很多文章中也被阐述过,如何调整上面的各部分,以影响文档的打分,请参考有关Lucene的问题(4):影响Lucene对文档打分的四种方式一文。
Lucene评分机制的数学推导
*********************************************************************************
通过Searcher.explain(Query query, int doc)方法可以查看某个文档的得分的具体构成。
在Lucene中score简单说是由 tf * idf * boost * lengthNorm计算得出的。
tf:是查询的词在文档中出现的次数的平方根
idf:表示反转文档频率,观察了一下所有的文档都一样,所以那就没什么用处,不会起什么决定作用。
boost:激励因子,可以通过setBoost方法设置,需要说明的通过field和doc都可以设置,所设置的值会同时起作用
lengthNorm:是由搜索的field的长度决定了,越长文档的分值越低。
所以我们编程能够控制score的就是设置boost值。
还有个问题,为什么一次查询后最大的分值总是1.0呢?
因为Lucene会把计算后,最大分值超过1.0的分值作为分母,其他的文档的分值都除以这个最大值,计算出最终的得分。
Lucene的评分(score)机制的简单解释
*********************************************************************************
文档的得分是在用户进行检索时实时计算出来的,与查询相关。
Lucene 用于计算某个关键字在对应于某文档的得分公式:
初始化 Document 后,使用了 Document 的 setBoost 方法来改变一下文档的 boost 因子。根据文档 Lucene评分机制的数学推导 中norm(t,d)的计算公式可知,最终的得分将会乘以这个因子。
Lucene评分算法
*********************************************************************************
参考资料:
Nutch维基
Lucene评分机制的数学推导 该文档还有对向量空间模型的介绍,各个公式的推导很不错
Lucene的评分(score)机制的简单解释 有个程序例子, Searcher.explain(Query query, int doc)方法输出得分计算过程
Lucene评分算法 有个程序例子,利用setBoost方法,改变boost值
Lucene Similarity Javadoc 官方相似度计算公式的介绍