Lucene TFIDFSimilarity评分公式详解

一、预热

TFIDFSimilarity曾经是Lucene/Solr默认评分公式,但是从lucene-6.0开始已经改成BM25Similary了(详见Lucene-6789)。但我们今天看的依然是TFIDFSimilarity,因为它相对简单一些,对我们理解评分过程有好处。

首先假定你知道怎么把一篇文档转化成一个空间向量,并且知道空间向量模型。

接下来先来统一一下术语和记号
q : query,表示一个查询
d : document,表示一篇文档

V(q) : q ⃗ \vec{q} q 表示Query的向量
V(d) : d ⃗ \vec{d} d 表示Document的向量
|V(q)| : ∣ q ⃗ ∣ |\vec{q}| q 表示Query向量的归一化
|V(d)| : ∣ d ⃗ ∣ |\vec{d}| d 表示Document向量的归一化

在看TFIDFSimilarity之前,我们先看简单复习几个简单的公式。

  1. 余弦定理
    c o s i n e _ s i m i l a r i t y ( q , d ) = V ( q ) ⋅ V ( q ) ∣ V ( q ) ∣ × ∣ V ( d ) ∣ cosine\_similarity(q,d) = \frac{V(q) · V(q)}{|V(q)| \times |V(d)|} cosine_similarity(q,d)=V(q)×V(d)V(q)V(q),用余弦定理通过计算两向量的夹角来表示两文本的相似,这是一切的基础。

这里沿*Lucene Docs的写法, c o s i n e _ s i m i l a r i t y ( q , d ) cosine\_similarity(q,d) cosine_similarity(q,d)而不是用 s c o r e ( q , d ) score(q,d) score(q,d)的原因是相似度不是每个最终得分,相似度只是评分过程比较重要的一个因素而已。*建议你还是先看看TFIDFSimilarty的官方文档,它讲得相当完整也很细**。

  1. tf-idf公式
    tf-idf算法是一种非常常见算法,用来计算文本每个权重的。
    tf-idf算法的原理如果词条在文档出频率越高,则词条权重越高;如词条在越多篇文档出现,而词条的权重越低。具体计算如下:
    t f i d f ( t ) = t f ( t ) ∗ i d f ( t ) tfidf(t) = tf(t) * idf(t) tfidf(t)=tf(t)idf(t)
    t f ( t ) = f r e q u e n c y tf(t) = \sqrt{frequency} tf(t)=frequency
    i d f ( t ) = 1 + log ⁡ d o c _ c o u n t + 1 d o c _ f r e q + 1 idf(t) = 1 + \log{\frac{doc\_count+1}{doc\_freq+1}} idf(t)=1+logdoc_freq+1doc_count+1
    t f i d f ( t ) = f r e q u e n c y × ( 1 + log ⁡ d o c _ c o u n t + 1 d o c _ f r e q + 1 ) tfidf(t) = \sqrt{frequency} \times (1 + \log{\frac{doc\_count+1}{doc\_freq+1}}) tfidf(t)=frequency ×(1+logdoc_freq+1doc_count+1)

对于VSM而言,tf-idf算法并不是必须,甚至权重的引入也不是必须。也就是只需要把每个词转化为一个数值即可,可以用词条的HashCode、词包的下标等等。
当然VSM模型也不是计算相似度得分的唯一算法,Lucene6.0开始默认使用BM25模型(BM25Similarity)。
故名思义,TFIDFSimilarity即是用TFIDF作为VSM向量的权重来计算相似度的打分器。

二、开始

原想从两个字符串的相似计算开始来推导我们Lucene的评分公式的,但这样的话篇幅太长太啰嗦太复杂。因此选择从Lucene的公式出发来看全公式每个细节的含义,一步步变化和计算最终推导出实践公式。

2.1 理论公式

我们先看一下,Lucene TFIDFSimilarity给出的理论评分公式:
s c o r e ( q , d ) = c o o r d _ f a c t o r ( q , d ) × q u e r y _ b o o s t ( q ) × V ( q ) ⋅ V ( d ) ∣ V ( q ) ∣ × d o c _ l e n _ n o r m ( d ) × d o c _ b o o s t ( d ) score(q,d) = coord\_factor(q,d) \times query\_boost(q) \times \frac{V(q)·V(d)}{|V(q)|} \times doc\_len\_norm(d) \times doc\_boost(d) score(q,d)=coord_factor(q,d)×query_boost(q)×V(q)V(q)V(d)×doc_len_norm(d)×doc_boost(d)

为什么说它是理论公式呢,因为它由VSM直接推导出来的公式。然则它在实际运用上并不是很方便和高效,因此我们对它进行一系列的变转使得它的计算得到一个简化的式子。

2.1.1 细说相似度部分

前面提到过Lucene相似度是通过VSM来计算(当然*TFIDFSimilarty的官方文档*也是提及的),相似度similarity通过如下公式计算的: c o s i n e _ s i m i l a r i t y ( q , d ) = V ( q ) ⋅ V ( q ) ∣ V ( q ) ∣ × ∣ V ( d

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值