第一次記錄一些學習的內容,希望能給和我一樣不熟悉中文分詞的人一些思路。(寫的不好,還請見諒)
=====================背景======================
中文分詞的學習是想要給公司其他部門的人做一個簡介,讓不知道中文分詞的人有個初步的認識,而我作為一個完全不懂的人要給其他不懂的人做這個講解 ⊙﹏⊙b 估計是希望我以一個同樣的不知道什么是中文分詞算法的人來講解這個,這樣能更貼近聽者的感受吧。
硬着頭皮看看寫寫6天多終於有一個我自己還算滿意的PPT出山了。
進入正題
=================看這邊~我就是正題==================
其實在之前稍微了解了一點關於中文分詞的思想,但是對於已經成型的中文分詞器的主流思想還是不甚了解,從搜索引擎處找到了開源中國的中文分詞庫。一眼看上去是幾十個分詞器列了出來,但其實每個分詞器點進去並不會有很長的介紹,基本都是給出來使用的分詞算法、一些自有的特點、百分比數據等。稍微聚合一下就會發現,實際使用的分詞算法兩只手就能數的過來,而算法背后的模型又是可以聚合的\(^o^)/,大致看過兩遍后心里就有數了。
我到現在看到的中文分詞器,基本都是這三類的任意組合,一般來說,只使用其中一種思想的分詞器效果基本無法達到比較理想的分詞效果。而在這些組合中,又以前兩種的組合居多,這可能也與第三種方法本身的研究進展和難度系數相對較高有關。
- 第一種思想——基於詞典:基於這種思想按照常用的說法也叫機械分詞,基本上不太考慮文本本身要表達的含義,只是一個個找到詞典中與之匹配的詞語進行划分,所以這種方法基本上只是作為分詞的前期處理。
- 第二種思想——基於統計:基於這種思想的已經是經過了對分詞這個實際的需求的數學建模、求解的一個過程,而無論是建模還是求解所用的算法,其實每一個問題都可以作為一個專門的課題寫個論文,不信你可以拿這些關鍵字去論文網搜一搜。
- 第三種思想——基於規則:在我看來,這個有點類似於人工智能一類了,建立一個系統來學習模仿人類是如何去分析一句話並如果對這句話的划分,甚至於可以添加一些標記來表示一句話當中所包含的情感。
在大概6天的時間里,我只是粗粗的理解了下兩種算法:MMSeg和Viterbi。下面就主要是對這兩種算法的一個思路的簡介,如果有理解錯誤的地方還請大神指點我一下,不勝感激╰( ̄▽ ̄)╮
強勢插入: 鑒於Viterbi的那部分我覺得放在一起這篇就會過長,暫定放在下一篇細聊 \(^o^)/ 希望能繼續關注!謝謝!
MMSeg
這個算法分詞結果能滿足很大一部分需求不是特別高的場合,最關鍵的是這個算法的思路簡單粗暴,憑借這一點它就在主流的分詞算法中占了一席之地。
思路:基於詞典+基於統計
##首先提一下基於詞典的三個基本方法
基於詞典的歸類下也就是上面列出來的MM(Maximum Matching)、RMM(Reverse Maximum Matching)、最少切分這三種,而這三種方法自由組合一下,也可以提高分詞的准確度。
舉個栗子:
詞典:
有 |
有意 |
意見 |
見 |
分歧 |
待宰割的句子:
有意見分歧
MM
肢解:
就是去詞典里面找匹配的詞,不過要有順序哦,從左到右的划分→_→
有意見分歧:詞典里有有這個詞
有意見分歧:有意比有的長度多了一個字,按照Maximum的思想,當然就是有意了
有意見分歧:有意已經完成了,開始見了,只有一個詞是以見開頭的,那就是它咯
有意見分歧:詞典里面也只有一個以分開頭的詞—分歧
結果:
有意/見/分歧
果然是簡單的不能再簡單了,但是真的是我們想要的結果么?答案很明顯
如果要是從句末開始呢?
RMM
肢解:
注:這里只是講解這個思路,實際應用請參照各類開源分詞詞典
這次我們從右往左看←_←
有意見分歧:就這么一個以歧結尾的詞哦,就用它了
有意見分歧:詞典里有兩個見字結尾的詞,其一就是這個見
有意見分歧:其二就是這個意見,意見要比見多了一個字,就意見咯
有意見分歧:只剩一個有了,那就它自己占一個位子了
結果:
有/意見/分歧
其實思路是一樣的,但結果還是有些差別的,瀏覽過很多個博客的分詞文章,出現概率很高的一句話:統計結果表明,單純使用正向最大匹配的錯誤率為 1/169,單純使用逆向最大匹配的錯誤率為 1/245。
最少切分
這個看名字也大概能知道個八九不離十。可以這樣想這樣一個場景,划分:
中華人民共和國
在相當一部分情況下,我們當然希望看到中華人民共和國作為一整個詞被划分,而不是中華/人民/共和國。
## 已經了解了基於詞典的三個基本方法,繼續MMSeg
MMSeg = MM + Seg = Maximum Matching + Segmentation
這個算法的名稱很清晰的表明了它使用的基本思想:正向最大匹配規則。
下面進入另外一個栗子:
研究生命起源
當然還是需要給定一個詞典:
研究 |
研究生 |
生命 |
起源 |
可能你很想知道我這些詞典是從哪里來的,好吧,實話告訴你,是我編的\(^o^)/,但這完全不妨礙我講解這個分詞算法,並且它可以更好的給予形象支持。
根據上面的方法可以知道按照MM方法可以分出來:研究生/命/起源。大部分時候結果肯定是不盡如人意。那是否可以考慮下其他的方案呢?我們最想看到的當然是:研究/生命/起源,聰明的讀者肯定可以想到,這個如果用RMM的話就可以輕松辦到咯,沒錯!那我們為什么還要用什么MMSeg的過濾器來拆詞呢?
(在這里擱淺了好久,一方面實在沒時間繼續寫;另一方才是主要原因,我都舉不出反例來,果然分析的詞還是太少Orz;容貧尼繼續吧,先放過這一馬吧~等我后面有看到或者有好心人提醒我的時候,再補充上例子來解決這個問題:“為什么我還要用MMSeg呢?”)
在這里我得先假定我們需要MMSeg了。。然后分詞的流程就像下面畫的:
直接從PPT里面截個圖。請忽略不好的畫工。。。
最需要解釋的大概就是chunk了,chunk是MMSeg里面不可避免的一個名詞。其實就是三個字或詞構成的一個小組就叫chunk了。上圖表示“研究生命起源”從研字開頭會有6個chunk,每個都是一個candidate。下面這些candidate就要經過層層篩選了~
- 看誰長 —>
- 看誰平均水平好 —>
- 看誰的穩定度最好(2和3有點像水桶木板的那個理論,就是水桶能盛多少水是取決於最小的板,要是差異比較大的話,那么水桶的容量並不一定好) —>
- 這個聽上去挺專業的,其實就是詞頻(即詞出現的概率或者次數),當然是露臉的多的比較容易選上,所以說要經常出去混個臉熟~
4號chunk技壓群chunk,入選咯。實際情況中,可以要用的chunk更多,而且很可能在第三步的時候還剩下不少,而本例在第三步結束后就只剩下一個可選的candidate了,自然就不用進行第四步。此時,chunk中的第一個詞就能夠確定成為一個我們分出來的詞了~啊~這么半天candidate也不是全部入選啊。之后做個減法
研究生命起源 - 研究 = 生命起源
然后從“生”這個字開始重復上面的步驟,就是MMSeg分詞拉~
如果你仔細看過,就能發現,前3步的確很“機械”,但是最后一步的話,就需要一些數據支持才有據可查了。這一步其實更偏向於統計的方法了,也就是在第一張圖里面我們看到的“2基於統計”這個思想。
想要把分詞的效果提升上來,將其他方法的優勢融入是最好的提升自己的辦法。而且網上還是能找到很多的開源的資源供你使用,當然也有付費的,大家都是要吃飯的嘛。
=====================后話======================
我能理解的MMSeg就是這些咯~如果你覺得對你有幫助,煩請點點右下角的推薦喲~本姑娘在此表示感謝~O(∩_∩)O謝謝~