NLP系列文章(四)——文本的相似性度量


文本相似一般是指的,某一文本doc1doc1與另一文本doc2doc2的相似程度。一般可以從兩個方面去考察兩個文本之間的相似程度:形似(字面相似)和神似(語義相似)。當然這兩種相似性也不能夠完全割裂開來,只不過可以認爲字面相似的文本不一定語義相似,語義相似的文本不一定用詞相似。

爲了考察文本的相似性,同樣需要對文本進行相應的表示,表示的方法在上一部分進行說明,本部分不再進行闡述。所以文本的相似性度量,可以認爲是文本表示的下游任務。

字面相似

字面相似是從文本的字詞本身是否相似而考量,希望達到的效果是:兩個文本“長得”越像,其本身含義也相近的效果。其中包含有編輯距離,最長公共子序列、最長公共子串,Jaccard(傑卡德)相似度和SimHash算法等。

編輯距離

編輯距離是一個經典的字符串動態規劃算法,用於計算兩個字符串(A和B),由A變動到B的最小的操作次數,其中每一次的插入、替換和刪除都算作一次操作。可以直觀的理解編輯距離就是字符串A變爲字符串B最少的編輯次數。
當然將字符串A與B視爲文本doc1和doc2,就能夠刻畫兩個文本之間的相似程度。

最長公共子序列和最長公共子串

這兩個算法類似,但是有一個區別之處在於:子串與子序列的定義不同。
用例子說明如下:
abcdefg是原本的字符串,abc是子串也是子序列,aeg是子序列但不是子串。
從例子中我們可知,子串必是子序列,子序列不一定是子串。唯一的區分點就在於:是否連續。

如何求解最長公共子串和最長公共子序列同樣也是較爲經典的字符串動態規劃算法。通過求解的結果,就可以依據最長公共子串(子序列)的長度越長,就表明兩個文本更相似。

Jaccard(傑卡德)相似度

Jaccard相似度的計算用到了集合論中的交集並集的相關概念,可以認爲Jaccard相似度可以計算兩個集合的相似程度,當然在文本中也適用,用一個例子來說明:

		今天天氣很好==>今天/天氣/很好
		今天天氣不好==>今天/天氣/不好

所有詞彙的集合:
word_set = {今天,天氣,很好,不好}
兩個句子中相同的詞彙集合:
same_set = {今天,天氣}
Jaccard_similarity=len(same_set)len(word_set)=24=0.5Jaccard\_similarity=\frac{len(same\_set)}{len(word\_set)}=\frac{2}{4}=0.5

把這個問題抽象出來可以給出Jaccard相似度的定義:

	給定兩個集合A,B,Jaccard係數(相似度)定義爲A與B交集大小與並集大小的比值,公式如下:

J(A,B)=ABAB=ABA+BABJ(A,B)=\frac{|A\cap B|}{|A\cup B|}=\frac{|A\cap B|}{|A| + |B| - |A\cap B|}
Jaccard值越大說明相似度越高。

SimHash

SimHash採用局部哈希的思想來實現,最初由谷歌提出來用於網頁去重。之後發展爲利用這個算法去,評價文本是否存在抄襲,以及文本的相似性度量。

SimHash算法可以劃分爲五個步驟:分詞、對詞Hash、對詞加權、合併和降維。
整個過程如下如所示:
在這裏插入圖片描述
分詞:顧名思義就是將文本分爲詞的序列。
Hash:是對詞做hash,將每個詞Hash利用32位甚至是64的二進制數值來代替,長度可以自由選擇。
加權:是針對每個詞彙有一個權重,對hash碼中爲1的數值則置爲對應的權重,爲0的數值則置爲權重的負值。
合併:就是將文本中的所有的詞彙進行對位相加。
降維:將文本合併後的結果,大於0的置爲1,小於0的置爲0。

最終會得到兩個表示文本的向量,計算這兩個向量的海明距離就可以得到兩個文本的相似性度量值。

海明距離越大表示越不相似,海明距離越小表示越相似。

語義相似

