前段時(shí)間有小伙伴問(wèn)了我好幾次中文切詞是怎么切的,我想著應(yīng)該是我沒表達(dá)清楚所以小伙伴才會(huì)重復(fù)問(wèn)多次,是我表達(dá)能力不夠,臨時(shí)說(shuō)也說(shuō)不上來(lái)。所以就寫一篇了簡(jiǎn)單的中文切詞方法的短文,一方面是鍛煉下自己的表達(dá)能力,另一方面下次小伙伴再問(wèn)就直接扔給他Y(^o^)Y
中文分詞介紹
在文本處理中,如果需要理解分析句子背后的含義(語(yǔ)義),或者需要加入人的一些詞語(yǔ)的先驗(yàn)知識(shí),又或者數(shù)據(jù)量不夠大細(xì)粒度的單元(字)容易導(dǎo)致過(guò)擬合(字的字典表一般都比較小),或者有些特殊的只適合詞的模型的一些場(chǎng)景下都需要 切詞 來(lái)將句子切分成詞的有序串。特別的,“詞”是表達(dá)/承載語(yǔ)義的最小單位,在需要表達(dá)句子乃至文章意義的時(shí)候切詞是必要的。
但并不是所有文本處理都需要/適合切詞,在數(shù)據(jù)集比較足夠大的情況,或者一些深度網(wǎng)絡(luò)模型,或者機(jī)器翻譯的場(chǎng)景中,都是字粒度表現(xiàn)的更好。
所以是否真的需要切詞,是在不同的場(chǎng)景下不同的數(shù)據(jù)下需要分別對(duì)待的。在不是必須要分詞的情況下,優(yōu)先嘗試使用字粒度的模型能夠更快更便捷的不錯(cuò)的結(jié)果再考慮是否引入詞/語(yǔ)音的概念。
在英文中每個(gè)詞本身就有分割的標(biāo)記,但是在中文當(dāng)中詞與詞之間沒有明顯的區(qū)分標(biāo)記,而且經(jīng)常會(huì)有字的前后語(yǔ)境不一樣切分方式就差別很大的情況。因此如何切詞(切詞算法)就顯得額外重要。下面以我自己的理解和簡(jiǎn)單的語(yǔ)言淺顯地分享下我個(gè)人理解的各種分詞策略。
中文切詞分類
在中文切詞中大多數(shù)文章都會(huì)分為三類:
1. 基于詞典的分詞方法(也有文章稱"基于字符串匹配方法")
2. 基于統(tǒng)計(jì)的分詞方法
3. 基于序列標(biāo)注的分詞方法
第一類基于詞典的分詞方法
掃描方向不同:正向/逆向最大匹配法、雙向匹配分詞法。
長(zhǎng)度傾向不同:最少切分算法。
它們最重要的思想就是按照一定策略將待分析的字串與一個(gè)大詞典中的詞條進(jìn)行匹配,若字串在詞典中存在則匹配成功,然后進(jìn)行下一個(gè)字串的猜想。
第二類基于統(tǒng)計(jì)的分詞方法
N元模型(N-gram)、Aprior算法(頻繁項(xiàng)集算法)
他們最重要的思想就是在大量文本中,某些相鄰(有順序)的字(/詞)同時(shí)出現(xiàn)的次數(shù)越多,就越可能構(gòu)成一個(gè)詞(/詞串)。因此這些算法是統(tǒng)計(jì)或者分析字與字順序相鄰出現(xiàn)的概率來(lái)得到最大概率的切詞結(jié)果。
第三類基于序列標(biāo)注的分詞方法
條件隨機(jī)場(chǎng)(CRF)、隱馬爾科夫模型(HMM)、最大熵算法等
當(dāng)然也包括神經(jīng)網(wǎng)絡(luò)分詞模型。
他們都屬于一種字構(gòu)詞方法,最重要的思想是把分詞過(guò)程視為字在字串中的標(biāo)注問(wèn)題(例如將字標(biāo)注為“首字中間字尾字”或者其他標(biāo)注方式)。當(dāng)這些標(biāo)注完成的時(shí)候切詞也就自然完成了。這種策略能夠平衡地看待詞表詞和未登錄詞(未收錄到詞典的詞)的識(shí)別問(wèn)題,大大簡(jiǎn)化了使用門檻,并得到一個(gè)相當(dāng)不錯(cuò)的切詞結(jié)果。
強(qiáng)行插入一波廣告隱馬爾科夫模型的淺顯介紹鏈接
第四類其他分詞方法
分詞方法不限于上述幾種方式和算法。還有很多有效可靠的算法,我沒有很好地將他們分類。包括N-最短路徑算法,自動(dòng)感知機(jī)算法,基于字的生成式模型,等等。另外還有通過(guò)計(jì)算機(jī)模擬人類對(duì)句子的理解,同時(shí)具備句法的分析,語(yǔ)義的理解,并共同作用于分詞的結(jié)果而且能順帶給出歧義的最優(yōu)解。
還有一個(gè)最準(zhǔn)最強(qiáng)分詞器(性能差了點(diǎn))----人腦。小伙伴們有沒有發(fā)現(xiàn)人腦能簡(jiǎn)單地進(jìn)行分詞,機(jī)器卻這么復(fù)雜和困難才勉強(qiáng)能使用,人腦還是hin強(qiáng)大啊。
以上就是基本分詞算法的分類以及其主要的思想。
下面分享一些基本的算法理論介紹,覺得無(wú)趣的小伙伴先去洗洗睡吧。
正向/逆向最大匹配算法
先說(shuō)說(shuō)最大匹配算法,最大匹配算法就是按照某種策略使得切得的詞包含的字串長(zhǎng)度最大。正向最大匹配算法是從左往右進(jìn)行匹配,反向則是從右往左進(jìn)行匹配。舉個(gè)栗子:
詞典: 研究,研究生,生活,水平,活水,的確,確實(shí),在理。
句子: 研究生活水平;他說(shuō)的確實(shí)在理。
那么正向匹配算法,匹配過(guò)程:(咱們字典最大長(zhǎng)度為3)
從左往右先選擇最大的長(zhǎng)度作為待查字串,然后查詢字典,沒命中的情況下,將最后一個(gè)字去除,再查詢字典,如此往復(fù),直到待查字串為空。
第一句: 研究生活水平
| 待查字串 | 是否命中字典 | 輸出 |
|---|---|---|
| 研究生 | 是 | 研究生 |
| 活水平 | 否 | |
| 活水 | 是 | 研究生 活水 |
| 平 | 否 | |
| null | 研究生 活水 平 |
下一句: 他說(shuō)的確實(shí)在理。
| 待查字串 | 是否命中字典 | 輸出 |
|---|---|---|
| 他說(shuō)的 | 否 | |
| 他說(shuō) | 否 | |
| 他 | 否 | |
| null | 他 | |
| 說(shuō)的確 | 否 | |
| ...略 | 否 | 他 說(shuō) |
| 的確在 | 否 | |
| 的確 | 是 | 他 說(shuō) 的確 |
| 實(shí)在理 | 否 | |
| 實(shí)在 | 是 | 他 說(shuō) 的確 實(shí)在 |
| 理 | 否 | |
| null | 他 說(shuō) 的確 實(shí)在 理 |
那么逆向最大匹配算法,也就是說(shuō)是個(gè)從右往左的一個(gè)反向過(guò)程,實(shí)際上與上述過(guò)程一樣。只寫一句栗子。
| 待查字串 | 是否命中字典 | 輸出 |
|---|---|---|
| 實(shí)在理 | 否 | |
| 在理 | 是 | 在理 |
| 的確實(shí) | 否 | |
| 確實(shí) | 是 | 確實(shí) 在理 |
| 他說(shuō)的 | 否 | |
| 說(shuō)的 | 否 | |
| ...略 | 否 | 他 說(shuō) 的 確實(shí) 在理 |
小伙伴也看到了,逆向匹配好像要優(yōu)于正向匹配。也確實(shí)實(shí)驗(yàn)表明(哪里有過(guò)統(tǒng)計(jì)),逆向最大匹配算法要優(yōu)于正向最大匹配算法的。但也不絕對(duì),還是有不少句子正向的結(jié)果要比反向結(jié)果要好很多的。
雙向最大匹配算法
雙向最大匹配算法是將正向最大匹配法與逆向最大匹配法組合。將句子分別使用正向最大匹配和逆向最大匹配法進(jìn)行掃描切分。如果兩種分詞方法得到的匹配結(jié)果相同,則認(rèn)為分詞正確,否則,按照最小集或者其他策略進(jìn)行選擇和融合處理。
據(jù)說(shuō),中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合且正確,只有大概9.0%的句子兩種切分方法得到 的結(jié)果不一樣,但其中必有一個(gè)是正確的(歧義檢測(cè)成功),只有不到1.0%的句子,正向最大匹配法和逆向最大匹配法的切分雖重合卻是錯(cuò)的,或者正向最大匹配法和逆向最大匹配法切分不同但兩個(gè)都不對(duì)(歧義檢測(cè)失敗)。這正是雙向最大匹配法在實(shí)用中文信息處理系統(tǒng)中得以廣泛使用的原因所在。
最少切分策略
最少切分策略,思路也比較簡(jiǎn)單,將幾種切分算法得到的結(jié)果,選擇詞數(shù)最少的,如果詞數(shù)一樣再用其他方式進(jìn)行挑選。這個(gè)只是個(gè)挑選策略,事實(shí)證明句子詞數(shù)最少的切分方式往往都是正確的。
N元模型(N-gram)切詞
基于N元模型的切詞策略是將訓(xùn)練好的N-gram模型進(jìn)行路徑計(jì)算得到最優(yōu)切分策略路徑。巨大多數(shù)句子由于歧義的存在,肯定會(huì)有多種切分路徑,之前的最大匹配算法就是就是用一種貪婪的規(guī)則方式選擇最優(yōu)的路徑,N-gram模型則是用統(tǒng)計(jì)得到的先驗(yàn)概率來(lái)得到概率最大的路徑。
依然還是舉上述的例子:
句子: 他說(shuō)的確實(shí)在理
假設(shè)我們使用的2-gram,每個(gè)字出現(xiàn)的概率只與其前面的一個(gè)字有關(guān)
那么我們能舉例出所有的詞路徑:

