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