使用 TF-IDF 加權的空間向量模型實現句子相似度計算

字元匹配層次計算句子相似度

計算兩個句子相似度的演算法有很多種,但是對於從未了解過這方面演算法的人來說,可能最容易想到的就是使用字串匹配相關的演算法,來檢查兩個句子所對應的字串的字元相似程度。比如單純的進行子串匹配,搜尋 A 串中能與 B 串匹配的最大子串作為得分,亦或者用比較常見的最長公共子序列演算法來衡量兩個串的相似程度,使用編輯距離演算法來衡量等。

上述基於字元匹配層次的演算法一定程度上都可以計算出兩個句子的相似度,不過他們只是單純的從字元角度來計算,但是我們的句子都是有一定含義的,且句子中的每個詞不應當被視為無關字元組合,而是不可分割的一個實體。所以這就需要對句子進行 分詞 操作。在分詞後,基於字元匹配的演算法就應當以片語為單位進行匹配而不是單個字元。

向量空間模型

空間向量模型首先要對待處理的兩個句子進行分詞,這將會得到兩個由 詞 組成的序列。比如兩個句子:

A:你怎麼樣? B:你還好嗎?

分詞後的結果就為:

A:["你","怎麼樣"]

B:["你","還好嗎"]

然後將兩個列表取並集得到列表 C:["你","怎麼樣","還好嗎"];如果將 C 中的每一項(即一個詞) 出現 標記為 1 ,不出現 標記為 0,那麼這樣離散化處理後,每一項所有的取值組合就構成了一個三維向量空間(實際上是空間中的八個點,因為是離散值)。像這樣:

[1,1,1],[1,0,1],[0,0,1] ...;

此時再考慮 A 句子與 B 句子對應的兩個片語列表,同樣可以這樣處理,得到兩個三維向量(注意A、B要升到三維):

C:["你", "怎麼樣", "還好嗎"]

A:["你", "怎麼樣" ]

A:[1, 1, 0 ]

C:["你", "怎麼樣", "還好嗎"]

B:["你", "還好嗎" ]

B:[1, 0, 1 ]

此時如果我們要計算這兩個句子的相似度的話,事情就變得很簡單了,只需要計算 A、B 兩個向量的夾角即可。因為我們知道,當兩個向量完全相同時,代表兩個句子完全相同,此時兩個向量的夾角為 0°,兩個向量完全不同(無關)時,其夾角為 90°。一般計算兩個向量的餘弦值要比計算角度更容易(餘弦值越大角度越小),所以計算兩個句子相似度的問題就轉化為計算兩個 n 維向量的餘弦值問題,問題被簡化很多。而且引入空間向量模型的另一個好處就是,將原問題轉化為數學模型,這樣就可以帶入數學的體系,利用很多強大的數學工具。

比如,引入詞的統計資訊,為每個分量加權。

使用 TF-IDF 演算法為分量加權

TF-IDF 演算法原理

TF-IDF 演算法主要由兩個概念組成,分別是 TF、IDF,我想可以用兩句話來分別簡單概括:

TF(詞頻):重要的事情說三遍。

IDF(逆文件頻率):腳踩幾條船應該是渣男。

以上兩條均對一個句子中的某個詞而言。

TF (Term Frequency),描述的是一個詞在一個文件中出現的頻率。如句子:”我喜歡吃蘋果,你喜歡吃什麼?“該句話中“喜歡”一詞的頻率即為 2/句子總詞數;所以可知:\[TF = \frac{詞 wi 在文件 D 中出現的次數}{文件 D 的總詞數}\] (注:在句子相似度計算中,不區分句子與文件,認為一個句子即為一篇文件)

TF 可以用來確定一個詞從統計角度來說對一句話的重要性,比如:“記得吃早飯,早飯,早飯!” 顯然這句話重複了三次“早飯”,即該詞的詞頻較大,所以可以認為這句話中“早飯”是十分重要的詞。

