Lucene TFIDF打分公式

还没读TFIDFSimilarity的代码,读了一下lucene的文档,没有特复杂,感觉还是很严谨的。

对于查询q和文档d,假设查询为纯token查询,套用向量空间模型(VSM),相似度度量使用余弦,另外再加一个coord(q,d)即d中满足q中must和should查询条件个数的度量(估计一般是m / n了)。cos直接用向量点积除以两个向量的模(euclidean norm)。

cos = v(q) * v(d) / (|v(q)|  * |v(d)|)

sim = coord(q,d) * cos

其中:

v(q) = (idf(t),...)

v(d) = (tf,...)

其中tf并非简单的term freq,而是其平方根,这很可能是为了让其模刚好是doclen。

idf = 1 + log(numDocs / (1 + docFreq),因此这个公式里面,tf的数值被弱化了。

在文档的lucene practical scoring formula,其中对于|v(q)|的计算被归到queryNorm上(queryNorm = 1 / |v(q)|) ,对于|v(d)|的计算被归到norm(t, d)中(norm(t,d) = 1 / |v(d)|)。

queryNorm中有个query bootst值,偶觉得对于纯tf idf计算(不管query多长总是可以展开成一级)没什么意义,而且对最后总分没影响,只是可以对不同query的结果进行比较。

queryNorm中还有一个t.getBoost(),这个其实很重要,可以是一个主要调参的地方,因为term boost可以包含field boost的信息,所以可以在search时进行设置,有了term boost,v(q)变为:

v(q) = (idf(t) * t.getBoost(),...)

|v(d)|的计算归结到norm(t,d)中,其中引入field.getBoost另整个公式不严谨,因为点积中没有乘以这个数字,模也不是正常计算的了,再加上t.getBoost()就可以包含field boost信息,还有每个field保存的norm值只用一个字节表示,精度很差,我觉得这个norm值不实用,倒不如直接用lengthNorm(我倒是很好奇没有norm值,lucene怎么处理的)。


参考文献:

http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值