在最大概率法分詞的程序中,由於每個詞出現的次數分佈非常不均勻,而且我們要計算每個詞出現的概率,對於出現次數比較少的詞概率就很小,求句子中詞的概率之積的時候,需要將好多非常小的數作乘法,可能會將超出計算機所能表示的數的最小範圍。爲了便於計算,常常要將每個詞的概率求對數後在進行計算,但是由於對概率求對數後變爲負值,因此要求對應的相反數。所以一個詞出現的次數越多,最後求得對應的值越小,我們將這個值稱爲這個單詞的代價。單詞出現的次數越多,該單詞的代價越低;否則代價越高。
第一部分 公式推導
cost(S) = - log(s/M) (公式1)
爲了不至於詞的頻數懸殊過大,我們對所有的詞都乘以一個懲罰因子k,使詞的頻數同步的擴張或縮小,觀察k的取值對於分詞準確率的影響。因此,公式(1)就變爲:
cost(S) = - log(ks/M) (公式2)
現在來分析分詞的過程:
如果對於一個漢字串(例如:年前),可以分爲一個詞(即:年前),也可以分爲兩個詞(即:年/前),現在來分析什麼情況下會分爲兩個詞。在上面的例子中,假定用A、B、C分別代表如下內容:A爲“年”,B爲“前”,C爲“年前”。並且“年”和“前”出現的概率極低,“年前”出現概率較高。那麼,上面的例子中,漢字串有沒有可能被切分爲兩個詞呢?如前所述,最終分詞算法會選擇一種費用最低的切分方式。如果該字串要分爲兩個詞,則必須要滿足:
cost(A) + cost(B) < cost(C) (公式3)
其中A和B爲拆分後的字串,C爲未拆分的字串。若用a、b、c分別代表A、B、C的頻數,將公式2代入公式3,則有:
- log(ka/M) – log(kb/M) < - log(kc/M) (公式4)
將公式4展開:
- [ log(k) + log(a) – log(M) ] + - [ log(k) + log(b) – log(M) ] < - [ log(k) + log(c) – log(M) ]
整理:
log(M) – log(a) – log(b) – log(k) < - log(c)
即:
log(Mc/abk) < 0
也就是:
Mc < abk
亦即:
abk > Mc (公式5)
從公式5可以看出,在a、b、c和M的大小固定的情況下,只要k的值大於某一個數,公式5就成立,從而公式4和公式3成立。也就是說,當k的值大於一個確定的值的時候,漢字串會被拆爲A/B兩部分。
更復雜一點,對於下面的例子:“2日出生於”,只考慮其中的四個漢字,可以有下面兩種切分方式:“日/出生/於”和“日出/生於”。如果要切分爲三個詞,必須滿足如下的公式:
- log(ka/M) – log(kb/M) – log(kc/M) < - log(kp/M) – log(kq/M) (公式6)
展開,整理得:
abck > Mpq (公式7)
從公式7可以看出,即便是a、b、c遠遠低於於p、q的頻數,只要k的取值合適,總會有公式7成立,繼而公式6成立。因此上面的例子是有可能切分爲三個詞的。
觀察公式7,將公式兩邊都乘以k*k,得到:
abckkk > Mpqkk (公式8)
ak*bk*ck > M*pk*qk (公式9)
你看出了什麼規律?當對所有的單詞的頻數都乘以一個固定值的時候,頻數較少的詞也有可能是總體費用較低的。
更一般的情況,將公式9延伸到更多的詞,說明了什麼?
結論:
(1)隨着k值增大,程序有將句子切分爲更多的較短的詞的傾向。即使這些較短的詞出現的頻率並不多,但是詞的長度短意味着可以切出的詞的數量多。由於k的存在,每個詞都會獲得一定比例的權重加成,積少成多,衆多的詞的累積效應最終會超過出現次數較多但是較長的詞。通俗來說就是,雙拳難敵四手,哈哈。
第二部分 實例驗證
對語料選取200個句子進行測試,分別取懲罰係數k爲表中所列數字,測試結果如下:
序號 | 係數 | 準確率 | 召回率 | 交集型歧義 | 未登錄詞語 | 組合型歧義 | 總數 | 標準切分數目 | 切分得到數目 | 切分正確數目 |
1 | 0.1 | 95.26% | 98.98% | 10 | 255 | 44 | 309 | 5377 | 5587 | 5322 |
2 | 0.3 | 95.28% | 99.03% | 9 | 255 | 42 | 306 | 5377 | 5589 | 5325 |
3 | 0.5 | 95.30% | 99.07% | 8 | 255 | 42 | 305 | 5377 | 5590 | 5327 |
4 | 0.8 | 95.30% | 99.07% | 8 | 255 | 42 | 305 | 5377 | 5590 | 5327 |
5 | 1 | 95.28% | 99.07% | 9 | 255 | 41 | 305 | 5377 | 5591 | 5327 |
6 | 5 | 95.21% | 99.33% | 6 | 263 | 30 | 299 | 5377 | 5610 | 5341 |
7 | 10 | 94.85% | 99.42% | 6 | 284 | 25 | 315 | 5377 | 5636 | 5346 |
1.對上表的內容進行驗證:
(1)當k的值爲0.1、0.3、0.5、0.8和1.0時,有如下切分錯誤。當k的值爲5.0和10.0時,錯誤消失。組合型歧義: 半年 正確切分: 半/年 錯誤切分: 半年
組合型歧義: 身爲 正確切分: 身/爲 錯誤切分: 身爲
(2)當k的值爲0.1時,有如下切分錯誤。當k的值爲0.3、0.5、0.8、1.0、5.0和10.0時,錯誤消失。
組合型歧義: 不是 正確切分: 不/是 錯誤切分: 不是
(3)當k的值爲0.1、0.3時,有如下切分錯誤。當k的值爲0.5、0.8、1.0、5.0和10.0時,錯誤消失。
交集型歧義: 地表現在 正確切分: 地/表現/在 錯誤切分: 地表/現在
2.對上表內容的分析:
(1)組合型歧義
通過分析發現,出錯的組合型歧義都是類似於下面的形式,應該是將詞語切開而實際上沒有切開,通過增大k值,使一些類似的錯誤得到解決,但仍然有大部分沒有解決。理論上來講,只要k增大到一定程度,這些錯誤都可以解決,但是同時還有可能有其他的副作用,得不償失。
組合型歧義: 半年 正確切分: 半/年 錯誤切分: 半年
(2)未登錄詞語
出錯的未登錄詞語都是如下的形式,不該切分而進行了切分。是由於隨着k值的增大,把詞語切爲單字的代價已經小於保留爲詞語的代價了。加之這些詞本身的頻數又不太大,因此受k值的影響特別明顯。上表中當k=5和k=10時未登錄詞急劇增加就是這個原因。
未登錄詞語: 羅織 正確切分: 羅織 錯誤切分: 羅/織
(3)交集型歧義
某些特殊的交集型歧義是可以通過改變k值來解決的,比如上面的例子(正確和錯誤切分方式詞的數目不一樣)。但是多數的交集型歧義形式爲如下(正確和錯誤切分方式詞的數目一樣):
交集型歧義: 彩筆畫 正確切分: 彩筆/畫 錯誤切分: 彩/筆畫
假設有如下公式:
cost(A) + cost(B) < cost(C) + cost(D)
- log(ka/M) – log(kb/M) < - log(kc/M) - log(kd/M)最終化簡爲:
a + b > c + d (公式10)
觀察公式10,該公式和k值無關,因此不能通過改變k值的方式來消除這樣的交集型歧義。