【Python自然语言处理】中文分词技术——统计分词
中文分詞方法
本文參考自書籍《Python自然語言處理實戰(zhàn):核心技術(shù)與算法》
用做個人的學習筆記和分享
1. 規(guī)則分詞
規(guī)則分詞的詳細筆記
2. 統(tǒng)計分詞
2.1 一般步驟
2.2 語言模型
語言模型的形式化描述:
長度為m的字符串的概率分布:
P(w1,w2,...,wm)=P(w1)P(w2∣w1)P(w3∣w1,w2)...P(wm∣w1,w2,...,wm?1)(1)P(w_1,w_2,...,w_m)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_m|w_1,w_2,...,w_{m-1}) \tag{1}P(w1?,w2?,...,wm?)=P(w1?)P(w2?∣w1?)P(w3?∣w1?,w2?)...P(wm?∣w1?,w2?,...,wm?1?)(1)
其中w1w_1w1?到wmw_mwm?依次表示文本中的各個詞語,采用鏈式法則計算概率值。
n-gram模型:文本過長,計算難度大,可忽略距離大于等于n的上文詞的影響:
P(wi∣w1,w2,...,wi?1)≈P(wi∣wi?(n?1),...,wi?1)(2)P(w_i|w_1,w_2,...,w_{i-1})≈P(w_i|w_{i-(n-1)},...,w_{i-1}) \tag{2}P(wi?∣w1?,w2?,...,wi?1?)≈P(wi?∣wi?(n?1)?,...,wi?1?)(2)
一元模型:n=1,在一元語言模型中,整個句子的概率等于各個詞語概率的乘積。言下之意就是各個詞之間都是相互獨立的,這無疑是完全損失了句中的詞序信息。所以一元模型的效果并不理想:
P(w1,w2,...,wm)=P(w1)P(w2)...P(wm)(3)P(w_1,w_2,...,w_m)=P(w_1)P(w_2)...P(w_m) \tag{3}P(w1?,w2?,...,wm?)=P(w1?)P(w2?)...P(wm?)(3)
二元模型:n=2,式(2)變?yōu)?#xff1a;
P(wi∣w1,w2,...,wi?1)≈P(wi∣wi?1)(4)P(w_i|w_1,w_2,...,w_{i-1})≈P(w_i|w_{i-1}) \tag{4}P(wi?∣w1?,w2?,...,wi?1?)≈P(wi?∣wi?1?)(4)
三元模型:n=3,式(2)變?yōu)?#xff1a;
P(wi∣w1,w2,...,wi?1)≈P(wi∣wi?2,wi?1)(5)P(w_i|w_1,w_2,...,w_{i-1})≈P(w_i|w_{i-2},w_{i-1}) \tag{5}P(wi?∣w1?,w2?,...,wi?1?)≈P(wi?∣wi?2?,wi?1?)(5)
當n≥2 時,該模型是可以保留一定的詞序信息的,而且n 越大,保留的詞序信息越豐富,但計算成本也呈指數(shù)級增長。
一般使用頻率計數(shù)的比例來計算n 元條件概率,如式(6)所示:
P(wi∣wi?(n?1),...,wi?1)=count(wi?(n?1),...,wi?1,wi)count(wi?(n?1),...,wi?1)(6)P(w_i|w_{i-(n-1)},...,w_{i-1}) = \frac{count(w_{i-(n-1),...,w_{i-1},w_i})}{count(w_{i-(n-1)},...,w_{i-1})} \tag{6}P(wi?∣wi?(n?1)?,...,wi?1?)=count(wi?(n?1)?,...,wi?1?)count(wi?(n?1),...,wi?1?,wi??)?(6)
當n越大時,模型包含的詞序信息越豐富,同時計算量隨之增大。與此同時,長度越長的文本序列出現(xiàn)的次數(shù)也會減少,如按照公式( 3.3 )估計n 元條件概率時,就會出現(xiàn)分子分母為零的情況。因此,一般在n 元模型中需要配合相應的平滑算法解決該問題,如拉普拉斯平滑算法等。
2.3 隱馬爾可夫模型(HMM)
基本思路:每個字在構(gòu)造一個特定的詞語時都占據(jù)著一個確定的構(gòu)詞位置( 即詞位),
現(xiàn)規(guī)定每個字最多只有四個構(gòu)詞位置:即B (詞首)、M (詞中)、E (詞尾)和s (單獨成詞),那么下面句子①的分詞結(jié)果就可以直接表示成如②所示的逐字標注形式:
①中文/文本處理/需要/進行/中文/分詞/。
②中/B文/E文/B本/M處/M理/E需/B要/E/進/B行/E中/B文/E/分/B詞/E。/S
形式化描述:
句子:λ=λ1λ2...λnλ=λ_1λ_2...λ_nλ=λ1?λ2?...λn?
標簽:σ=σ1σ2...σnσ=σ_1σ_2...σ_nσ=σ1?σ2?...σn?
KaTeX parse error: \tag works only in display equations
其中λiλ_iλi?是字,n為句長,σ∈{B,M,E,S}
P(σ|λ)是關(guān)于2n個變量的條件概率,n不固定,無法對P(σ|λ)進行精確計算,故引入觀測獨立性假設:每個字的輸出僅與當前字有關(guān)。
P(σ1σ2...σn∣λ1λ2...λn)=P(σ1∣λ1)P(σ2∣λ2)...P(σn∣λn)(8)P(σ_1σ_2...σ_n|λ_1λ_2...λ_n) = P(σ_1|λ_1)P(σ_2|λ_2)...P(σ_n|λ_n) \tag{8}P(σ1?σ2?...σn?∣λ1?λ2?...λn?)=P(σ1?∣λ1?)P(σ2?∣λ2?)...P(σn?∣λn?)(8)
觀察獨立性假設存在的問題:完全沒有考慮上下文,且會出現(xiàn)不合理的情況。比如按照之前設定的B 、M 、E 和S 標記,正常來說B后面只能是M或者E ,然而基于觀測獨立性假設,我們很可能得到諸如BBB 、BEM 等的輸出,顯然是不合理的。
HMM通過貝葉斯公式求解P(σ|λ)
P(σ∣λ)=P(σ,λ)P(λ)=P(λ∣σ)P(σ)P(λ)(9)P(σ|λ)=\frac{P(σ,λ)}{P(λ)}=\frac{P(λ|σ)P(σ)}{P(λ)} \tag{9}P(σ∣λ)=P(λ)P(σ,λ)?=P(λ)P(λ∣σ)P(σ)?(9)
λ為給定的輸入,因此P(λ)計算為常數(shù),可以忽略,因此最大化P(σ|λ)等價于最大
化P(λ|σ)P(σ)。
對P(λ|σ)P(σ)做馬爾可夫假設:
P(λ∣σ)=P(λ1∣σ1)P(λ2∣σ2)...P(λn∣σn)(10)P(λ|σ)=P(λ_1|σ_1)P(λ_2|σ_2)...P(λ_n|σ_n) \tag{10}P(λ∣σ)=P(λ1?∣σ1?)P(λ2?∣σ2?)...P(λn?∣σn?)(10)
P(σ)=P(σ1)P(σ2∣σ1)P(σ3∣σ1,σ2)???P(σn∣σ1,σ2,…,σn?1(11)P(σ) = P(σ_1)P(σ_2|σ_1)P(σ_3|σ_1,σ_2)···P(σ_n|σ_1,σ_2,…,σ_{n-1}\tag{11}P(σ)=P(σ1?)P(σ2?∣σ1?)P(σ3?∣σ1?,σ2?)???P(σn?∣σ1?,σ2?,…,σn?1?(11)
HMM做齊次馬爾可夫假設:
P(σ)=P(σ1)P(σ2∣σ1)P(σ3∣σ2)...P(σn∣σn?1)(12)P(σ)=P(σ_1)P(σ_2|σ_1)P(σ_3|σ_2)...P(σ_n|σ_{n-1}) \tag{12}P(σ)=P(σ1?)P(σ2?∣σ1?)P(σ3?∣σ2?)...P(σn?∣σn?1?)(12)
綜上所述:
P(λ∣σ)P(σ)~P(λ1∣σ1)P(σ2∣σ1)P(λ2∣σ2)P(σ3∣σ2)...P(σn∣σn?1)P(λn∣σn)P(λ|σ)P(σ)~P(λ_1|σ_1)P(σ_2|σ_1)P(λ_2|σ_2)P(σ_3|σ_2)...P(σ_n|σ_{n-1})P(λ_n|σ_n)P(λ∣σ)P(σ)~P(λ1?∣σ1?)P(σ2?∣σ1?)P(λ2?∣σ2?)P(σ3?∣σ2?)...P(σn?∣σn?1?)P(λn?∣σn?)
其中P(λk∣σk)P(λ_k|σ_k)P(λk?∣σk?)式發(fā)射概率,P(σk∣σk?1)P(σ_k|σ_{k-1})P(σk?∣σk?1?)是轉(zhuǎn)移概率,設置P(σk∣σk?1)=0P(σ_k|σ_{k-1})=0P(σk?∣σk?1?)=0可以排除BBB、EM等不合理的組合。
求解maxP(λ|σ)P(σ):常用Veterbi算法,算法效率O(n?l2)O(n*l^2)O(n?l2),l為候選數(shù)目最多的節(jié)點σiσ_iσi?的候選數(shù)目,與n成正比。
Veterbi算法:是一種動態(tài)規(guī)劃方法,核心思想是:如果最終的最優(yōu)路徑經(jīng)過某個σiσ_iσi?,那么從初始節(jié)點到σi?1σ_{i-1}σi?1?點的路徑必然也是一個最優(yōu)路徑一一因為每一個節(jié)點σiσ_iσi?只會影響前后兩個P(σi?1∣σi)P(σ_{i-1}|σ_{i})P(σi?1?∣σi?)和P(σi∣σi+1)P(σ_i|σ_{i+1})P(σi?∣σi+1?)。
HMM狀態(tài)轉(zhuǎn)移示意圖如下圖所示:
2.4 HMM的Python實現(xiàn)
S 、B 、E 、M ),以及存取概率計算的中間文件。
2.5 其他統(tǒng)計分詞算法
條件隨機場CRF:基于馬爾可夫思想的統(tǒng)計模型。在隱含馬爾可夫中,有個很經(jīng)典的假設,那就是每個狀態(tài)只與它前面的狀態(tài)有關(guān)。這樣的假設顯然是有偏差的,于是學者們提出了條件隨機場算法,使得每個狀態(tài)不止與他前面的狀態(tài)有關(guān),還與他后面的狀態(tài)有關(guān)。
神經(jīng)網(wǎng)絡分詞算法:深度學習方法在NLP 上的應用。通常采用CNN 、LSTM 等深度學習網(wǎng)絡自動發(fā)現(xiàn)一些模式和特征,然后結(jié)合C RF , softmax 等分類算法進行分詞預測。
2.6 總結(jié)
對比機械分詞法,這些統(tǒng)計分詞方法不需耗費人力維護詞典,能較好地處理歧義和未登錄詞,是目前分詞中非常主流的方法。但其分同的效果很依賴訓練語料的質(zhì)量,且計算量相較于機械分詞要大得多。
總結(jié)
以上是生活随笔為你收集整理的【Python自然语言处理】中文分词技术——统计分词的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文笔记(Neural Graph Co
- 下一篇: 抑制过拟合之正则化与Dropout