jieba结巴分词--关键词抽取_结巴中文分词原理分析2
作者:白寧超,工學碩士,現工作于四川省計算機研究院,著有《自然語言處理理論與實戰》一書,作者公眾號:機器學習和自然語言處理(公眾號ID:datathinks)
結巴分詞詳解1中文分詞介紹
中文分詞特點
詞是最小的能夠獨立活動的有意義的語言成分
漢語是以字位單位,不像西方語言,詞與詞之間沒有空格之類的標志指示詞的邊界
分詞問題為中文文本處理的基礎性工作,分詞的好壞對后面的中文信息處理其關鍵作用
中文分詞的難點?
分詞規范,詞的定義還不明確 (《統計自然語言處理》宗成慶)
歧義切分問題,交集型切分問題,多義組合型切分歧義等?
結婚的和尚未結婚的 =>?
結婚/的/和/尚未/結婚/的?
結婚/的/和尚/未/結婚/的
未登錄詞問題有兩種解釋:一是已有的詞表中沒有收錄的詞,二是已有的訓練語料中未曾出現過的詞,第二種含義中未登錄詞又稱OOV(Out of Vocabulary)。對于大規模真實文本來說,未登錄詞對于分詞的精度的影響遠超歧義切分。一些網絡新詞,自造詞一般都屬于這些詞。
漢語分詞方法
基于字典、詞庫匹配的分詞方法(基于規則)?
基于字符串匹配分詞,機械分詞算法。將待分的字符串與一個充分大的機器詞典中的詞條進行匹配。分為正向匹配和逆向匹配;最大長度匹配和最小長度匹配;單純分詞和分詞與標注過程相結合的一體化方法。所以常用的有:正向最大匹配,逆向最大匹配,最少切分法。實際應用中,將機械分詞作為初分手段,利用語言信息提高切分準確率。優先識別具有明顯特征的詞,以這些詞為斷點,將原字符串分為較小字符串再機械匹配,以減少匹配錯誤率,或將分詞與詞類標注結合。
基于詞頻度統計的分詞方法(基于統計)?
相鄰的字同時出現的次數越多,越有可能構成一個詞語,對語料中的字組頻度進行統計,基于詞的頻度統計的分詞方法是一種全切分方法。jieba是基于統計的分詞方法,jieba分詞采用了動態規劃查找最大概率路徑, 找出基于詞頻的最大切分組合,對于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法。
基于知識理解的分詞方法。?
該方法主要基于句法、語法分析,并結合語義分析,通過對上下文內容所提供信息的分析對詞進行定界,它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷。這類方法試圖讓機器具有人類的理解能力,需要使用大量的語言知識和信息。由于漢語語言知識的籠統、復雜性,難以將各種語言信息組織成機器可直接讀取的形式。因此目前基于知識的分詞系統還處在試驗階段。
分詞工具下載
hanllp jar包(http://download.csdn.net/download/lb521200200/9686915)
ik 分詞 5.0.0版本jar包(http://download.csdn.net/download/youyao816/9676084)
ik分詞 1.10.1版本jar包(http://download.csdn.net/download/youyao816/9676082)
IKAnalyzer所需的jar包(http://download.csdn.net/download/jingjingchen1014/9659225)
jieba分詞包(http://download.csdn.net/download/u014018025/9652341)
結巴分詞的算法策略?
基于前綴詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG)
采用了動態規劃查找最大概率路徑, 找出基于詞頻的最大切分組合
對于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法
結巴源碼組織形式
jieba?
|--?Changelog?
|--?extra_dict?
|?|--?dict.txt.big?
|?|--?dict.txt.small?
|?|--?idf.txt.big?
|?`--?stop_words.txt?
|--?jieba?
|?|--?analyse?
|?|?|--?analyzer.py?
|?|?|--?idf.txt?
|?|?|--?__init__.py?
|?|?|--?textrank.py?
|?|?`--?tfidf.py?
|?|--?_compat.py?
|?|--?dict.txt?
|?|--?finalseg?
|?|?|--?__init__.py?
|?|?|--?prob_emit.p?
|?|?|--?prob_emit.py?
|?|?|--?prob_start.p?
|?|?|--?prob_start.py?
|?|?|--?prob_trans.p?
|?|?`--?prob_trans.py?
|?|--?__init__.py?
|?|--?__main__.py?
|?`--?posseg?
|?|--?char_state_tab.p?
|?|--?char_state_tab.py?
|?|--?__init__.py?
|?|--?prob_emit.p?
|?|--?prob_emit.py?
|?|--?prob_start.p?
|?|--?prob_start.py?
|?|--?prob_trans.p?
|?|--?prob_trans.py?
|?`--?viterbi.py?
|--?LICENSE?
|--?setup.py?`--?test?
|--?*.py?
|--?parallel?
|?|--?extract_tags.py?
|?`--?test*.py?`--?userdict.txt
代碼行數統計(沒有統計test文件夾下的代碼)
256?./posseg/prob_start.py?
5307?./posseg/prob_trans.py?
304?./posseg/__init__.py?
89372?./posseg/prob_emit.py?
61087?./posseg/char_state_tab.py?
53?./posseg/viterbi.py
578?./__init__.py?
4?./finalseg/prob_start.py?
4?./finalseg/prob_trans.py?
107?./finalseg/__init__.py?
35226?./finalseg/prob_emit.py?
31?./_compat.py?
50?./__main__.py?
111?./analyse/tfidf.py?
37?./analyse/analyzer.py?
104?./analyse/textrank.py?
18?./analyse/__init__.py?
192649?總用量
其中prob*.py的文件是作者事先訓練好的模型參數(λ=(A,B,π)),如狀態轉移概率、發射概率等。真正的代碼數也就:304+53+578+107+31+50+111+37+104+18=1393行(不包括test文件中的代碼),當然作者的代碼寫的比較簡潔。
jieba分詞模型的參數數據(λ=(A,B,π))是如何生成的??
即文件finalseg/prob_*.py,中初始化概率,狀態轉移概率,發射概率怎么算出來的??
來源主要有兩個: 一個是網上能下載到的1998人民日報的切分語料還有一個msr的切分語料; 另一個是作者自己收集的一些txt小說,用ictclas把他們切分(可能有一定誤差)。 然后用python腳本統計詞頻?具體詳情。?
要統計的主要有三個概率表
位置轉換概率(狀態轉移概率),即B(開頭),M(中間),E(結尾),S(獨立成詞)四種狀態的轉移概率;?
位置到單字的發射概率,比如P(“和”|M)表示一個詞的中間出現”和”這個字的概率;?
詞語以某種狀態開頭的概率,其實只有兩種,要么是B,要么是S。
算法實現分詞?
(1)?基于前綴詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG);
作者這個版本中使用前綴字典實現了詞庫的存儲(即dict.txt文件中的內容),而棄用之前版本的trie樹存儲詞庫,想想也是,python中實現的trie樹是基于dict類型的數據結構而且dict中又嵌套dict 類型,這樣嵌套很深,導致內存耗費嚴重,詳情見作者把trie樹改成前綴詞典的?緣由, 具體實現見?gen_pfdict(self, f_name)。接著說DAG有向無環圖, 生成句子中漢字所有可能成詞情況所構成的有向無環圖。DAG根據我們生成的前綴字典來構造一個這樣的DAG,對一個sentence DAG是以{key:list[i,j…], …}的字典結構存儲,其中key是詞的在sentence中的位置,list存放的是在sentence中以key開始且詞sentence[key:i+1]在我們的前綴詞典中 的以key開始i結尾的詞的末位置i的列表,即list存放的是sentence中以位置key開始的可能的詞語的結束位置,這樣通過查字典得到詞, 開始位置+結束位置列表。
例如:句子“抗日戰爭”生成的DAG中{0:[0,1,3]} 這樣一個簡單的DAG, 就是表示0位置開始, 在0,1,3位置都是詞, 就是說0~0,0~1,0~3 即 “抗”,“抗日”,“抗日戰爭”這三個詞 在dict.txt中是詞。?
(2)采用了動態規劃查找最大概率路徑, 找出基于詞頻的最大切分組合;?
基于上面的DAG利用動態規劃查找最大概率路徑,這個理解DP算法的很容易就能明白了。根據動態規劃查找最大概率路徑的基本思路就是對句子從右往左反向計算最大概率,..依次類推, 最后得到最大概率路徑, 得到最大概率的切分組合(這里滿足最優子結構性質,可以利用反證法進行證明),這里代碼實現中有個小trick,概率對數(可以讓概率相乘的計算變成對數相加,防止相乘造成下溢,因為在語料、詞庫中每個詞的出現概率平均下來還是很小的浮點數).?
(3)對于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法;
未登錄詞(即jieba中文分詞源碼分析(一))中說的OOV, 其實就是詞典 dict.txt 中沒有記錄的詞。這里采用了HMM模型,HMM是個簡單強大的模型,可以參考這個網絡資源進行學習,HMM在實際應用中主要用來解決3類問題:
a. 評估問題(概率計算問題)?:即給定觀測序列 O=O1,O2,O3…Ot和模型參數λ=(A,B,π),怎樣有效計算這一觀測序列出現的概率. (Forward-backward算法)
b. 解碼問題(預測問題)?:即給定觀測序列 O=O1,O2,O3…Ot和模型參數λ=(A,B,π),怎樣尋找滿足這種觀察序列意義上最優的隱含狀態序列S。 (viterbi算法,近似算法)
c. 學習問題?:即HMM的模型參數λ=(A,B,π)未知,如何求出這3個參數以使觀測序列O=O1,O2,O3…Ot的概率盡可能的大. (即用極大似然估計的方法估計參數,Baum-Welch,EM算法)
模型的關鍵相應參數λ=(A,B,π),經過作者對大量語料的訓練, 得到了finalseg目錄下的三個文件(初始化狀態概率(π)即詞語以某種狀態開頭的概率,其實只有兩種,要么是B,要么是S。這個就是起始向量, 就是HMM系統的最初模型狀態,對應文件prob_start.py;隱含狀態概率轉移矩A 即字的幾種位置狀態(BEMS四個狀態來標記, B是開始begin位置, E是end, 是結束位置, M是middle, 是中間位置, S是single, 單獨成詞的位置)的轉換概率,對應文件prob_trans.py;觀測狀態發射概率矩陣B 即位置狀態到單字的發射概率,比如P(“狗”|M)表示一個詞的中間出現”狗”這個字的概率,對應文件prob_emit.py)。
4參考文獻中文分詞之HMM模型詳解
HMM相關文章
結巴分詞GitHub源碼
作者:白寧超,工學碩士,現工作于四川省計算機研究院,研究方向是自然語言處理和機器學習。曾參與國家自然基金項目和四川省科技支撐計劃等多個省級項目。著有《自然語言處理理論與實戰》一書。
作者博客官網:
https://bainingchao.github.io/
作者公眾號,歡迎關注:
機器學習和自然語言處理公眾號ID:datathinks總結
以上是生活随笔為你收集整理的jieba结巴分词--关键词抽取_结巴中文分词原理分析2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018年江苏省计算机小高考,江苏201
- 下一篇: c 子类对象 访问父类对象受保护成员_面