基於理解的分詞方法
其基本思想是在分詞的同時進行句法、語義的分析,以此來處理歧義問題。
目前這種方法還處於實驗狀態
基於統計的分詞方法
基本思路
構建語言模型,對句子進行單詞划分,划分結果運用統計方法計算概率,獲取概率最大的分詞方式
N元語言模型(N-gram語言模型)
設\(z\)為字串,\(w\)為划分的詞串,\(s\)是一種划分。該分詞方法是以\(p(s)\)最大的分詞結果作為結果。
由於每個詞的概率都十分小,對於較長的字串,得到的每個結果的概率可能十分接近於0,計算機精度不夠,會影響概率的比較,可通過比較概率的負對數來比較大小。
這種方法可發現所有的切分歧義,它的成功率很大程度取決於統計語言模型的精度和決策算法。
概率怎么得到,肯定是要有樣本的,如果可以的話,以人類有史以來所有說過的話作為樣本肯定是最好的,但這不可能實現。
對於\(p(s)\),根據條件概率公式,有\(p(s)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1},w_{n-2},\cdots w_1)\)
這種計算方法對算力要求太高,對訓練數據要求十分大,不太可能實現,因此考慮建立模型。
馬爾可夫假設
俄國數學家馬爾可夫提出假設:任意一個詞\(w_i\)出現的概率只同它前面的一個詞\(w_{i-1}\)有關,這種假設稱為馬爾可夫假設。
即\(p(s)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1})\)
這樣求的方法就簡單多了。
而當我們假設\(w_i\)出現的概率和它前面的\(n\)個詞有關,就被稱為\(n\)元語言模型
代碼思路
用\(DFS\)不難實現,首先找到一個可行的划分,再計算概率,保存最大概率的結果,\(DFS\)途中可適當剪枝。
//代碼框架
void _find (int cur)//找划分,cur表示當前為第幾個詞
{
if (cur==n+1) calc();//對當前結果計算概率並保存
for (int i=cur;i<=n;++i)
if (check(cur,i)){//如果從cur到i形成一個詞
add(cur,i);//將該詞添加到當前划分
_find(i+1);
del();//刪掉這個詞
}
}
與詞性標注結合
這種方法的基本思想是在考慮分詞結果的概率的同時,還要考慮詞性,自然語言的詞性搭配是有規律的,將分詞結果的詞性搭配的概率也進行比較,從而反過來調整分詞,可極大的提高結果的准確性。