TFIDF
先復習一下 tfidf,tf是詞頻,即某個詞 i 在 文章 j 中出現(xiàn)的頻率。分母是文章中所有詞的個數(shù),分母是詞 i 出現(xiàn)的次數(shù)。tf越高說明該詞越重要,對于短文本匹配,每個詞一般只出現(xiàn)一次,tf 的大小就取決于分母,即文章的長度。
idf是逆文檔頻率,計算該詞出現(xiàn)在所有文章中的頻率,此時,分母是包含該關鍵字 i 的文章數(shù),分子是所有文章數(shù) N。用log相當于趨勢不變,數(shù)值變小了。該詞出現(xiàn)越多,分子越大,idf值越小,比如:"的" 經常出現(xiàn),因此不是關鍵詞。當詞 i 在 文章 j 中完全不出現(xiàn),分母為0,因此給分母加 1。
tf和idf的乘積就是詞 i 在文章 j 中的重要性。
在搜索中,計算搜索串中的多個關鍵詞 與 文章 j 的相似度:將各詞的 tfidf 相加:
搜索之前,需要知道各個詞在已知文章集中的分布。
BM25
BM25是基于TF-IDF的改進算法,BM 是Best Match最佳匹配的縮寫,25指的是第25次算法迭代。
idf 部分只做了微調:
其中分母部分從所有文章中減去了包含 i 的文章,0.5用于平滑。
接下來,又對 tf 做了如下調整:
這里引入了超參數(shù) k 和 b。
先看分母中的括號,Ld是文章長度,Lavg是所有文章的平均長度,當文章長度與平均長度一致時,括號里值為 1,相當于未乘系數(shù);當文章比平均長度短時,括號里的值小于1,分母越小,上式結果越大,也就是說文章越短,每一個詞越重要,這也與直覺一致。另外,長度的影響與b有關,b越大,影響越大,b的取值在0-1之間,當b為0時,完全不考慮長度的影響,b 一般取值為 0.75。
k 用于標準化詞頻的范圍,將 tf 值壓縮到 0~k+1 之間,其函數(shù)曲線如下:

其橫軸為 tf,縱軸為 tfscore,分別針對 k=0,1,2,3,4 畫圖。當k=0時,tfscore為 1,不考慮詞頻的影響,而 k 越大詞頻越趨近于原始詞頻。因此,如果文章只包含短文本,或者無需關注詞出現(xiàn)幾次,則可將其設成 k=0。
有時還考慮到詞 i 在搜索文本中的頻率,上式擴展成:
其中td指被搜索文本,tq指搜索文本。
這樣我們就可以細化的控制 tf 的占比,以及文章長度的影響,以適應各種不同情況下的搜索和匹配任務。注意設置參數(shù)k和b。
之前的BM25算法集成在gensim里,最新的版本沒有了,如果想使用,可以從舊版本里抽出來。