一周亂談 中文分詞

2021-09-08 19:00:43 字數 2700 閱讀 1913

nlp(natural language processing)自然語言處理一直都是比較熱門的領域,現在不管是搜尋,推薦神馬的基本都需要和nlp打交道,而中文的nlp處理的第一步就是分詞了,所以中文分詞一直扮演者舉足輕重的角色。當然了,分詞的演算法也是層出不窮,從最初的字典匹配到後來的統計模型,從hmm到crf,分詞精度都在不斷提高,下面我就簡單介紹下基本的分詞演算法。

最簡單的分詞就是基於字典匹配,乙個句子「亂談中文分詞」,如果字典中我有這三個詞「亂談」「中文」「分詞」那麼我自然就可以把句子進行分詞了。基於字典匹配隨之而來的問題就是有多個匹配的情況,比如有「北京」「北京大學」兩個詞,這時來了個句子「北京大學在**」,應該用「北京」去匹配還是用「北京大學」去匹配,於是人們提出了很多啟發式的匹配方案,比如最經典的最大匹配,就是盡可能的匹配最長的詞,還有類似分詞後分出的詞的個數盡量少等啟發規則,於是有了mmseg演算法,提出了一些比較好的啟發規則,而且實際應用時效果也很不錯,所以應用很廣泛,具體細節大家自行搜尋,這裡不在贅述。

很快基於字典的分詞還是會暴露出很多的問題,最主要的問題就是歧義的問題,比如「武漢市長江大橋」,不同的分詞可能會變成「武漢/市長/江大橋」和「武漢市/長江/大橋」,顯然字典匹配是不能解決這樣的歧義問題的,於是有了統計的分詞演算法。在我的這篇文章裡介紹的就是一元模型的分詞演算法,對於乙個句子序列a1a2a3...an變成最後的詞序列a1a2a3...am,一元模型是希望

argmaxπmi=1p(ai)

同樣的n元模型即是

argmaxπp(ai|ai−1,ai−2...,ai−n+1)

我的這篇文章是一元模型的求法,於是統計模型的誕生有些的解決了分詞問題中的歧義問題。

hmm隱藏馬爾可夫鏈模型就是這樣乙個字標註的分詞演算法,假設原來的句子序列是a1a2a3...an,標註序列是c1c2...cn,那麼hmm是要求這樣的式子

argmaxπp(ci|ci−1)∗p(ai|ci)

在我的snownlp這個專案裡有去實現hmm的分詞。

我的這篇文章介紹了資訊熵的概念,資訊熵越大不確定性也就越大,資訊熵最大時表示各種概率的均等分布,也就是個不偏不倚的猜測,最大熵模型一般就是在已知條件下,來求是的熵最大的情況,最大熵模型我們一般會有feature函式,給定的條件就是樣本期望等於模型期望,即

p−(f)=σp−(ai,ci)∗f(ai,ci)=p(f)=σp(ci|ai)∗p−(ai)∗f(ai,ci)

在已知條件下就是求熵最大的情況

argmaxh(ci|ai)

h就是資訊熵的函式,於是這樣我們就求出了p(ci|ai),就知道了每個字a的標註c了,最大熵模型的乙個好處是我們可以引入各種各樣的feature,而不僅僅是從字出現的頻率去分詞,比如我們可以加入domain knowledge,可以加入已知的字典資訊等。

最大熵模型的乙個問題就是把每個字的標註問題**來看了,於是就有聰明人把馬爾可夫鏈和最大熵結合,搞出了最大熵馬爾可夫模型,這樣不僅可以利用最大熵的各種feature的特性,而且加入了序列化的資訊,使得能夠從整個序列最大化的角度來處理,而不是單獨的處理每個字,於是memm是求這樣的形式

memm的不足之處就是馬爾可夫鏈的不足之處,馬爾可夫鏈的假設是每個狀態只與他前面的狀態有關,這樣的假設顯然是有偏差的,所以就有了crf模型,使得每個狀態不止與他前面的狀態有關,還與他後面的狀態有關,從最開始的也能看出,hmm是基於貝葉斯網路的有向圖,而crf是無向圖。

p(yv|yw,w≠v)=p(yv,yw,w∼v)

where w~v means that w and v are neighbors in g.

上式是條件隨機場的定義,乙個圖被稱為條件隨機場,是說圖中的結點只和他相鄰的結點有關。最後由於不是貝葉斯網路的有向圖,所以crf利用團的概念來求,最後公式如下

p(y|x,λ)=1z(x)∗exp(σλj∗fj(y,x))

因為條件隨機場既可以像最大熵模型那樣加各種feature,又沒有馬爾可夫鏈那樣的偏執假設, 所以近年來crf已知是被公認的最好的分詞演算法stanfordnlp裡就有良好的中文分詞的crf實現,在他們的這篇**提到,他們把字典作為feature加入到crf中,可以很好的提高分詞的performance。

最近看到這篇**,已經有人用deep learning的方法來嘗試解決分詞的演算法,也取得了不錯的效果。

總之現在的中文分詞技術相對來說還是比較成熟了,所以如果沒有必要用這些開源的分詞實現已經足夠了,不過鑑於學習的目的,自己去實現乙個分詞演算法還是很有趣的。

一周又是一周

三年又三年,之後又三年,這就九年了,老大!無間道的話還迴盪在耳邊,而我入職以來,這就已經是第四周了。時間飛逝歲月如梭,一天一天的日子,感覺起來也挺快的。除了第一周剛上任的時候,感覺時間慢慢流,現在進入工作狀態以後,時間還是一閃而過的。白天的時間最是難熬,特別是下午的時候。工作時間久,而下午的時候也是...

QString 亂談 3 Qt5與中文

今天,隨著change qstring s default codec to be utf 8 進入qt5的master分支,我們總算可以重新審視一下qt的中文支援問題。20120516更新 建議閱讀qtcore模組維護者thiago macieira 的文章 source code must be...

QString 亂談 3 Qt5與中文

兩個月前,簡單寫過qtextcodec中的setcodecfortr等終於消失了 qt5 在qt論壇上,不少使用者都對去掉這兩個函式表示特別的不了解。為什麼會這樣?我想多少能說明不少使用者對c 中原始碼字符集和執行字符集的不太了解,從而造成對這種函式的依賴或誤用。今天,隨著change qstrin...