中文分詞就是經過計算機將句子轉化成詞的表示,自動識別句子中的詞,在詞與詞之間加入邊界分隔符,分割出各個詞彙。html
中文分詞有兩大難點:git
1.歧義github
原文:之前喜歡一我的,如今喜歡一我的算法
這裏有兩個「一我的」,可是表明的意思徹底不同。spring
2.分詞界限數據結構
原文:這杯水尚未冷機器學習
分詞一: 這 / 杯 / 水 / 還 / 沒有 / 冷函數
分詞二: 這 / 杯 / 水 / 還沒 / 有 / 冷工具
分詞三: 這 / 杯 / 水 / 尚未 / 冷學習
能夠說中文分詞沒有標準的分詞算法,只有對應不一樣場景更適合的分詞算法。
主要能夠分爲三個方法:機械分詞方法,統計分詞方法,以及兩種結合起來的分詞
機械分詞方法又叫作基於規則的分詞方法:這種分詞方法按照必定的規則將待處理的字符串與一個詞表詞典中的詞進行逐一匹配,若在詞典中找到某個字符串,則切分,不然不切分。
按照匹配規則的方式,又能夠分爲:正向最大匹配法,逆向最大匹配法和雙向匹配法三種
1.正向最大匹配法(Maximum Match Method,MM 法)是指從左向右按最大原則與詞典裏面的詞進行匹配。假設詞典中最長詞是 mm 個字,那麼從待切分文本的最左邊取 mm 個字符與詞典進行匹配,若是匹配成功,則分詞。
若是匹配不成功,那麼取 m−1m−1 個字符與詞典匹配,一直取直到成功匹配爲止。流程圖以下:
算法步驟:
dic
,待分詞文本 text
,建立空集 words
。max_len_word
。max_len=max_len_word
個字符做爲待匹配字符串 word
。word
與詞典 dic
匹配max_len = max_len - 1
,而後word
添加進 words
當中。max_len
個字符max_len
值爲 max_len_word
words
2.逆向最大匹配法( Reverse Maximum Match Method, RMM 法)的原理與正向法基本相同,惟一不一樣的就是切分的方向與 MM 法相反。逆向法從文本末端開始匹配,每次用末端的最長詞長度個字符進行匹配。
另外,因爲漢語言結構的問題,裏面有許多偏正短語,即結構是:
所以,若是採用逆向匹配法,能夠適當提升一些精確度。換句話說,使用逆向匹配法要比正向匹配法的偏差要小。
3.雙向最大匹配法(Bi-direction Matching Method ,BMM)則是將正向匹配法獲得的分詞結果與逆向匹配法獲得的分詞結果進行比較,而後按照最大匹配原則,選取次數切分最少的做爲結果。
基於統計規則的中文分詞算法逐漸成爲如今的主流分詞方法。其目的是在給定大量已經分詞的文本的前提下,利用統計機器學習的模型學習詞語切分的規律。
統計分詞能夠這樣理解:咱們已經有一個由不少個文本組成的的語料庫 D
,如今有一個文本須要咱們分詞, 我有一個蘋果
,其中兩個相連的字 蘋
果
在不一樣的文本中連續出現的次數越多,就說明這兩個相連字極可能構成一個詞 蘋果
。與此同時 個
蘋
這兩個相連的詞在別的文本中連續出現的次數不多,就說明這兩個相連的字不太可能構成一個詞 個蘋
。因此,咱們就能夠利用這個統計規則來反應字與字成詞的可信度。當字連續組合的機率高過一個臨界值時,就認爲該組合構成了一個詞語。
語言模型又叫作 N 元文法模型(N-gram)。按照書面解釋來講,以長度爲 m 的字符串,目的是肯定其機率分佈 P(w1,w2,⋯,wm),其中 w1到 wm 依次爲文本中的每一個詞語。
這個機率能夠用鏈式法則來求:即
由於咱們是基於語料庫的統計模型,因此上面的全部機率均可以經過對語料庫的統計計算得到。可是,雖然採用的方法簡單粗暴,可是觀察上面的式子能夠知道,當語料很大的時候,公式從第三項開始計算量就已經十分龐大了。
所以,在語言模型的基礎上,衍生出了 nn 元模型。所謂的 nn 元就是在估算條件機率時,忽略掉大於 nn 個或者等於 nn 個上文詞的的影響。即將上式子中的每一項簡化
能夠看到,當 n=1n=1 時,詞與詞之間基本沒有關係。隨着 nn 逐漸增大,每一個模型與上文的關係越密切,包含的次序信息也越豐富,可是與此同時計算量也隨之大大增長。因此經常使用的通常爲二元模型,三元模型。
在天氣預測時候,假如咱們知道晴雨雲天氣之間的相互轉換機率,以下圖:
有了這個轉移機率圖,假如咱們知道今天的天氣狀況的時候,咱們就能推測出明天的天氣情況。若今天爲晴,那麼明天推測爲陰天(取其中機率最大的)。這樣一種類型就是馬可夫模型。
隱馬可夫(Hidden Markov Method , HMM)模型是在馬可夫模型的特殊狀況,更進一步的,咱們在上面馬爾可夫的模型中,添加更多的限制條件。
在這個例子當中,將來幾每天氣狀態的序列就叫作隱藏狀態序列。而咱們惟一能觀測到的是,將來幾天空氣中的溼度,這些溼度狀態就叫作可觀測狀態。
由於空氣溼度與天氣有關,所以咱們想要經過能夠觀測到的空氣溼度這一可觀測狀態序列來推測出將來三天的天氣狀態這一隱藏狀態序列。這類型的問題,就叫作隱馬可夫模型。
Python 的第三方的中文分詞工具 jieba,省去咱們在實際應用中省掉訓練分詞馬可夫模型的繁瑣步驟。而且,jieba 工具用的 HMM算 法與數據結構算法結合使用的方法,比直接單獨使用 HMM 來分詞效率高不少,準確率也高不少。
首先須要下載第三方的 jieba 工具庫:https://github.com/fxsjy/jieba
下面咱們就來經過例子看下 jieba 分詞的方法:
import jieba #全模式 string = '我來到北京清華大學' seg_list = jieba.cut(string, cut_all=True) #沒法直接顯示,若想要顯示,能夠下面這樣。用 ‘/’ 把生成器中的詞串起來顯示。這個方法在下面提到的精確模式和搜索引擎模式中一樣適用。 '/'.join(seg_list) #精確模式 seg_list = jieba.cut(string, cut_all=False) #搜索引擎模式 seg_list = jieba.cut_for_search(string)
jieba 在某些特定的狀況下來分詞,可能表現不是很好。好比一篇很是專業的醫學論文,含有一些特定領域的專有名詞。
不過,爲了解決此類問題, jieba 容許用戶本身添加該領域的自定義詞典,咱們能夠提早把這些詞加進自定義詞典當中,來增長分詞的效果。調用的方法是:jieba.load_userdic()
。
自定義詞典的格式要求每一行一個詞,有三個部分,詞語,詞頻(詞語出現的頻率),詞性(名詞,動詞……)。其中,詞頻和詞性可省略。用戶自定義詞典能夠直接用記事本創當即可,可是須要以 utf-8 編碼模式保存。 格式像下面這樣:
除了使用 jieba.load_userdic()
函數在分詞開始前加載自定義詞典以外,還有兩種方法在能夠在程序中動態修改詞典。
使用 add_word(word, freq=None, tag=None)
和 del_word(word)
可在程序中動態修改詞典。
使用 suggest_freq(segment, tune=True)
可調節單個詞語的詞頻,使其能(或不能)被分出來。
使用自定義詞典,有時候能夠取得更好的效果,例如「今每天氣不錯」這句話,本應該分出「今天」、「天氣」、「不錯」三個詞,而來看一下直接使用結巴分詞的結果:
string = '今每天氣不錯' #添加本身的詞 jieba.suggest_freq(('今天', '天氣'), True) seg_list = jieba.cut(string, cut_all=False) #從詞典中刪除詞語 jieba.del_word('今每天氣') #強制調高詞頻,使其分爲一個詞 jieba.add_word('臺中')