结巴分词优点_中文分词概述及结巴分词原理
詞是中文表達(dá)語義的最小單位,中文分詞是中文文本處理的一個(gè)基礎(chǔ)步驟,分詞的結(jié)果對(duì)中文信息處理至為關(guān)鍵。
本文先對(duì)中文分詞方法進(jìn)行概述,然后簡單介紹結(jié)巴分詞背后的原理。
1.?中文分詞概述
中文分詞根據(jù)實(shí)現(xiàn)特點(diǎn)大致可分為兩類:基于詞典的分詞方法、基于統(tǒng)計(jì)的分詞方法。
1.1 基于詞典的分詞方法
基于詞典的分詞方法首先會(huì)建立一個(gè)充分大的詞典,然后依據(jù)一定的策略掃描句子,若句子中的某個(gè)子串與詞典中的某個(gè)詞匹配,則分詞成功。
常見的掃描策略有:正向最大匹配、逆向最大匹配、雙向最大匹配和最少詞數(shù)分詞。
1.1.1 正向最大匹配
對(duì)輸入的句子從左至右,取詞典中最長單詞的個(gè)數(shù)作為第一次取詞的個(gè)數(shù),在詞典中進(jìn)行掃描,若不匹配,則逐字遞減;若匹配,則取出當(dāng)前詞,從后面的詞開始正向最大匹配,組不了詞的字單獨(dú)劃開。其分詞基本原則是:詞的顆粒度越大越好;切分結(jié)果中非詞典詞越少越好;總體詞數(shù)越少越好。
1.1.2 逆向最大匹配
分詞原則與正向最大匹配相同,但順序不是從首字開始,而是從末字開始,而且它使用的分詞詞典是逆序詞典,其中每個(gè)詞條都按逆序方式存放。在實(shí)際處理時(shí),先將句子進(jìn)行倒排處理,生成逆序句子,然后根據(jù)逆序詞典,對(duì)逆序句子用正向最大匹配處理。
1.1.3 雙向最大匹配
將正向最大匹配與逆向最大匹配組合起來,對(duì)句子使用這兩種方式進(jìn)行掃描切分,如果兩種分詞方法得到的匹配結(jié)果相同,則認(rèn)為分詞正確,否則,按最小集處理。
1.1.4 最少詞數(shù)分詞
即一句話應(yīng)該分成數(shù)量最少的詞串,該方法首先會(huì)查找詞典中最長的詞,看是不是所要分詞的句子的子串,如果是則切分,然后不斷迭代以上步驟,每次都會(huì)在剩余的字符串中取最長的詞進(jìn)行分詞,最后就可以得到最少的詞數(shù)。
總結(jié):基于詞典的分詞方法簡單、速度快,效果也還可以,但對(duì)歧義和新詞的處理不是很好,對(duì)詞典中未登錄的詞沒法進(jìn)行處理。
1.2 基于統(tǒng)計(jì)的分詞方法
基于統(tǒng)計(jì)的分詞方法是從大量已經(jīng)分詞的文本中,利用統(tǒng)計(jì)機(jī)器學(xué)習(xí)模型來學(xué)習(xí)詞的切分規(guī)律,從而實(shí)現(xiàn)對(duì)未知文本的切分。隨著大規(guī)模語料庫的建立,基于統(tǒng)計(jì)的分詞方法不斷受到研究和發(fā)展,漸漸成為了主流。
常用的統(tǒng)計(jì)學(xué)習(xí)方法有:隱馬爾可夫模型(HMM)、條件隨機(jī)場(chǎng)(CRF)和基于深度學(xué)習(xí)的方法。
1.2.1 HMM和CRF
這兩種方法實(shí)質(zhì)上是對(duì)序列進(jìn)行標(biāo)注,將分詞問題轉(zhuǎn)化為字的分類問題,每個(gè)字有4種詞位(類別):詞首(B)、詞中(M)、詞尾(E)和單字成詞(S)。由字構(gòu)詞的方法并不依賴于事先編制好的詞典,只需對(duì)分好詞的語料進(jìn)行訓(xùn)練即可。當(dāng)模型訓(xùn)練好后,就可對(duì)新句子進(jìn)行預(yù)測(cè),預(yù)測(cè)時(shí)會(huì)針對(duì)每個(gè)字生成不同的詞位。其中HMM屬于生成式模型,CRF屬于判別式模型。
1.2.2 基于深度學(xué)習(xí)的方法
神經(jīng)網(wǎng)絡(luò)的序列標(biāo)注算法在詞性標(biāo)注、命名實(shí)體識(shí)別等問題上取得了優(yōu)秀的進(jìn)展,這些端到端的方法也可以遷移到分詞問題上。與所有深度學(xué)習(xí)的方法一樣,該方法需要較大的訓(xùn)練語料才能體現(xiàn)優(yōu)勢(shì),代表為BiLSTM-CRF。
總結(jié):基于統(tǒng)計(jì)的分詞方法能很好地處理歧義和新詞問題,效果比基于詞典的要好,但該方法需要有大量人工標(biāo)注分好詞的語料作為支撐,訓(xùn)練開銷大,就分詞速度而言不如前一種。
在實(shí)際應(yīng)用中一般是將詞典與統(tǒng)計(jì)學(xué)習(xí)方法結(jié)合起來,既發(fā)揮詞典分詞切分速度快的特點(diǎn),又利用了統(tǒng)計(jì)分詞結(jié)合上下文識(shí)別生詞、自動(dòng)消除歧義的優(yōu)點(diǎn)。結(jié)巴分詞正是這一類的代表,下面簡單介紹它的實(shí)現(xiàn)算法。
2.?結(jié)巴分詞原理
官方Github上對(duì)所用算法的描述為:
基于前綴詞典實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖?(DAG);
采用了動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合;
對(duì)于未登錄詞,采用了基于漢字成詞能力的?HMM 模型,使用了 Viterbi 算法。
下面逐一介紹:
2.1 構(gòu)造前綴詞典
結(jié)巴分詞首先會(huì)依照統(tǒng)計(jì)詞典dict.txt構(gòu)造前綴詞典。dict.txt含有近35萬的詞條,每個(gè)詞條占用一行,其中每一行有3列,第一列為詞條,第二列為對(duì)應(yīng)的詞頻,第三列為詞性,構(gòu)造前綴詞典需要用到前兩列。
具體做法為:首先定義一個(gè)空的python字典,然后遍歷dict.txt的每一行,取詞條作為字典的鍵,詞頻作為對(duì)應(yīng)的鍵值,然后遍歷該詞條的前綴,如果前綴對(duì)應(yīng)的鍵不在字典里,就把該前綴設(shè)為字典新的鍵,對(duì)應(yīng)的鍵值設(shè)為0,如果前綴在字典里,則什么都不做。
這樣等遍歷完dict.txt后,前綴詞典就構(gòu)造好了。在構(gòu)造前綴詞典時(shí),會(huì)累加統(tǒng)計(jì)詞典里所有詞條的詞頻,累加值等計(jì)算最大概率路徑時(shí)會(huì)用到。
2.2 生成有向無環(huán)圖(DAG)
用正則表達(dá)式分割句子后,對(duì)每一個(gè)單獨(dú)的子句會(huì)生成一個(gè)有向無環(huán)圖。
具體方式為:先定義一個(gè)空的python字典,然后遍歷子句,當(dāng)前子句元素的索引會(huì)作為字典的一個(gè)鍵,對(duì)應(yīng)的鍵值為一個(gè)python列表(初始為空),然后會(huì)以當(dāng)前索引作為子串的起始索引,不斷向后遍歷生成不同的子串,如果子串在前綴詞典里且鍵值不為0的話,則把子串的終止索引添加到列表中。
這樣等遍歷完子句的所有字后,對(duì)應(yīng)的DAG就生成好了。(子串的鍵值如果是0,則說明它不是一個(gè)詞條)
2.3 計(jì)算最大概率路徑
DAG的起點(diǎn)到終點(diǎn)會(huì)有很多路徑,需要找到一條概率最大的路徑,然后據(jù)此進(jìn)行分詞。可以采用動(dòng)態(tài)規(guī)劃來求解最大概率路徑。
具體為:從子句的最后一個(gè)字開始,倒序遍歷子句的每個(gè)字,取當(dāng)前字對(duì)應(yīng)索引在DAG字典中的鍵值(一個(gè)python列表),然后遍歷該列表,當(dāng)前字會(huì)和列表中每個(gè)字兩兩組合成一個(gè)詞條,然后基于詞頻計(jì)算出當(dāng)前字到句尾的概率,以python元組的方式保存最大概率,元祖第一個(gè)元素是最大概率的對(duì)數(shù),第二個(gè)元素為最大概率對(duì)應(yīng)詞條的終止索引。
詞頻可看作DAG中邊的權(quán)重,之所以取概率的對(duì)數(shù)是為了防止數(shù)值下溢。有了最大概率路徑,分詞結(jié)果也就隨之確定。
2.4 對(duì)未登錄詞采用HMM模型進(jìn)行分詞
當(dāng)出現(xiàn)沒有在前綴詞典里收錄的詞時(shí),會(huì)采用HMM模型進(jìn)行分詞。HMM模型有5個(gè)基本組成:觀測(cè)序列、狀態(tài)序列、狀態(tài)初始概率、狀態(tài)轉(zhuǎn)移概率和狀態(tài)發(fā)射概率。分詞屬于HMM的預(yù)測(cè)問題,即已知觀測(cè)序列、狀態(tài)初始概率、狀態(tài)轉(zhuǎn)移概率和狀態(tài)發(fā)射概率的條件下,求狀態(tài)序列。結(jié)巴分詞已經(jīng)內(nèi)置了訓(xùn)練好的狀態(tài)初始概率、狀態(tài)轉(zhuǎn)移概率和狀態(tài)發(fā)射概率。
句子會(huì)作為觀測(cè)序列,當(dāng)有新句子進(jìn)來時(shí),具體做法為:先通過Viterbi算法求出概率最大的狀態(tài)序列,然后基于狀態(tài)序列輸出分詞結(jié)果(每個(gè)字的狀態(tài)為B、M、E、S之一)。
? ? ? ?至此,結(jié)巴分詞的原理就簡單介紹完了。
下面舉一個(gè)簡單的例子:
假如待分詞的句子為:?“這幾天都在學(xué)自然語言處理”。
首先依據(jù)前綴詞典生成DAG:
{ ?0: [0],
???1: [1, 2],
???2: [2, 3],
???3: [3],
???4: [4],
???5: [5],
???6: [6, 7, 9],
???7: [7],
???8: [8, 9],
???9: [9],
?10: [10, 11],
?11: [11] ?}
句子元素對(duì)應(yīng)的索引會(huì)作為字典的鍵,對(duì)應(yīng)鍵值的第一項(xiàng)與當(dāng)前索引相同,其余項(xiàng)會(huì)與當(dāng)前索引組成詞條,這個(gè)詞條在前綴詞典里且對(duì)應(yīng)鍵值不為0。
生成的DAG如下:
然后采用動(dòng)態(tài)規(guī)劃求出的最大概率路徑為:
{12: (0, 0),
?11: (-9.073726763747516, 11),
?10: (-8.620554852761583, 11),
? ?9: (-17.35315508178225, 9),
? ?8: (-17.590039287472578, 9),
? ?7: (-27.280113467960604, 7),
? ?6: (-22.70346658402771, 9),
? ?5: (-30.846092652642497, 5),
? ?4: (-35.25970621827743, 4),
? ?3: (-40.95138241952608, 3),
? ?2: (-48.372244833381465, 2),
? ?1: (-50.4870755319817, 2),
? ?0: (-55.92332690525722, 0)}
最大概率路徑按句子索引倒序排列,但分詞時(shí)會(huì)從索引0開始順序遍歷句子。
具體做法為:
首先遍歷0,0對(duì)應(yīng)的鍵值最后一項(xiàng)為0,即詞的長度為1,遇到長度為1的詞時(shí)(即單字)先不分,繼續(xù)往后看,然后遍歷1,1對(duì)應(yīng)的鍵值最后一項(xiàng)為2,即詞的長度為2,這時(shí)會(huì)把索引為0的單字作為詞分割出來,然后接著把索引1、2對(duì)應(yīng)的詞分割出來,然后遍歷3,3對(duì)應(yīng)的鍵值最后一項(xiàng)為3,屬于單字,先不分,索引4、5同理,然后遍歷6,6對(duì)應(yīng)的鍵值最后一項(xiàng)為9,即詞的長度為4,注意,這里索引3、4、5對(duì)應(yīng)的單字序列(即“都在學(xué)”)如果不在前綴詞典中或者在前綴詞典中但鍵值為0,則會(huì)對(duì)單字序列采用HMM模型進(jìn)行分詞,否則的話,會(huì)對(duì)單字序列每個(gè)字進(jìn)行分詞,分好之后把索引6、7、8、9對(duì)應(yīng)的詞分割出去,然后遍歷10,10對(duì)應(yīng)的鍵值最后一項(xiàng)為11,即詞的長度為2,直接把索引10、11對(duì)應(yīng)的詞分割出去,至此分詞結(jié)束。
下面對(duì)結(jié)巴分詞的邏輯進(jìn)行總結(jié):
在遇到長度>=2的詞之前會(huì)把它前面出現(xiàn)的所有單字保存下來;
如果保存下來的單字序列長度為0,則直接把當(dāng)前詞分割出去;
如果保存下來的單字序列長度為1,則直接把單字作為詞分割出去,然后把后面詞分割出去;
如果保存下來的單字序列長度>1,會(huì)分兩種情況:假如單字序列不在前綴詞典中或者在前綴詞典中但鍵值為0,則會(huì)對(duì)單字序列采用HMM模型進(jìn)行分詞,否則的話,會(huì)對(duì)單字序列每個(gè)字進(jìn)行分詞。
最后分好的詞為:['這', ?'幾天', ?'都', ?'在', ?'學(xué)', ?'自然語言', ?'處理']。
3.?總結(jié)
本文先對(duì)中文分詞方法進(jìn)行了概述,然后講解了結(jié)巴分詞原理。實(shí)際應(yīng)用中,一般將基于詞典的分詞方法和基于統(tǒng)計(jì)的分詞方法相結(jié)合以達(dá)到比較好的效果。除結(jié)巴分詞外,成熟的中文分詞包還有北大中文分詞工具、HanLP等,可多了解比較它們的效果。
總結(jié)
以上是生活随笔為你收集整理的结巴分词优点_中文分词概述及结巴分词原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 喜欢大海的唯美句子184个
- 下一篇: 司法所2021年工作计划要点3篇