【NLP】竞赛中的文本相似性!
文本相似度是指衡量兩個文本的相似程度,相似程度的評價有很多角度:單純的字面相似度(例如:我和他 v.s. 我和她),語義的相似度(例如:爸爸 v.s. 父親)和風格的相似度(例如:我喜歡你 v.s. 我好喜歡你耶)等等。
文本表示角度
統計模型
文本切分
在中文和拉丁語系中,文本的直觀表示就存在一定的差異,拉丁語系中詞與詞之間存在天然的分隔符,而中文則沒有。
I can eat glass, it doesn't hurt me.
我能吞下玻璃而不傷身體。
因此針對拉丁語系的文本切分相對中文容易許多。
N 元語法
N-gram (N 元語法) 是一種文本表示方法,指文中連續出現的 個詞語。N-gram 模型是基于 階馬爾科夫鏈的一種概率語言模型,可以通過前 個詞對第 個詞進行預測。以 南京市長江大橋 為例,N-gram 的表示如下:
一元語法(unigram):南/京/市/長/江/大/橋 二元語法(bigram):南京/京市/市長/長江/江大/大橋 三元語法(trigram):南京市/京市長/市長江/長江大/江大橋 import?re from?nltk.util?import?ngramss?=?'南京市長江大橋' tokens?=?re.sub(r'\s',?'',?s)list(ngrams(tokens,?1)) #?[('南',),?('京',),?('市',),?('長',),?('江',),?('大',),?('橋',)]list(ngrams(tokens,?2)) #?[('南',?'京'),?('京',?'市'),?('市',?'長'), #??('長',?'江'),?('江',?'大'),?('大',?'橋')]list(ngrams(tokens,?3,?pad_left=True,?pad_right=True,?left_pad_symbol='<s>',?right_pad_symbol='</s>')) #?[('<s>',?'<s>',?'南'), #??('<s>',?'南',?'京'), #??('南',?'京',?'市'), #??('京',?'市',?'長'), #??('市',?'長',?'江'), #??('長',?'江',?'大'), #??('江',?'大',?'橋'), #??('大',?'橋',?'</s>'), #??('橋',?'</s>',?'</s>')]分詞
分詞就是將連續的字序列按照一定的規范重新組合成詞序列的過程。在英文的行文中,單詞之間是以空格作為自然分界符的,而中文只是字、句和段能通過明顯的分界符來簡單劃界,唯獨詞沒有一個形式上的分界符,雖然英文也同樣存在短語的劃分問題,不過在詞這一層上,中文比之英文要復雜得多、困難得多。
s?=?'南京市長江大橋'#?jieba #?https://github.com/fxsjy/jieba import?jiebalist(jieba.cut(s,?cut_all=False)) #?['南京市',?'長江大橋']list(jieba.cut(s,?cut_all=True)) #?['南京',?'南京市',?'京市',?'市長',?'長江',?'長江大橋',?'大橋']list(jieba.cut_for_search(s)) #?['南京',?'京市',?'南京市',?'長江',?'大橋',?'長江大橋']#?THULAC #?https://github.com/thunlp/THULAC-Python import?thulacthulac_ins?=?thulac.thulac()thulac_ins.cut(s) #?[['南京市',?'ns'],?['長江',?'ns'],?['大橋',?'n']]#?PKUSEG #?https://github.com/lancopku/PKUSeg-python import?pkusegseg?=?pkuseg.pkuseg(postag=True)seg.cut(s) #?[('南京市',?'ns'),?('長江',?'ns'),?('大橋',?'n')]#?HanLP #?https://github.com/hankcs/HanLP import?hanlptokenizer?=?hanlp.load('LARGE_ALBERT_BASE')tokenizer(s) #?['南京市',?'長江',?'大橋']主題模型
除了對文本進行切分將切分后結果全部用于表示文本外,還可以用部分字詞表示一篇文檔。主題模型(Topic Model)在機器學習和自然語言處理等領域是用來在一系列文檔中發現抽象主題的一種統計模型。
直觀來講,如果一篇文章有一個中心思想,那么一些特定詞語會更頻繁的出現。比方說,如果一篇文章是在講狗的,那“狗”和“骨頭”等詞出現的頻率會高些。如果一篇文章是在講貓的,那“貓”和“魚”等詞出現的頻率會高些。而有些詞例如“這個”、“和”大概在兩篇文章中出現的頻率會大致相等。但真實的情況是,一篇文章通常包含多種主題,而且每個主題所占比例各不相同。因此,如果一篇文章 10% 和貓有關,90% 和狗有關,那么和狗相關的關鍵字出現的次數大概會是和貓相關的關鍵字出現次數的 9 倍。
一個主題模型試圖用數學框架來體現文檔的這種特點。主題模型自動分析每個文檔,統計文檔內的詞語,根據統計的信息來斷定當前文檔含有哪些主題,以及每個主題所占的比例各為多少。
TF-IDF
TF-IDF 是 Term Frequency - Inverse Document Frequency 的縮寫,即“詞頻-逆文本頻率”。TF-IDF 可以用于評估一個字詞在語料中的一篇文檔中的重要程度,基本思想是如果某個字詞在一篇文檔中出現的頻率較高,而在其他文檔中出現頻率較低,則認為這個字詞更能夠代表這篇文檔。
形式化地,對于文檔 中的字詞 的 TF-IDF 重要程度可以表示為:
其中, 表示字詞 在文檔 中出現的頻率, 為包含字詞 的文檔數量, 為語料中文檔的總數量。
以 14萬歌詞預料為例,通過 TF-IDF 計算周杰倫的《簡單愛》中最重要的 3 個詞為 ['睡著', '放開', '棒球']。
BM25
BM25 算法的全稱為 Okapi BM25,是一種搜索引擎用于評估查詢和文檔之間相關程度的排序算法,其中 BM 是 Best Match 的縮寫。
對于一個給定的查詢 ,包含的關鍵詞為 ,一個文檔 的 BM25 值定義為:
其中, 表示 在文檔 中的詞頻, 表示文檔 中的詞數, 表示語料中所有文檔的平均長度。 和 為自由參數,通常取值為 。 表示詞 的逆文檔頻率,通常計算方式如下:
其中, 為語料中文檔的總數量, 表示包含 的文檔數量。
BM25 算法是對 TF-IDF 算法的優化,在詞頻的計算上,BM25 限制了文檔 中關鍵詞 的詞頻對評分的影響。為了防止詞頻過大,BM25 將這個值的上限設置為 。
同時,BM25 還引入了平均文檔長度 ,不同的平均文檔長度 對 TF 分值的影響如下圖所示:
TextRank
TextRank 是基于 PageRank 算法的一種關鍵詞提取算法。PageRank 最早是用于 Google 的網頁排名,因此以公司創始人拉里·佩奇(Larry Page)的姓氏來命名。PageRank 的計算公式如下:
其中, 表示任意一個網頁, 表示鏈接到網頁 的網頁, 表示網頁 的 PageRank 值, 表示網頁 所有的入鏈集合, 表示網頁 所有的出鏈集合, 表示集合的大小, 為阻尼系數,是為了確保每個網頁的 PageRank 值都大于 0。
TextRank 由 PageRank 改進而來,計算公式如下:
相比于 PageRank 公式增加了權重項 ,用來表示兩個節點之間的邊的權重。TextRank 提取關鍵詞的算法流程如下:
將文本進行切分得到 。
將 中大小為 的滑動窗口中的詞定義為共現關系,構建關鍵詞圖 。
根據 TextRank 的計算公式對每個節點的值進行計算,直至收斂。
對節點的 TextRank 的值進行倒敘排序,獲取前 個詞作為關鍵詞。
LSA, PLSA, LDA & HDP
潛在語義分析(LSA, Latent Semantic Analysis) 的核心思想是將文本的高維詞空間映射到一個低維的向量空間,我們稱之為隱含語義空間。降維可以通過奇異值分解(SVD)實現,令 表示語料矩陣,元素 表示詞 和文檔 的共現情況(例如:詞頻):
利用奇異值分解:
取最大的 個奇異值,則可以得到原始矩陣的近似矩陣:
在處理一個新的文檔時,可以利用下面的公式將原始的詞空間映射到潛在語義空間:
LSA 的優點:
低維空間可以刻畫同義詞
無監督模型
降維可以減少噪聲,使特征更加魯棒
LSA 的缺點:
未解決多義詞問題
計算復雜度高,增加新文檔時需要重新訓練
沒有明確的物理解釋
高斯分布假設不符合文本特征(詞頻不為負)
維度的確定是 Ad hoc 的
概率潛語義分析(Probabilistic Latent Semantic Analysis, PLSA) 相比于 LSA 增加了概率模型,每個變量以及相應的概率分布和條件概率分布都有明確的物理解釋。
PLSA 認為一篇文檔可以由多個主題混合而成,而每個主題都是詞上的概率分布,文章中的每個詞都是由一個固定的主題生成的,如下圖所示:
針對第 篇文檔 中的每個詞的生成概率為:
因此整篇文檔的生成概率為:
PLSA 可以利用 EM 算法求得局部最優解。
PLSA 優點:
定義了概率模型,有明確的物理解釋
多項式分布假設更加符合文本特征
可以通過模型選擇和復雜度控制來確定主題的維度
解決了同義詞和多義詞的問題
PLSA 缺點:
隨著文本和詞的增加,PLSA 模型參數也隨之線性增加
可以生成語料中的文檔的模型,但不能生成新文檔的模型
EM 算法求解的計算量較大
隱含狄利克雷分布(Latent Dirichlet Allocation, LDA) 在 PLSA 的基礎上增加了參數的先驗分布。在 PLSA 中,對于一個新文檔,是無法獲取 的,因此這個概率模型是不完備的。LDA 對于 和 都增加了多項式分布的共軛分布狄利克雷分布作為先驗,整個 LDA 模型如下圖所示:
LDA 的參數估計可以通過吉布斯采樣實現。
LDA 在使用過程中仍需要指定主題的個數,而層次狄利克雷過程(Hierarchical Dirichlet Processes, HDP) 通過過程的構造可以自動訓練出主題的個數,更多實現細節請參考論文。
LSA,PLSA,LDA 和 HDP 之間的演化關系如下圖所示:
距離度量
相似性度量 (Similarity Measurement) 用于衡量兩個元素之間的相似性程度或兩者之間的距離 (Distance)。距離衡量的是指元素之間的不相似性 (Dissimilarity),通常情況下我們可以利用一個距離函數定義集合 X?上元素間的距離,即:
Jaccard 系數
Jaccard 系數的取值范圍為:,0 表示兩個集合沒有重合,1 表示兩個集合完全重合。
Dice 系數
與 Jaccard 系數相同,Dice 系數的取值范圍為:,兩者之間可以相互轉換 。不同于 Jaccard 系數,Dice 系數的差異函數 并不是一個合適的距離度量,因為其并不滿足距離函數的三角不等式。
Tversky 系數
其中, 表示集合的相對補集。Tversky 系數可以理解為 Jaccard 系數和 Dice 系數的一般化,當 時為 Jaccard 系數,當 時為 Dice 系數。
Levenshtein 距離
Levenshtein 距離是 編輯距離 (Editor Distance) 的一種,指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。允許的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。例如將 kitten 轉成 sitting,轉換過程如下:
編輯距離的求解可以利用動態規劃的思想優化計算的時間復雜度。
Jaro-Winkler 距離
對于給定的兩個字符串 和 ,Jaro 相似度定義為:
其中, 為字符串 的長度, 為匹配的字符的個數, 換位數目的一半。如果字符串 和 相差不超過 ,我們則認為兩個字符串是匹配的。例如,對于字符串 CRATE 和 TRACE,僅 R, A, E 三個字符是匹配的,因此 ,盡管 C, T 均出現在兩個字符串中,但是他們的距離超過了 1 (即,),因此 。
Jaro-Winkler 相似度給予了起始部分相同的字符串更高的分數,其定義為:
其中, 為字符串 和 的 Jaro 相似度, 為共同前綴的長度 (規定不超過 ), 為調整系數 (規定不超過 ),Winkler 將其設置為 。
漢明距離
漢明距離為兩個等長字符串對應位置的不同字符的個數,也就是將一個字符串變換成另外一個字符串所需要替換的字符個數。例如:1011101 與 1001001 之間的漢明距離是 2,“toned” 與 “roses” 之間的漢明距離是 3。
import?textdistance?as?tds1?=?'南京市長江大橋' s2?=?'北京市三元橋'td.jaccard(s1,?s2) #?0.6666666666666666td.sorensen_dice(s1,?s2) #?0.46153846153846156td.tversky(s1,?s2) #?0.3td.levenshtein(s1,?s2) #?4td.jaro(s1,?s2) #?0.6428571428571429td.hamming(s1,?s2) #?5表示學習
基于表示學習的文本相似度計算方法的思路如下:
利用表示學習方法將不定長的文本表示為定長的實值向量。
計算轉換后的實值向量相似度,用于表示兩個文本的相似度。
文本詞法,句法和語義角度
一段文本的內容分析由淺及深可以分為詞法,句法和語義三個層次。
詞法,以詞為對象,研究包括分詞,詞性和命名實體等。
句法,以句子為對象,研究包括句子成分和句子結構等。
語義,研究文字所表達的含義和蘊含的知識等。
詞法和句法可以統一成為語法,如下圖所示:
詞法
詞法層以單個句子作為輸入,其輸出為已標記(詞性,命名實體等)的詞匯序列。
詞匯序列的相似度計算可以采用上文中的距離度量等方式實現。
句法
句法層用于研究句子各個組成部分及其排列順序,將文本分解為句法單位,以理解句法元素的排列方式。句法層接收詞法層分析后的將其轉化為依存圖。
對于依存圖,我們可以利用三元組 表示任意一個依存關系,然后通過統計計算兩個文本的依存圖的三元組集合之間的相似度來評價句法層的相似度。此外,也可以從樹結構的角度直接評價依存句法的相似度,更多細節可參考相關論文 。
語義
語義層用于研究文本所蘊含的意義。例如“父親”和“爸爸”在詞法層完全不同,但在語義層卻具有相同的含義。針對語義相似度的兩種深度學習范式如下:
第一種范式首先通過神經網絡獲取文本的向量表示,再通過向量之間的相似度來衡量文本的語義相似度。這種范式在提取特征時不考慮另一個文本的信息,更適合做大規模的語義相似召回,例如:DSSM ,ARC-I ,CNTN ,LSTM-RNN ?等。
第二種范式首先通過深度模型提取兩個文本的交叉特征,得到匹配信號張量,再聚合為匹配分數。這種范式同時考慮兩個文本的輸入信息,更適合做小規模的語義相似精排,例如:ARC-II ,MatchPyramid ,Match-SRNN ,Duet ?等。
文本長度角度
從文本長度角度出發,我們可以粗略的將文本分類為短文本和長文本。短文本包括“字詞”,“短語”,“句子”等相對比較短的文本形式,長文本包括“段落”,“篇章”等相對比較長的文本形式。
短文本 v.s. 短文本
短文本同短文本的常見比較形式有:關鍵詞(字詞)同文本標題(句子)的匹配,相似查詢(句子)的匹配等。如果單純的希望獲取字符層面的差異,可以通過距離度量進行相似度比較。如果需要從語義的角度獲取相似度,則可以利用表示學習對需要比對的文本進行表示,在通過語義向量之間的相似程度來衡量原始文本之間的相似度,詳情可參見上文。
短文本 v.s. 長文本
短文本同長文本的比較多見于文檔的搜索,即給定相關的查詢(字詞),給出最相關的文檔(段落和篇章)。對于這類問題常見的解決方式是對長文本利用 TF-IDF,BM25等方法或進行主題建模后,再同查詢的關鍵詞進行匹配計算相似度度。
長文本 v.s. 長文本
長文本同長文本的比較多見于文檔的匹配和去重,對于這類問題常見的解決方式是利用關鍵詞提取獲取長文本的特征向量,然后利用特征向量之間的相似度衡量對應文本的相似程度。在針對海量文本的去重,還以應用SimHash等技術對文本生成一個指紋,從而實現快速去重。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 本站知識星球“黃博的機器學習圈子”(92416895) 本站qq群704220115。 加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【NLP】竞赛中的文本相似性!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10系统电脑不会一键还原系统怎么解
- 下一篇: Win11和Win10有什么区别 Win