1. 程式人生 > >文字相似度bm25演算法的原理以及Python實現(jupyter notebook)

文字相似度bm25演算法的原理以及Python實現(jupyter notebook)

今天我們一起來學習一下自然語言處理中的bm25演算法,bm25演算法是常見的用來計算query和文章相關度的相似度的。其實這個演算法的原理很簡單,就是將需要計算的query分詞成w1,w2,…,wn,然後求出每一個詞和文章的相關度,最後將這些相關度進行累加,最終就可以的得到文字相似度計算結果。
首先我們來看一下bm25演算法的計算公式:

S
c o r e ( Q , d ) = i n W
i
R ( q i , d )

我們來看看這個公式,首先Wi表示第i個詞的權重,這裡我們一般會使用TF-IDF演算法來計算詞語的權重,我在之前的博文對TF-IDF的理解與數學推導中,對TF-IDF演算法有詳細地分析與介紹,大家可以閱讀參考。這個公式第二項R(qi,d)表示我們查詢query中的每一個詞和文章d的相關度,這一項就涉及到複雜的運算,我們慢慢來看。一般來說Wi的計算我們一般用逆項文字頻率IDF的計算公式:

I D F ( q i ) = log N + 0.5 n ( q i ) + 0.5

在這個公式中,N表示文件的總數,n(qi)表示包含這個詞的文章數,為了避免對數裡面分母項等於0,我們給分子分母同時加上0.5,這個0.5被稱作調教係數,所以當n(qi)越小的時候IDF值就越大,表示詞的權重就越大。我們來舉個栗子:“bm25”這個詞只在很少一部分的文章中出現,n(qi)就會很小,那麼“bm25”的IDF值就很大;“我們”,“是”,“的”這樣的詞,基本上在每一篇文章中都會出現,那麼n(qi)就很接近N,所以IDF值就很接近於0,接著我們來看公式中的第二項R(qi,d),我們首先來看看第二項的計算公式:

R ( q i , d ) = f i ( k 1 + 1 ) f i + K q f i ( k 2 + 1 ) q f i + k 2
在這個公式中,一般來說,k1、k2和b都是調節因子,k1=1、k2=1、b = 0.75,qfi表示qi在查詢query中出現的頻率,fi表示qi在文件d中出現的頻率,因為在一般的情況下,qi在查詢query中只會出現一次,因此把qfi=1和k2=1代入上述公式中,後面一項就等於1,最終可以得到:
R ( q i , d ) = f i ( k 1 + 1 ) f i + K

我們再來看看K,在這裡其實K的值也是一個公式的縮寫,我們把K展開來看:

K  =  k 1 ( 1 b + b d l a v g ( d l ) )

在K的展開式中dl表示文件的長度,avg(dl)表示文件的平均長度,b是前面提到的調節因子,從公式中可以看出在文章長度比平均文章長度固定的情況下,調節因子b越大,文章長度佔有的影響權重就越大,反之則越小。在調節因子b固定的時候,當文章的長度比文章的平均長度越大,則K越大,R(qi,d)就越小。我們把K的展開式帶入到bm25計算公式中去:

S c o r e ( Q , d ) = i n W i R ( q i , d ) = i n W i f i ( k 1 + 1 ) f i