自然語言的分詞方法之N-gram語言模型
基於理解的分詞方法
其基本思想是在分詞的同時進行句法、語義的分析,以此來處理歧義問題。
目前這種方法還處於實驗狀態
基於統計的分詞方法
基本思路
構建語言模型,對句子進行單詞劃分,劃分結果運用統計方法計算概率,獲取概率最大的分詞方式
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();//刪掉這個詞 } }
與詞性標註結合
這種方法的基本思想是在考慮分詞結果的概率的同時,還要考慮詞性,自然語言的詞性搭配是有規律的,將分詞結果的詞性搭配的概率也進行比較,從而反過來調整分詞,可極大的提高結果的準確性。