語義相似度與字面相似度不同,在設計的最初就是考慮如何利用具有語義的文本表示方法進行語義相似度的計算。所以在文本表示的時候,選擇含有詞向量的表示方法,可以包括文本的語義信息。

歐式距離和餘弦相似度

歐氏距離可以理解爲在歐式空間中兩個點之間連線的距離,而餘弦相似度代表兩個向量趨勢的一致性程度。
兩個向量作爲例子進行具體的闡述:

	vec1=[x1,x2,x3...xn]
	vec2=[y1,y2,y3...yn]

具體的計算公式如下:
Euclidean_Distance(vec1,vec2)=i=1n(xiyi)2Euclidean\_Distance(vec1,vec2)=\sqrt{\sum_{i=1}^n(x_i-y_i)^2}

cosine_similarity(vec1,vec2)=vec1vec2vec1×vec2=i=1n(xi×yi)i=1nxi×i=1nyicosine\_similarity(vec1,vec2)=\frac{vec1\cdot vec2}{|vec1|\times |vec2|}=\frac{\sum_{i=1}^n(x_i\times y_i)}{\sum_{i=1}^nx_i \times \sum_{i=1}^ny_i}

利用兩個文本向量計算上述的兩個值,就可以利用結果反映相似性程度。
歐氏距離越小則說明兩個文本的差異越小,餘弦相似度越接近1則說明兩個文本的差異越小;反之則相反。

詞移距離(WMD)

詞移距離(Word Mover‘s Distance,WMD)可以從名稱上瞭解到就是詞彙移動的距離,與各種距離一樣,當距離越大時,表示兩個文本的相似度越小。

計算兩篇文檔的詞移距離,需要將兩篇文檔的所有詞向量準備出來。
其中利用doc1doc1doc2doc2代表兩篇文檔,word1iword_{1i}word2jword_{2j}分別代表文檔1和文檔2中的詞彙。

計算的方法如下:
WMD(doc1,doc2)=i,j=0n,mTij×euclidean_distance(word1i,word2j)WMD(doc1,doc2)=\sum_{i,j=0}^{n,m}T_{ij}\times euclidean\_distance(word_{1i},word_{2j})

其中TijT_{ij}代表word1iword_{1i}word2jword_{2j}計算的距離權重,其中euclidean_distance(word1i,word2j)euclidean\_distance(word_{1i},word_{2j})代表計算兩個詞彙的歐式距離,採用歐氏距離是由於其本身就可以代表空間中的移動距離。

DSSM

DSSM(Deep Structured Semmantic Models)是文本相似度計算的一種監督學習方法,利用已有的標註數據可以訓練語義相似度模型。這個模型可以預測兩個句子的語義相似度,同時也可生成副產物句子的低維語義向量的表達。

DSSM的模型結構示意圖如下,從下往上分別是,輸入層、表示層,匹配層和輸出層。整個過程是由兩個文本輸入到模型中,經過一系列的處理最終產生這兩個文本的相似性的分數。

在這裏插入圖片描述
輸入層可以將文本的字詞做Hash處理(可以理解爲製作文本的詞向量),然後相加生成文本的向量。經過表示層的特徵提取和轉換表達形成文本最終的語義向量。匹配層通過求解兩個文本向量的餘弦相似度,並利用餘弦相似度得分構造損失函數。通過優化模型參數在輸出層的到最後的匹配結果。

由於DSSM是有監督的方法,所以在有標註語料和領域相關化的任務中表現比起無監督的方法較好。但是由於DNN作爲DSSM的基礎網絡並且對於文本的表示採用的是詞袋模型的思想,所以對於文本的表達損失了詞序信息。CNN-DSSM和LSTM-DSSM的出現一定程度上改進與緩解了這個問題。

文本相似在NLP領域作爲一個基礎性任務,解決的方法有很多,除了上述的字面相似度和語義相似度,以及各類的無監督方法和監督方法。現在有一些更大更強的模型比如:ELMo、BERT和GPT等,它們可以更好的表達文本本身的含義,對於相似性的度量直接或間接的起到了正向作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章