三大基礎基礎技術
寫在前面
本文大量參考了《Python自然語言處理實戰:核心技術與算法》一書。這本書代碼託管在github上,地址是https://github.com/nlpinaction/learning-nlp 。此外,本文使用中文分詞工具——jieba(結巴)分詞來實現大部分算法。jieba分詞的官網網址爲:https://github.com/fxsjy/jieba文中若有錯誤之處,希望大家指出,我必定有則改之,無則加勉。有什麼疑問,歡迎與我交流。
名詞解釋
- 前綴詞典:從前一個字出發向後搜索以這個字開頭形成的所有詞,以這種方式遞推所形成的詞典被稱爲前綴詞典。
- 有向無環圖:以前綴詞典這種方式形成的,以詞爲邊,詞與詞之間的相鄰關係爲邊的所形成的是一個有向無環圖。
- 動態規劃:用於尋找有向無環圖中兩節點之間的最短路徑
- Viterbi算法:Viterbi算法是一種基於動態規則的用於求隱含馬爾科夫模型(HMM)的最優解;
- 未登錄詞:未記錄在詞典中的詞。可以通過用戶詞典引入未登陸詞。
一、 中文分詞
1.1 三類分詞方法
(1)規則分詞:建立詞庫,匹配切分。
匹配切分三大算法
- 最大正向切分(Maximum Match Method,MM法):從前向後匹配最長詞詞彙。
- 逆向最大匹配法(Reserve Maximum Match Method,RMM法):從後往前匹配最長詞彙。(倒排列處理->正向最大匹配)
- 雙向最大匹配法:比較最大正向切分與最大逆向切分的結果,按照最大匹配原則取最長詞彙,使切分後總次數最小。
(2)統計分詞
- 隱含馬爾科夫模型(HMM):隱含馬爾科夫模型(HMM)是將分詞任務看作每個字在字符串中的序列標註任務來實現的。每個字在構造特定詞語時都有一個特定的構詞位置(詞位):每個字在字符串中僅有四個位置:B(詞首)、M(詞中)、E(詞尾)和S(單獨成詞)。且假定每個詞的狀態(詞位)僅與前一個詞的狀態(詞位)有關。
- 條件隨機場(CRF):條件歲機場(CRF)與隱含馬爾科夫模型類似。區別在於假定每個字的狀態(詞位)不僅與前一個字的狀態(詞位)有關,還與後一個詞的狀態(詞位)有關。
- 模型求解算法-Viterbi算法:基於動態規劃,求模型的最大概率路徑。
- 其他統計分詞算法:基於神經網絡的分詞算法。使用PaddlePaddle(飛槳)實現。
(3)混合分詞
顧名思義,混合分詞是結合多種分詞算法的分詞方法。其中最長用的是先基於規則分詞,在使用統計分詞算法對分類結果進行補充,特別是對未登錄詞和歧義詞進行補充和修正。jieba(結巴)分詞就是採用的這種方法。
1.2 中文分詞工具:jieba分詞
1.2.1 算法簡介
jieba.cut()參數
(1) 需要分詞的字符串;
(2) cut_all:是否採用全模式
(3) HMM:是否使用HMM模型;
(4) use_paddle:是否使用paddlepaddle(飛槳)。
注: jieba.cut()返回一個generator迭代器;jieba.lcut()返回一個list列表
1.2.2 三種分詞模式
(1)全模式 :把所有可以成詞的詞語都列出來。
import jieba
text="這是一段用來測試的文本。"
#全模式
result=jieba.cut(text,cut_all=True,HMM=True,use_paddle=False)
(2)精確模式:把句子精確地切分開。
import jieba
text="這是一段用來測試的文本。"
#全模式
result=jieba.cut(text,cut_all=False)
(3)搜索引擎模式:在精確模式的基礎上,對長詞再切分。
import jieba
text="這是一段用來測試的文本。"
#全模式
result=jieba.cut_for_search(text,cut_all=False)
(4)paddle模式:使用paddlepaddle(飛槳)訓練序列標註(雙向GRU)實現分詞
二、 詞性標註
詞性標註本質也是一個序列標註問題。因此用於中文分詞的算法同樣適用於詞性標註任務。
三、命名實體識別
四、總結(總結是重點)
中文分詞、詞性標註和命名實體識別是自然語言處理的基礎技術,任何中文自然語言任務都必須對文本進行以上三不操作才能進行後續的分析處理。三者的關係非常緊密,所用的的算法和理論相互貫通。即三者的實質均爲每個字在字符串中的序列標註問題。任何一個步驟處理效果的好壞都會影響到其他兩個。