NLP-中文、英文分词
文章目錄
- 前言
- 英文分詞方法
- 1.古典分詞方法
- 2.基于子詞的分詞方法(Subword Tokenization)
- 2.1 BPE
- 2.2 WordPiece
- 2.3 Unigram Language Model
- 中文分詞方法
- 1.基于規則的分詞
- 2.基于統計的分詞
- 3.混合分詞
- 4.基于深度學習的分詞
前言
學習筆記【NLP英文分詞方法和中文分詞方法】
機器無法理解文本。當我們將句子序列送入模型時,模型僅僅能看到一串字節,它無法知道一個詞從哪里開始,到哪里結束,所以也不知道一個詞是怎么組成的,為了幫助機器理解文本就需要:
1將文本分成一個個小片段
2然后將這些片段表示為一個向量作為模型的輸入
3同時,我們需要將一個個小片段(token) 表示為向量,作為詞嵌入矩陣, 通過在語料庫上訓練來優化token的表示,使其蘊含更多有用的信息,用于之后的任務
分詞詳細介紹
英文分詞方法
1.古典分詞方法
基于空格的分詞方法、基于語法規則的分詞方法、基于標點的分詞方法,這些方法容易產生大量冗余詞匯,無法處理OOV詞,詞表中的低頻詞/稀疏詞在模型訓無法得到訓練(因為詞表大小有限,太大的話會影響效率)。
基于字母的分詞方法:將每個字符看作一個詞,優點是不用擔心未知詞匯,可以為每一個單詞生成詞嵌入向量表示,缺點是字母本身就沒有任何的內在含義,得到的詞嵌入向量缺乏含義;計算復雜度提升(字母的數目遠大于token的數目);輸出序列的長度將變大,對于Bert、CNN等限制最大長度的模型將很容易達到最大值。
2.基于子詞的分詞方法(Subword Tokenization)
這種方法的目的是通過一個有限的詞表 來解決所有單詞的分詞問題,同時盡可能將結果中 token 的數目降到最低。有點類似英語中的詞根詞綴拼詞法,其中的這些小片段又可以用來構造其他詞。可見這樣做,既可以降低詞表的大小,同時對相近詞也能更好地處理。
這種方法與傳統分詞方法相比,優點是可以較好的處理OOV問題;可以學習詞根詞綴之間的關系;分詞的粒度合適,不會像基于字母分詞那樣太細,也不會像基于空格分詞那樣太粗。
目前主要有三種Subword Tokenization算法:Byte Pair Encoding (BPE)、WordPiece 和 Unigram Language Model
2.1 BPE
BPE原理
BPE是一種數據壓縮算法。首先將詞分成字符,然后找出出現頻率最高的一對字符,用另一個字符替換掉,直到循環結束或者達到設置的詞匯數量。
實現流程:
1根據語料庫建立一個詞典,詞典中僅包含單個字符,如英文中就是a-z
2統計語料庫中出現次數最多的字符對(詞典中兩項的組合),然后將字符對加入到詞典中
3重復步驟2直到到達規定的步驟數目或者詞典尺寸縮小到了指定的值。
隨著合并的次數增加,詞表大小通常先增加后減小。迭代次數太小,大部分還是字母,沒什么意義;迭代次數多,又重新變回了原來那幾個詞。所以詞表大小要取一個中間值
優點:可以很有效地平衡詞典大小和編碼步驟數(將語料編碼所需要的 token 數量)
缺點:對于同一個句子, 例如Hello world,如圖所示,可能會有不同的Subword序列。不同的Subword序列會產生完全不同的id序列表示,這種歧義可能在解碼階段無法解決。在翻譯任務中,不同的id序列可能翻譯出不同的句子,這顯然是錯誤的;在訓練任務中,如果能對不同的Subword進行訓練的話,將增加模型的健壯性,能夠容忍更多的噪聲,而BPE的貪心算法無法對隨機分布進行學習
2.2 WordPiece
WordPiece
BERT在分詞的時候使用的是WordPiece算法。與BPE算法類似,WordPiece算法也是每次從詞表中選出兩個子詞合并成新的子詞。與BPE的最大區別在于,如何選擇兩個子詞進行合并:BPE選擇頻數最高的相鄰子詞合并,而WordPiece選擇能夠提升語言模型概率最大的相鄰子詞加入詞表。
分詞原理:
假設句子S = (t1,t2,…,tn)由n個子詞組成,ti表示子詞,且假設各個子詞之間是獨立存在的,則句子S的語言模型似然值等價于所有子詞概率的乘積:
假設把相鄰位置的x和y兩個子詞進行合并,合并后產生的子詞記為z,此時句子S似然值的變化可表示為:
從上面的公式很容易發現,似然值的變化就是兩個子詞之間的互信息。簡而言之,WordPiece每次選擇合并的兩個子詞,他們具有最大的互信息值,也就是兩子詞在語言模型上具有較強的關聯性,它們經常在語料中以相鄰方式同時出現。
(來自百度百科:互信息(Mutual Information)是信息論里一種有用的信息度量,它可以看成是一個隨機變量中包含的關于另一個隨機變量的信息量,或者說是一個隨機變量由于已知另一個隨機變量而減少的不肯定性。)
2.3 Unigram Language Model
與WordPiece一樣,Unigram Language Model(ULM)同樣使用語言模型來挑選子詞。不同之處在于,BPE和WordPiece算法的詞表大小都是從小到大變化,屬于增量法。而Unigram Language Model則是減量法,即先初始化一個大詞表,根據評估準則不斷丟棄詞表,直到滿足限定條件。ULM算法考慮了句子的不同分詞可能,因而能夠輸出帶概率的多個子詞分段。
對于句子S,X = (x1,x2,…,xm)為句子的一個分詞結果,由m個子詞組成。所以,當前分詞下句子S的似然值可以表示為:
對于句子S,挑選似然值最大的作為分詞結果,則可以表示為:
這里U(x)包含了句子的所有分詞結果。在實際應用中,詞表大小有上萬個,直接羅列所有可能的分詞組合不具有操作性。針對這個問題,可通過維特比算法得到X*來解決。
(來自百度百科:維特比算法是一種動態規劃算法用于尋找最有可能產生觀測事件序列的-維特比路徑-隱含狀態序列,特別是在馬爾可夫信息源上下文和隱馬爾可夫模型中。)
那怎么求解每個子詞的概率P(xi)呢?ULM通過EM算法來估計。假設當前詞表V, 則M步最大化的對象是如下似然函數:
(EM 算法是一種求解最大似然估計的方法)
其中,|D|是語料庫中語料數量。上述公式的一個直觀理解是,將語料庫中所有句子的所有分詞組合形成的概率相加。
但是,初始時,詞表V并不存在。因而,ULM算法采用不斷迭代的方法來構造詞表以及求解分詞概率:
1 初始時,建立一個足夠大的詞表。一般,可用語料中的所有字符加上常見的子字符串初始化詞表,也可以通過BPE算法初始化。
2 針對當前詞表,用EM算法求解每個子詞在語料上的概率。
3 對于每個子詞,計算當該子詞被從詞表中移除時,總的loss降低了多少,記為該子詞的loss。loss代表如果將某個詞去掉,上述似然函數值會減少多少。若某個子詞經常以很高的頻率出現在很多句子的分詞結果中,那么其損失將會很大,所以要保留這樣的子詞。
4 將子詞按照loss大小進行排序,丟棄一定比例loss最小的子詞(比如20%),保留下來的子詞生成新的詞表。這里需要注意的是,單字符不能被丟棄,這是為了避免OOV情況。
5 重復步驟2到4,直到詞表大小減少到設定范圍。
可以看出,ULM會保留那些以較高頻率出現在很多句子的分詞結果中的子詞,因為這些子詞如果被丟棄,其損失會很大。
三種分詞方法的關系
(SentencePiece、Huggingface tokenizers等庫可以調用以上分詞方法)
中文分詞方法
中文分詞介紹
中英文分詞區別
英文的分詞相較于中文分詞比較簡單,因為英文中一個詞可代表一個名詞、形容詞、副詞等,且詞與詞之間用空格隔開,在寫程序進行切分的時候只要匹配到空格即可。
而在中文本詞語沒有明顯的區分標記,而中文分詞的目的就是由機器在中文文本中加上詞與詞之間的標記。中文分詞存在困難是由于存在交集型歧義、組合型歧義和混合型歧義,交集型歧義如對ATB,有AT、TB同時成詞,eg.成為了,有成為/為了;組合型歧義如對AB,有A、B、AB同時成詞,eg.門把手壞了,有門/把手/壞/了,混合型歧義由交集型歧義和組合型歧義組成
目前中文分詞技術有:基于規則、基于統計、混合分詞、基于深度學習
1.基于規則的分詞
基于規則的分詞在已經建立好詞庫的前提下,通過掃描文本內容匹配到詞庫中,若詞庫中存在文本中某詞,則把該詞單獨提取出來。其思想是在切分語句時,將語句中的每個字符串與詞表中的詞進行逐一匹配,找到則切分,否則不切分。按照匹配切分方式,可分為正向匹配、逆向匹配、雙向匹配。
正向最大匹配算法
1 假定分詞詞典中的最長詞有m個漢字字符,將待分詞的中文文本中當前的前m個字符作為匹配字段,查找匹配字典中的詞,若存在這樣一個m字詞,則匹配成功,該匹配字段被作為一個詞切分出來
2 若文本中找不到詞典中最長m字詞,則匹配失敗,將匹配字段的最后一個字去掉,對剩下的m-1字串重新進行匹配處理
3 不斷循環處理下去,直到匹配成功,即成功切分一個詞或者剩余字符長度為0,這樣完成了一輪匹配。然后取下一個m字字串進行匹配處理,直到文本掃描完畢
逆向最大匹配算法
逆向最大匹配算法算法思想與正向最大匹配算法的差不多,區別在于正向的切分匹配方向從文檔的首部開始,逆向的從尾部開始切分。
1每次取末端的m個字符作為匹配字段,查找字典并匹配,若匹配失敗,則需要去掉匹配字段最前面的一個字,繼續匹配
2直到匹配成功或者剩余字符數目為0,即完成了且切分
3切分好的詞是逆序詞典,每個詞條做一個逆序方式存放
雙向匹配算法
分別采用正向最大匹配算法和逆向最大匹配算法的出來的兩個切分結果。
1若兩者的切分結果詞數不同,取兩者中分詞數較少的那個結果
2若兩者結果分詞數相同,取單字詞數目較少的那個
2.基于統計的分詞
基于統計的分詞需要建立語料庫并設計分詞模型,將中文文本通過訓練好的模型進行自動分詞。其基本思想是把某個詞看做是由詞的最小單位的各個字組成,如果相連的字在不同的文本中出現的次數越多,就證明這是一個出現頻率很高的詞,可靠度很高。一般步驟為:
1 建立語言統計模型,訓練模型
2 對句子進行單詞劃分,對劃分結果進行概率計算,獲得概率最大的分詞結果
語言模型用數學語言描述就是:長度為m的字符串確定其概率分布P(w1.w2,…,wm),其中w1到wm依次表示文本中每個詞,采用鏈式法則計算其概率值,如下式:
隱馬爾科夫模型HMM
HMM模型是將分詞作為字在字串中的序列標注任務來完成的,基本思路:每個字在構造一個特定的詞語時都占據一個確定的構詞位置(即詞位),現規定標簽B(詞首)、M(詞中)、E(詞尾)、S(單獨成詞),eg.研究生/要/讀/三年使用詞位標注是:研/B究/M生/E/要/S/讀/S/三/B年/E
用貝葉斯公式轉換可得:
這里可以進一步優化,每個輸出僅僅與上一個輸出有關,這叫齊次馬爾可夫假設,也叫二元模型:
使用HMM求解
常用一個Veterbi算法,該算法是一種動態規劃算法:每一個節點Oi只會影響其前后兩個的節點P(Oi-1 | Oi) 和 P(Oi | Oi+1) ,所以如果最終的最優路徑經過某個Oi,那么從初始節點到Oi-1的路徑必然也是一個最優路徑。
根據這個思想,可以通過遞推的方法在求每個Oi時只需要求出所有經過各Oi-1的候選點的最優路徑,然后再和當前的Oi結合比較,就可以逐步找出最優路徑。
統計分詞實現步驟如下:
1 使用已經分好詞的訓練集去訓練HMM模型,計算頻數得到HMM的三要素(初始狀態概率,狀態轉移概率和發射概率)
2 使用Viterbi算法以及訓練好的三個概率矩陣,將待分詞的句子轉換為’BMES’類型的狀態序列
3 根據已經求出的狀態序列,劃分句子進行分詞,得出分詞結果
3.混合分詞
單純的統計分詞也有缺陷,那就是太過于依賴語料的質量,因此實踐中多是采用這統計和規則兩種方法的結合,即混合分詞。混合分詞先進行基于規則的分詞、再進行基于統計的分詞,這樣分詞效果最好,但是也最麻煩。
4.基于深度學習的分詞
基于深度學習分詞簡介
基于深度學習的分詞是利用深度學習技術,結合傳統分詞方法改善分詞效果。優點是準確率高、適應性強,缺點是成本高、速度慢,例如有人員嘗試使用雙向LSTM+CRF實現分詞器,其本質上是序列標注,所以有通用性,命名實體識別等都可以使用該模型,據報道其分詞器字符準確率可高達97.5%。常見的分詞器都是使用機器學習算法和詞典相結合,一方面能夠提高分詞準確率,另一方面能夠改善領域適應性。
目前不管是基于規則的算法、還是基于HMM、CRF或者深度學習等的方法,其分詞效果在具體任務中,其實差距并沒有那么明顯。在實際工程應用中,多是基于一種分詞算法,然后用其他分詞算法加以輔助。最常用的方式就是先基于詞典的方式進行分詞,然后再用統計分詞方法進行輔助。如此,能在保證詞典分詞準確率的基礎上,對未登錄詞和歧義詞有較好的識別。
分詞工具比較
Jieba分詞、pyltp分詞、sentencepiece分詞比較
總結
以上是生活随笔為你收集整理的NLP-中文、英文分词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: D1. Coffee and Cours
- 下一篇: Confluence 6 管理协同编辑