Python自然語言處理之分詞原理

2021-08-20 19:24:59 字數 2711 閱讀 7371

入坑自然語言處理,最基本的就是要做文字挖掘,而首先要做的就是文字的預處理。自然語言處理的主要流程可以表示為:

文字->分句->分詞->詞性標註->短語分析->句法分析->語義分析->語篇分析->理解

分句這部分一般有標點符號分割,便於處理。於是首先要做的就是分詞。英文單詞天然有空格隔開容易按照空格分詞,但是也有時候需要把多個單詞做為乙個分詞,比如一些名詞如「new york」,需要做為乙個詞看待。而中文由於沒有空格,分詞就是乙個需要專門去解決的問題了。無論是英文還是中文,分詞的原理都是類似的,本文就對文字挖掘時的分詞原理做乙個總結。

現代分詞都是基於統計的分詞,而統計的樣本內容來自於一些標準的語料庫。從統計學角度考慮,如果有乙個句子s,它有m種分詞選項如下:

其中下標ni代表第i種分詞的詞個數。如果我們從中選擇了最優的第r種分詞方法,那麼這種分詞方法對應的統計分布概率應該最大,即:

但是我們的概率分布p(ai1,ai2,...,aini)並不好求出來,因為它涉及到ni個分詞的聯合分布。在nlp中,為了簡化計算,我們通常使用馬爾科夫假設,即每乙個分詞出現的概率僅僅和前乙個分詞有關,即:

而通過我們的標準語料庫,我們可以近似的計算出所有的分詞之間的二元條件概率,比如任意兩個詞w1,w2,它們的條件概率分布可以近似的表示為:

其中freq(w1,w2)表示w1,w2在語料庫中相鄰一起出現的次數,而其中freq(w1),freq(w2)分別表示w1,w2在語料庫中出現的統計次數。

利用語料庫建立的統計概率,對於乙個新的句子,我們就可以通過計算各種分詞方法對應的聯合分布概率,找到最大概率對應的分詞方法,即為最優分詞。

當然,你會說,只依賴於前乙個詞太武斷了,我們能不能依賴於前兩個詞呢?即:

這樣也是可以的,只不過這樣聯合分布的計算量就大大增加了。我們一般稱只依賴於前乙個詞的模型為二元模型(bi-gram model),而依賴於前兩個詞的模型為三元模型。以此類推,我們可以建立四元模型,五元模型,...一直到通用的n元模型。越往後,概率分布的計算複雜度越高。當然演算法的原理是類似的。

在實際應用中,n一般都較小,一般都小於4,主要原因是n元模型概率分布的空間複雜度為o(|v|n),其中|v|為語料庫大小,而n為模型的元數,當n增大時,複雜度呈指數級的增長。

n元模型的分詞方法雖然很好,但是要在實際中應用也有很多問題,首先,某些生僻詞,或者相鄰分詞聯合分布在語料庫中沒有,概率為0。這種情況我們一般會使用拉普拉斯平滑,即給它乙個較小的概率值,這個方法在樸素貝葉斯演算法原理小結也有講到。第二個問題是如果句子長,分詞有很多情況,計算量也非常大,這時我們可以用下一節維特比演算法來優化演算法時間複雜度。

維特比演算法採用的是動態規劃來解決這個最優分詞問題的,動態規劃要求區域性路徑也是最優路徑的一部分,很顯然我們的問題是成立的。首先我們看乙個簡單的分詞例子:"人生如夢境"。它的可能分詞可以用下面的概率圖表示:

圖中的箭頭為通過統計語料庫而得到的對應的各分詞位置bems(開始位置,結束位置,中間位置,單詞)的條件概率。比如p(生|人)=0.17。有了這個圖,維特比演算法需要找到從start到end之間的一條最短路徑。對於在end之前的任意乙個當前區域性節點,我們需要得到到達該節點的最大概率δ,和記錄到達當前節點滿足最大概率的前一節點位置ψ。

我們先用這個例子來觀察維特比演算法的過程。首先我們初始化有:

δ(人)=0.26      ψ(人)=start

δ(人生)=0.44      ψ(人生)=start

對於節點"生",它只有乙個前向節點,因此有:

δ(生)=δ(人)p(生|人)=0.0442         ψ(生)=人

對於節點"如",就稍微複雜一點了,因為它有多個前向節點,我們要計算出到「如」概率最大的路徑:

δ(如)=max=max=0.3168         ψ(如)=人生

類似的方法可以用於其他節點如下:

δ(如夢)=δ(人生)p(如夢|人生)=0.242        ψ(如夢)=人生

δ(夢)=δ(如)p(夢|如)=0.1996             ψ(夢)=如

δ(境)=max=max=0.0359         ψ(境)=夢

δ(夢境)=δ(夢境)p(夢境|如)=0.1585       ψ(夢境)=如

最後我們看看最終節點end:

δ(end)=max=max=0.0396      ψ(end)=夢境

由於最後的最優解為「夢境」,現在我們開始用ψ反推:

ψ(end)=夢境→ψ(夢境)=如→ψ(如)=人生→ψ(人生)=start

從而最終的分詞結果為"人生/如/夢境"。是不是很簡單呢。

對於文字挖掘中需要的分詞功能,一般我們會用現有的工具。簡單的英文分詞不需要任何工具,通過空格和標點符號就可以分詞了,而進一步的英文分詞推薦使用nltk。對於中文分詞,則推薦用結巴分詞(jieba)。這些工具使用都很簡單。你的分詞沒有特別的需求直接使用這些分詞工具就可以了。

以上~

自然語言處理 結巴分詞

jieba分詞的三種模式的對比 import jieba text 在精確模式的基礎上對長詞再次劃分提高召回率 text list jieba.cut text,cut all true print 全模式 print join text list print 精確模式 text list jieb...

自然語言處理 漢語分詞

nlpir ictclas 漢語分詞系統 pynlpir 是該漢語分詞系統的 python 封裝版 安裝步驟 pip install pynlpir pynlpir update 官方文件的漢語分詞示例 import pynlpir pynlpir.open str 歡迎科研人員 技術工程師 企事業...

自然語言處理 中文分詞原理

1.1中文分詞概述 中文分詞 將乙個漢字序列分成乙個乙個的單獨的詞。分詞 將連續的字序列按照一定的規範重新組合成詞序列的過程。1.2中文分詞方法 一般有以下三類 基於詞典匹配的分詞方法 基於理解的分詞方法和基於統計的分詞方法。1.2.1 基於詞典 字串匹配 機械分詞法 匹配的分詞方法 按照一定的策略...