常见文本相似度计算方法简介
0引言
在自然語言處理任務中,我們經常需要判斷兩篇文檔是否相似、計算兩篇文檔的相似程度。比如,基于聚類算法發現微博熱點話題時,我們需要度量各篇文本的內容相似度,然后讓內容足夠相似的微博聚成一個簇;在問答系統中,我們會準備一些經典問題和對應的答案,當用戶的問題和經典問題很相似時,系統直接返回準備好的答案;在監控新聞稿件在互聯網中的傳播情況時,我們可以把所有和原創稿件相似的文章,都看作轉發,進而刻畫原創稿件的傳播范圍;在對語料進行預處理時,我們需要基于文本的相似度,把重復的文本給挑出來并刪掉……總之,文本相似度是一種非常有用的工具,可以幫助我們解決很多問題。
這里對計算文本相似度涉及的模型和算法,進行簡要的整理。
1文本相似度計算任務的簡單分析
文本的相似性計算,是我們常說的“文本匹配任務”的一種特殊情況。
1.1任務目標
一般來說,文本相似度計算任務的輸入,是兩篇文檔,比如表1-1的前兩個句子;輸出是兩篇文檔的相似程度,通常用[0,1]區間內的小數來表示。作為一個懂人話的人類,我知道句子1和句子2的內容是一樣的,并認為計算二者的相似性非常簡單。
假如說,我們要判斷1萬對文檔的相似性,或者在1秒內判斷100對文檔的相似度呢?那我就不行了,需要上機器。
大家在生活里和可能已經用到了文本相似度計算支持的東西。很多產品(APP,網站,導游機器人等等)配備了問答系統,允許用戶用自然語言向系統發出各種請求。系統會理解用戶的語言,然后返回一定形式的內容并展示在終端展里,作為對用戶的回答。有些問題比較經典,大家經常問到。工程師或者領域專家會把這些問題和對應的答案收集并存儲起來——當用戶再次問到類似的問題時,直接返回現成的答案即可。“類似”與否的判斷,需要使用文本相似度計算來支持。
那么,如何讓機器替我們完成文本相似度的計算呢?
表1-1 我對機器人說的話
| 序號 | 問句 | 問題答案pairs | |
| 問句 | 答案 | ||
| 1 | 我想去廁所 | 廁所位置是哪里? | 左手邊直走30米。請看我的地圖… |
| 2 | 撒尿哪里走? | ||
| 3 | 請問衛生間在哪里? | ||
| 4 | 請問廁所在哪里? | ||
| 5 | 餓死了,有啥建議啊? | 附近的餐廳在哪里? | 左手邊直走31米。請看地圖… |
?
1.2候選方案
文本相似度計算方法有2個關鍵組件,即文本表示模型和相似度度量方法,如表1-2。前者負責將文本表示為計算機可以計算的數值向量,也就是提供特征;后者負責基于前面得到的數值向量計算文本之間的相似度。
從文本表示模型和相似度度量方法中選擇合適的,就可以組合出一個文本相似度計算方案。
表1-2 常見的文本表示模型和相似度度量方法
| 文本表示模型 | 相似度度量方法 | |
| 文本切分粒度 | 特征構建方法 | |
| 原始字符串 ngram 詞語 句法分析結果 主題模型 ?
| TF TF-IDF 句向量 詞向量 Simhash
| 最小編輯距離 歐氏距離 余弦距離 杰卡德相似度 |
| 海明距離 | ||
| 分類器 | ||
?
使用這個菜單里的選項,我們可以組合出非常多的文本相似度計算方案。那么,每一種方案都可以用來解決什么樣的任務呢?要回答這個問題,需要了解一下每一個組件的原理和特點。
?
?
2有監督和無監督的文本相似性計算
文本相似度計算方法分為有監督和無監督兩類。
有監督方法,就是用樸素貝葉斯分類器之類的有監督模型來判斷文本相似性或者計算相似度。這類方法要求有一定數量的標注語料,構建的代價比較高;由于訓練語料通常無法做得很大,模型的泛化性不夠,實際用起來會有點麻煩;距離計算環節的復雜度會比較高。
無監督方法,就是用歐氏距離等方法,直接計算文本之間的距離或者相似度。這類方法的特點是:不需要標注語料,特征工程或者參數估計可以使用很大的數據;很多方法對語言的依賴比較小,可以應對多語種混雜的場景;距離計算環節復雜度較低。
通常來說我們首先考慮無監督模式。
3文本切分粒度
3.1n-gram
我們常說的“n-gram語言模型“,指的是一類使用相同文本切分方式的語言模型。這種切分方式非常簡單:使用一個長度為n的窗口,從左到右、逐字符滑過文本;每一步,會框到一個字符串,就是一個gram;文本里所有的gram就是該文本的切分結果。如表3-1所示,是幾種常見的n-gram切分結果。
表3-1 “我愛北京天安門”的n-gram表示
| 序號 | N取值 | 名稱 | 切分示例 |
| 1 | 1 | unigram | 我/愛/北/京/天/安/門 |
| 2 | 2 | bigram | 我愛/愛北/北京/京天/天安/安門 |
| 3 | 3 | trigram | 我愛北/愛北京/北京天/京天安/天安門 |
| … | … | … | … |
?
n-gram越長,詞表越大。一份中文語料的Trigram詞表可以達到上百萬的規模。要是來個quadgram,由于內存消耗較大、特征很稀疏,我們的工作會很難開展。
3.2分詞
另外一種文本切分方式就是分詞,比如將“我愛北京天安門”切分為“我/愛/北京/天安門”。分詞的目的是將文本切分為有句法意義的一個個小單元,便于人和機器理解文本的內容。
在NLP進入深度學習時代之前,分詞是中文信息處理的基礎任務。語言這種序列數據,具有很強的時間/空間相關性。在一段文本序列的某些位置,會出現相關性特別高的若干連續字符,比如“我愛北京天安門”里的“天安門”,這3個字符內部之間的相關性明顯高于它們同其他字符的相關性。
相比n-gram,分詞的優勢是,在字符相關性較小的位置進行切分、造成的信息損失比較小。由于分詞降低了文本的相關性,可以提升一些帶有獨立性假設的模型。
當然,ngram由于極高的計算速度,仍然占有一定的市場。
3.3句法分析
我們可以基于句法分析的結果,從文本中抽取短語,作為文本的表示。這樣得到的特征非常稀疏,適合精度要求較高的場景。
3.3.1粗暴版句法分析
我們可以用一些規則或者模型,從文本中提取特定的詞語組合,作為文本的切分結果。比如用“第一個名詞+第一個動詞+第二個名詞”這個規則處理“我愛北京天安門”的結果是“我+愛+北京”。
3.3.2正經句法分析
可以使用正經的句法分析工具,提取“主+謂+賓”之類的,作為文本的切分結果。句法分析的耗時比較高,適合數據量小的場景。
3.4主題模型
可以使用主題模型來提取文本的主題,用主題詞來表示文本。常見的主題模型有PLSA、LDA以及它們的變種(LSA適用于教學場景;還有很多優秀的主題模型,所知甚少,不多介紹)。主題模型在訓練的過程中,學習到了語料的全局信息,因此具有一定的“聯想”或者說“推理”能力,可以基于文檔內容推測出文檔字面沒有明說的一些信息。因此,主題模型可以處理一些需要關注隱藏信息的場景。
當然了,主題模型的訓練比較慢、對語料規模和質量有較高的要求,因此考慮是否使用的時候需要慎重。
4特征構建方法
文本相似度計算任務的第二步,是用數值向量表示文本的內容。通常,我們會用一個數值向量描述文本在語義空間中的位置。
4.1TF與TF-IDF
4.1term frqeuncy向量
詞袋模型(bag of words)假設,文本里的term(雖然名字里是”words”,實際上我們也可以用n-gram之類的切分方式)之間相互獨立,也就是詞語A的出現和詞語B的出現沒有關系。
我們可以用獨熱編碼表示所有的term,然后對文本中的term去重,最后把得到的term的編碼加起來,就得到了TF向量。
TF向量對常用詞比較友好。假設有一份紅學文集構成的語料,里面“紅樓夢”“賈寶玉”這樣的詞語幾乎會出現在每一篇文檔里,相應的頻率還很高。結果就是這樣的詞語“統治”了TF向量,導致兩篇文檔比較相似。換句話說,TF對文檔的區分能力比較低。
4.2詞向量和句向量
4.3simhash
4.3.1simhash簡介
Simhash是敏感哈希算法在文本特征提取任務中的應用。它會把一篇文檔映射為一個長度為64、元素值為0或1的一維向量。這樣我們就可以使用某種距離計算方式,計算兩篇文本的距離和相似度了。一般來說,與simhash配合的是海明距離。
4.3.2simhash的適用場景
Simhash的特點是,對文本的“相同”與否特別敏感:當兩篇文檔相同時,相似度為1;當其中一篇略有不同,相似度會有明顯降低。因此非常適合用來判斷兩篇文檔內容是否相同。
另外simhash的計算比較簡單,速度上有一定優勢。如果配合一定的檢索策略來召回候選相似文檔,simhash可以用來對海量文檔進行去重——這就是simhash最常見的一個應用場景。
5距離的度量方式
假設表1-1的3句和4句分詞結果分別為:
5.1歐氏距離
5.1.1歐氏距離的計算方法
假設我們有兩個數值向量,表示兩個實例在歐式空間中的位置:
?
二者的歐氏距離是這樣計算的:
?
如圖5-1,二維空間(平面)里有兩個點?和? ?。二者在X軸上的差異大小是 ,在Y軸上的差異是 ?。綜合兩個坐標軸上的差異,就得到了兩點之間的距離: ??。
歐式距離是最符合我們直覺的一種距離度量方式。它認為事物的所有特征都是平等的。兩個實例在所有維度上的差異的總和,就是二者的距離。
?
圖5-1 二維空間中的兩個點的距離?
5.1.2基于歐式距離的文本相似度計算
假設我們的詞匯表是(部分詞語在特征選擇中刪掉了):
那么兩個句子對應的TF向量分別是:
二者的歐氏距離為:
這樣,我們就可以計算相似度了,常用的方式是:
?
分母中的”1”用來保證相似度最高是1。當然,相似度可以根據場景要求花式定義。
5.2余弦距離
5.2.1余弦距離的計算方式
余弦距離來源于向量之間夾角的余弦值。假設空間中有兩個向量:
那么二者的夾角的余弦值等于:
這個計算方式是可以推導出來的——由于形式簡單,我們可以把它當做勾股定理這樣的知名定理來對待。如圖5-2,是二維平面上,兩個向量之間夾角的示意圖,我們可以基于勾股定理湊出上面的式子。
圖5-2 二維空間中兩個向量的夾角5.2.2基于余弦距離的文本相似度
向量的夾角余弦值可以體現兩個向量在方向上的差異,因此我們可以用它來度量某些事物的差異或者說距離。
在文本相似度計算任務中,為了讓數據適合余弦夾角的概念,人們假想:語義空間中存在一個“原點”;以原點為起點、文本特征數組(這里為了避免與“語義向量”混淆,借用了“數組”這個名稱)表示的點為終點 ,構成了一個向量,這就是代表了文本語義的“語義向量”。語義向量的方向,描述了文本的語義。因此,我們可以用兩篇文檔的語義向量的夾角余弦值來表示它們的差異。這個余弦值通常被稱為“余弦距離”。
提取文本特征后,可以將數值向量套入前面的余弦值計算公式,既可以得到兩篇文本的余弦距離:
余弦值的取值范圍是[0,1],我們可以用一個簡單的方式得到余弦相似度:
?
當文本特征維度比較高的時候,在余弦距離的視角下,文本之間的區分度越來越小。
這導致我們在設定“是否相同”的閾值時,遇到困難。因此余弦距離比較適用于文本較短,也就是特征維度較低的場景。
5.3Jacard相似度
?
5.3.1杰卡德相似度的計算方式
杰卡德相似度一般被用來度量兩個集合之間的差異大小。假設我們有兩個集合A和B,那么二者的杰卡德相似度為:
杰卡德距離的思想非常簡單:兩個集合共有的元素越多,二者越相似;為了控制距離的取值范圍,我們可以增加一個分母,也就是兩個集合擁有的所有元素。
5.3.2基于杰卡德相似度的文本相似度計算
我們可以把文檔看做是詞語的集合,然后用杰卡德距離相似度度量文檔之間的差異。
words3={"請", "問","衛生間","在","哪里", "?"}
words4={"請", "問","廁所","在","哪里", "?"}
?
表1-1的3句和4句的杰卡德相似度就是:
?
我們可以基于這個距離計算得到杰卡德距離:
?
5.3.3杰卡德相似度的改裝
我的同事蘭博同學認為,杰卡德相似度忽略了文本長度差異。“我讓你三掌!”和“我讓你三掌!我讓你三掌!我讓你三掌!”這兩句話,使用杰卡德相似度得到的相似度是1,即完全相同。事實上,二者的含義還是略有區別的(一般來說,重要的事情才需要說三遍)。如何區分這兩句話呢?
他的解決思路是,在杰卡德相似度的分母增加一個對文本長度差異的懲罰:
式中α是一個超參數,可以根據相似度的效果調試大小。
5.4海明距離
海明距離是simhash算法的御用距離算法。
5.4.1海明距離的計算方式
海明距離的計算方式非常簡單。如5.1.1所述,兩個句子可以用詞袋模型來表示:
我們比較兩篇文檔的特征向量的每一個維度,判斷各個維度上取值是否相等。不相等的維度越多,兩篇文檔差異越大。海明距離的計算方式如下:
其中,
5.4.2基于海明距離的文本相似度
換個角度,兩篇文檔的特征向量里,相等的維度越多,相似度就越大。相似度的計算方法如下:
s?
其中,
5.5最小編輯距離
最小編輯距離是一種經典的距離計算方法,用來度量字符串之間的差異。它認為,將字符串A不斷修改(增刪改)、直至成為字符串B,所需要的修改次數代表了字符串A和B的差異大小。當然了,將A修改為B的方案非常多,選哪一種呢?我們可以用動態規劃找到修改次數最小的方案,然后用對應的次數來表示A和B的距離。
從定義上可以看出,最小編輯距離比較適合判斷字面上的相似性,對文本字語義上的相似性無能為力。
6結語
相似度計算不光在文本數據處理里經常用到,在圖像、音頻、生物信息等等類型數據的處理中也有很高的出場率。對應地,相似度計算可以幫助我們解決生產活動里的很多具體問題。因此,它是一種非常有用的方法,值得我們仔細琢磨。
判斷事物之間的相似性,是我們需要和喜歡的一種活動。我們在生活中,無時不刻在進行著一種活動:判斷接觸到的事物是否從未見過;如果沒見過,就會思考哪些已知的東西和它類似;如果它太獨特、可借鑒的經驗很少,就認為它是一種新的事物;如果有很多類似的已知事物,我們會基于經驗對它分析一波,并在這個基礎上快速地加以了解。
最近查找資料的時候,發現一些朋友未經我的允許,也未注明轉載來源,直接使用了我的文章——更可氣的是,還是以“原創”的名義。這種侵犯知識產權的事情,以前、現在和以后會一直發生。比如我當年沒少下載各種免費的音樂資源。今后幾年我國會大力建設知識產權保護環境,大家的知識產權意識也會提升,這種情況應該會越來越少。
?
總結
以上是生活随笔為你收集整理的常见文本相似度计算方法简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动驾驶安全驾驶规则_自动驾驶知识科普
- 下一篇: 生物信息学概论_大学专业详解系列83——