背景:
延續(xù)上篇寫了TF/IDF的公式解析,本篇為BM25解析簡(jiǎn)單介紹。
BM25起源于 概率相關(guān)性模型,而不是矢量空間模型,但是該算法與Lucene的實(shí)際評(píng)分功能有很多共同點(diǎn)。
兩者都使用Term詞頻率,逆文檔頻率和字段長(zhǎng)度歸一化,但是每個(gè)因素的定義都略有不同。與其詳細(xì)解釋BM25公式,不如將重點(diǎn)放在BM25提供的實(shí)際優(yōu)勢(shì)上。
BM25是一個(gè)詞袋檢索功能,它基于每個(gè)文檔中出現(xiàn)的查詢?cè)~對(duì)一組文檔進(jìn)行排名,而不管它們?cè)谖臋n中的距離如何。它是一組評(píng)分功能,其組件和參數(shù)略有不同。該函數(shù)最突出的實(shí)例之一如下。
BM25評(píng)分公式

1)score(D,Q)公式
給定查詢Q,得到文檔D的BM25得分,Q其中包含關(guān)鍵字q1…qn。
2)IDF(qi)公式
原BM25的IDF公式:

優(yōu)化后BM25的IDF公式:

其中 N是集合中文檔的總數(shù),并且n(qi) 是包含qi的Doc數(shù)量。
對(duì)IDF有幾種解釋,其公式略有不同。在原始BM25推導(dǎo)中,IDF分量是從二進(jìn)制獨(dú)立模型推導(dǎo)的。
上面IDF公式對(duì)出現(xiàn)在超過(guò)一半的文檔中的Term有缺陷。這些Term的IDF為負(fù),因此對(duì)于任何兩個(gè)幾乎完全相同的文檔,包含該Term的文檔的排名可能會(huì)低于不包含該Term的文檔的排名。這是有問(wèn)題的,因此許多應(yīng)用程序以各種方式調(diào)整IDF公式:
1)每個(gè)被加數(shù)的下限可以為0,以刪減常用項(xiàng)。
2)可以給IDF函數(shù)一個(gè)下限常量,以避免完全忽略Term;
3)可以將IDF函數(shù)替換為形狀相似的函數(shù),該函數(shù)應(yīng)為非負(fù)或嚴(yán)格為正,以避免完全忽略Term。
下面對(duì)比BM25/優(yōu)化版BM25/老版IDF公式做下對(duì)比,
條件: 100個(gè)Doc,命中從1-100,看各公式表現(xiàn)。

3)tfNorm公式
tfNorm=(freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength))
tfNorm反映的該term在所有滿足條件的doc中field中的重要性,一般來(lái)說(shuō),相同的freq 下,field的長(zhǎng)度越短,那么取值就越高。
D: 文檔
qi: 搜索詞 (多個(gè))
f(qi,D) : qi 這個(gè)詞在文檔 D 中的出現(xiàn)次數(shù)頻率。
|D|: 滿足條件的D單詞數(shù),也就是D的長(zhǎng)度。
avgdl: 整個(gè)文檔庫(kù)中文檔的平均長(zhǎng)度
k1 , b: 自由參數(shù),一般取值范圍是 k1∈[1.2,2.0]默認(rèn)1.2, b=0.75
4)詞頻
在BM25中詞頻的影響降低。詞頻的影響一直在增加,但漸漸地逼近一個(gè)值。不考慮文件長(zhǎng)度情況下,詞頻遵循公式:((k + 1) * tf) / (k + tf)

正如圖中所示,MB25中詞頻的曲線只會(huì)無(wú)限的逼近(k+1),這里的k=1.2,更高的詞頻意味著更大的相關(guān)性,但是很快就會(huì)趨于飽和,收益遞減。而經(jīng)典的Lucene 詞頻相關(guān)性只會(huì)一直增加,沒(méi)有飽和點(diǎn)。
詞頻的調(diào)節(jié)因子 k1。 k1的作用是對(duì)查詢?cè)~在文檔中的詞頻進(jìn)行調(diào)節(jié),如果將 k1設(shè)定為 0,則第二部分計(jì)算因子成了整數(shù) 1,即不考慮詞頻的因素,退化成了二元獨(dú)立模型。 如果將 k1設(shè)定為較大值, 則第二部分計(jì)算因子基本和詞頻 fi保持線性增長(zhǎng),即放大了詞頻的權(quán)值,根據(jù)經(jīng)驗(yàn),一般將 k1設(shè)定為 1.2。
5)文檔長(zhǎng)度
Lucene認(rèn)為較短的字段比較長(zhǎng)的字段具有更大的權(quán)重:字段中術(shù)語(yǔ)的頻率會(huì)被字段的長(zhǎng)度抵消。但是,實(shí)際評(píng)分功能以相同的方式對(duì)待所有字段。它將把所有title字段(因?yàn)樗鼈兒芏蹋┍人衎ody字段(因?yàn)樗鼈兒荛L(zhǎng))更重要。
BM25還認(rèn)為較短的字段比較長(zhǎng)的字段具有更大的權(quán)重,但它通過(guò)考慮字段的平均長(zhǎng)度來(lái)單獨(dú)考慮每個(gè)字段。它可以區(qū)分短title字段和長(zhǎng)標(biāo)題字段。
但從公式上看BM25還是偏向長(zhǎng)字段。
其中參數(shù) b 是調(diào)節(jié)因子,極端情況下,將 b 設(shè)定為 0,則文檔長(zhǎng)度因素將不起作用,設(shè)置為1不起調(diào)節(jié)作用,經(jīng)驗(yàn)表明一般將 b 設(shè)定為 0.75 會(huì)獲得較好的搜索效果。
6) 配置BM25、TF/IDF及b、k參數(shù)
1:創(chuàng)建自定義BM25相似度打分器。
2:配置b長(zhǎng)度影響因子,也k也是這么加。
3:title使用自定義BM25(my_bm25)。
4: body字段使用默認(rèn)BM25
如果喜歡搜索技術(shù)請(qǐng)來(lái)我的公眾號(hào)吧 'Lucene Elasticsearch 工作積累'
每天會(huì)持續(xù)更新搜索相關(guān)技術(shù)