而 IDF(Inverse Document Frequency) 描述的是一個詞在所有句子中出現的次數。如果一個詞在很多句子都出現過,那麼可以認為,這個詞通用性較強,所以不具備一定的區分能力,像“東西”,“相信”,“可以” 等等。IDF 的計算公式為:\[IDF = log(\frac{語料庫中的所有文件數}{包含詞 wi 的文件數+1})\] ,其中分式用來衡量“腳踏幾條船”的程度,而 log 函式,據說該演算法作者也未明確給出理論論述,應該屬於資訊理論範疇(對資訊理論知之甚少,希望以後有機會了解並解釋)。最後的 TF-IDF 的公式為 \[TF*IDF\] ,將此值作為一個句子片語向量的某個分量的權值。

接下來講講通過加權後,原來的空間向量模型發生了什麼變化。

加權後的空間向量模型

首先做一個直觀對比:

加權前:[1, 0, 1, 1, 0, 1]

加權後:[0.21, 3.12, 1, 0, 1.2, 1]

加權後的每個分量的取值發生了變化。未加權前每個分量的取值為 {0,1} 表示一個詞的有無,而加權後取值為 {0,weight} ,表示一個詞或者無,或者存在且有自己對於所屬句子的重要性(注意:仍是離散的兩個量)。為了便於演示和理解,現在使用二維的向量做加權前與加權後在計算句子相似度(即計算向量餘弦值)上的比較。

未加權的二維向量取值可表示為如下圖:

由於兩個分量只能分別取 0,1,所以句子的片語向量 [1,1] 與 [1,0] 所成夾角為 45°。相似度為 \(\frac{\sqrt{2}}{2}\) 。

給其中一個分量加權後的向量取值可表示為下圖:

現在我們通過加權演算法給一個句子片語向量中的某個分量以 weight 且 weight > 1,此時我們要做兩個對比,分別是向量 [0,weight] 與 [1,weight] 、向量 [1,weight] 與 [1,0] 。 通過對比我們將看到 weight 權重所代表的詞對於計算兩個句子相似度的影響。

先考慮向量 [0,weight] 與 [1,weight]。

這兩個向量由於有一個相同的詞,weight 權重對應的詞,從上圖中可以看出(亦可證明出)二者成的一個夾角 b 要小於 45°,即這兩個片語向量所代表的句子相似度要大於未加權時的相似度。

再考慮向量 [1,weight] 與 [1,0]。

這兩個向量沒有相同的 weight 權重對應的詞,而從上圖中可以看出(亦可證出) a 的角度要大於 45°,即這兩個片語向量算所代表的句子的相似度要小於未加權時的相似度。

所以結論就是,當我們給一個句子中的某個詞一個權值,這個權值表示該詞從語料庫中區分出其所在句子的能力,這樣加權後,當待考察的兩個句子如果同時包含了一個詞 wi,無論這個 wi 對於其中那個句子有較高的權值,此時都會基於單純的空間向量模型之上增大兩個句子的相似度。相反,如果二者不同時包含詞 wi ,就會基於空間向量模型減少二者相似度。可以說,通過 TF-IDF 為句子片語向量加權後,空間向量模型融入了統計資訊,增加了計算兩個句子相似度的準確性。

TF-IDF 演算法特點

TF-IDF 演算法計算句子相似度具有執行速度快的優點,對於長句子、長文字效果較好,因為句子越長統計資訊越多。對於短文字可能效果稍差一些,但即便這樣仍不會退化為普通的向量空間模型,因為即便 TF 退化,仍有 IDF 統計整個語料庫的資料,仍然可以影響權重。

結語

本文內容基於個人理解,所學有限,若有任何錯誤、問題,歡迎指出、討論。

下一篇文章將討論該演算法的實現。




作者:Skipper
出處:https://www.cnblogs.com/backwords/p/12321390.html
本部落格中未標明轉載的文章歸作者 Skipper 和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利