找出其最優(yōu)的路徑,就能得到最優(yōu)的切分方式。
在其他算法中如最短路徑算法,是設(shè)定每個(gè)路徑上的每條邊作為一個(gè)觸達(dá)距離,然后再使用Dijkstra或者其他最短路徑法來(lái)得到最短的觸達(dá)距離作為最優(yōu)解。
在N-gram模型的算法中,每個(gè)路徑上的邊都是一個(gè)N-gram的概率于是得到如下概率路徑有向圖。

那么分詞任務(wù)就轉(zhuǎn)變?yōu)?strong>如何求解最優(yōu)策略路徑
假設(shè)隨機(jī)變量S為一個(gè)漢字序列,W是S上所有可能的切分路徑(如上圖所有從頭至尾的不同路徑)。對(duì)于分詞,實(shí)際上就是求解使條件概率P(W∣S)最大的切分路徑,P(W∣S)即為每條路徑的衡量標(biāo)準(zhǔn)。
做貝葉斯公式轉(zhuǎn)換:
由于P(S)為歸一化因子,而且一般情況下(詞序列無(wú)論怎么變子序列都是不會(huì)變化)P(S∣W)為1,因此只需要求解 。
假設(shè)我們使用 2-gram 語(yǔ)言模型進(jìn)行建模(一個(gè)字詞的出現(xiàn)只依賴它前面的那個(gè)字或詞)。
有了上述模型,就可以得到每條切分路徑的也就是開頭說(shuō)的每條切分路徑的衡量標(biāo)準(zhǔn)。
在這只后再使用暴力窮舉也好,動(dòng)態(tài)規(guī)劃也好,最短路徑算法也好,最終找出最優(yōu)解序列即為最優(yōu)的切詞策略。
隱馬爾科夫模型(HMM)切詞
再次強(qiáng)行插入一波廣告隱馬爾科夫模型的淺顯介紹鏈接
字構(gòu)詞的分詞方法思想,是將分詞問(wèn)題轉(zhuǎn)化為字的分類問(wèn)題(序列標(biāo)注問(wèn)題)。就是說(shuō)序列標(biāo)注有以下幾種: 詞首,詞中,詞尾,單子詞等。舉個(gè)下面的列子就能明白了。
| 研 | 究 | 生 | 說(shuō) | 的 | 確 | 實(shí) | 在 | 理 |
|---|---|---|---|---|---|---|---|---|
| 詞首 | 詞中 | 詞尾 | 單字詞 | 單字詞 | 詞首 | 詞尾 | 詞首 | 詞尾 |
當(dāng)每個(gè)字的標(biāo)注都得出的時(shí)候,切詞也就順理成章得完成了。

在隱馬爾科夫模型中上述切詞問(wèn)題,對(duì)應(yīng)以下幾種要素,字為觀察符號(hào),標(biāo)注為隱含狀態(tài),目標(biāo)是找出概率最大的標(biāo)注序列,實(shí)際上就是隱馬爾科夫模型三大問(wèn)題中的解碼問(wèn)題。
給定一個(gè)模型λ , 和一個(gè)觀察序列O,找出產(chǎn)生這一序列概率最大的狀態(tài)序列Q
這個(gè)問(wèn)題可以使用Viterbi算法就可以輕松解決。
CRF切詞
條件隨機(jī)場(chǎng)(CRF)同樣也是一種標(biāo)注思想,但與HMM不同的地方在于,HMM還算是生成式的話,CRF就屬于判別式了,因?yàn)镃RF主要的思想是將字進(jìn)行分類任務(wù)得到它的最優(yōu)的標(biāo)注。
CRF假設(shè)標(biāo)注序列Y在給定觀察序列X的條件下,Y構(gòu)成的圖為一個(gè)MRF(馬爾科夫隨機(jī)場(chǎng))。
參考資料
https://www.cnblogs.com/en-heng/p/6214023.html
https://zhuanlan.zhihu.com/p/33261835