最大概率法分詞中詞頻懲罰因子的作用探究


        在最大概率法分詞的程序中,由於每個詞出現的次數分佈非常不均勻,而且我們要計算每個詞出現的概率,對於出現次數比較少的詞概率就很小,求句子中詞的概率之積的時候,需要將好多非常小的數作乘法,可能會將超出計算機所能表示的數的最小範圍。爲了便於計算,常常要將每個詞的概率求對數後在進行計算,但是由於對概率求對數後變爲負值,因此要求對應的相反數。所以一個詞出現的次數越多,最後求得對應的值越小,我們將這個值稱爲這個單詞的代價。單詞出現的次數越多,該單詞的代價越低;否則代價越高。

第一部分 公式推導

        假設:單詞S出現的頻數爲s,詞典中所有單詞出現的總數爲M,則單詞S的代價爲:
                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的存在,每個詞都會獲得一定比例的權重加成,積少成多,衆多的詞的累積效應最終會超過出現次數較多但是較長的詞。通俗來說就是,雙拳難敵四手,哈哈。

        (2)隨着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值的方式來消除這樣的交集型歧義。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章