Nutch 评分机制分析

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的打分公式:



在推导之前,先逐个介绍每部分的意义:

  • q: 查询
  • d: 文档
  • t: Term,一个查询包含1个或多个词项,这里的Term是指包含域信息的Term,也即title:hello和content:hello是不同的Term 
  • coord(q,d):一次搜索可能包含多个词项,而一篇文档中也可能包含多个搜索词。此项表示,当一篇文档中包含的搜索词越多,则此文档则打分越高。 
  • queryNorm(q):计算每个查询条目的方差和,此值并不影响排序,而仅仅使得不同的query之间的分数可以比较。其公式如下: 

  • tf(t in d):Term t在文档d中出现的词频 
  • idf(t):Term t在几篇文档中出现过 
  • norm(t, d):标准化因子,它包括三个参数: 
  • Document boost:此值越大,说明此文档越重要。 
  • Field boost:此域越大,说明此域越重要。 
  • lengthNorm(field) = (1.0 / Math.sqrt(numTerms)):一个域中包含的Term总数越多,也即文档越长,此值越小,文档越短,此值越大。 

 


  

各类Boost值

  • t.getBoost():查询语句中每个词的权重,可以在查询中设定某个词更加重要,common^4 hello 
  • d.getBoost():文档权重,在索引阶段写入nrm文件,表明某些文档比其他文档更重要。   (PageRank值设置?)
  • f.getBoost():域的权重,在索引阶段写入nrm文件,表明某些域比其他的域更重要。 

以上在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 官方相似度计算公式的介绍

 

 

你可能感兴趣的:(Nutch 评分机制分析)