NLP-統計語言模型的平滑處理方法

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。


一、引言

NLP-統計語言模型中簡要介紹了統計語言模型的原理和實現方法,以bigram為例,計算了

$P(\color{green}{我,喜歡 ,自然語言 ,處理})=P(\color{green}{我})P(\color{green}{喜歡|我})P(\color{green}{自然語言|喜歡})*P(\color{green}{處理|自然語言})$

的概率,這是比較理想的情況,而現實與理想的差距是我們預測了一萬種可能,卻還有一萬零一種可能的存在。而我們企圖用已經存在的語料資料來覆蓋未來有可能出現的測試資料,未免有些天真。 還是以NLP-統計語言模型中的假設語料來舉例

  • 我 喜歡 大自然
  • 自然語言 是 如何 形成 的 呢
  • 如何 處理 資料 是 很 重要 的
  • 越來越多 的 人 喜歡 自然語言 處理

而我需要計算句子$\color{green}{我 喜歡 看電影}$的概率時:

$P(\color{green}{我,喜歡 ,看電影})=P(\color{green}{我})P(\color{green}{喜歡|我})P(\color{green}{看電影|喜歡})$

在語料庫中喜歡的後面並沒有出現過看電影,也就意味著$P(\color{green}{看電影|喜歡})=0$,直接導致了$\color{green}{我 喜歡 看電影}$的可能性為0,這顯然是不科學的,所以就需要一些平滑的處理方法,用以過渡上述情況。

二、add-k smoothing

add-k smoothing 是一種比較簡單的方式,為了防止出現概率為0的情況,對求概率的公式做了一點手腳,如下:

$$ P(w_n|w_{n-1})=\frac{w_n、w_{n-1}同時出現的次數+k}{語料庫中w_{n-1}出現的次數+k*詞庫大小} \tag{k=1,2,3...n} $$

為什麼是$k詞庫大小$呢,因為要確保概率的總和為1,具體過程此處不做推導。 add-k smoothing 是一種行之有效的方式,但其中也隱含著一種價值觀: 沒有出現的詞未來出現的可能性相等*,對於所有概率為0的情況,都是在分子和分母上做了同樣的操作,那麼就導致了這些情況的概率都一致,是否還有更加“公平”的一些方式呢?有,來看看interpolation smoothing。

三、interpolation smoothing

interpolation smoothing的思想在於求上不得而求其中,其中不足餘下來補,為了更好的說明interpolation 以trigram為例,假設我們要求$P(w_n|w_{n-1},w_{n-2})$,$P(w_n|w_{n-1},w_{n-2})$會等於0,那麼求$P(w_n|w_{n-1})$,再不濟還可以求$P(w_n)$,綜合上面三種情況,給每種情況分配不同的權重得:

$P(w_n|w_{n-1},w_{n-2})=\lambda_1 * P(w_n|w_{n-1},w_{n-2})+\lambda_2 * P(w_n|w_{n-1})+\lambda_3 * P(w_n)$ $\lambda_1+\lambda_2+\lambda_3=1$

此方法綜合unigram、bigram和trigram甚至可以更多,這樣就確保了語料庫未出現詞組合的概率的不一致,相對來說,公平了些。

四、good-turing smoothing

good-turing的核心思想在於,對於沒有出現的過的事件,不能認為該事件出現的概率為0,所以我們從已經發生的事件概率總量1中分配一個很小的比例給該事件。 這是一種很有前瞻性的格局,但是把概率分出去一分部以後,那未出現的事件+已經出現的事件的概率總和就會大於1,所以就需要把已經發生的事件的概率稍微調小一點,確保概率的總合為1,具體怎麼調整呢,先擺出公式再來解釋: 為了說明公式,先來認識一個概念:

$N_c:表示語料庫中出現了c次的詞有N_c個$ $N_1:表示語料庫中出現了1次的詞有N_1個$ $d_c:表示調整以後語料庫中出現了c次的詞的頻次$ $c:表示某個詞在語料庫中出現的頻次$

假設語料庫的大小為N,對於沒有出現過的詞,概率原本為0,那麼分一個語料庫中低頻事件的概率給它,比如,把語料庫中只出現只出現過一次的事件的概率給它:

$P(未出現詞)=0 =>P(未出現詞)=\frac{N_1}{N}$

對於已經出現過的詞,需要調整概率

$$P(出現的詞)=\frac{c}{N} =>P(出現的詞)=d_c\frac{1}{N}=\frac{(c+1)N_{c+1}}{N_cN} $$

至於公式為何是這樣,吳軍老師在《數學之美》中講解較好,感興趣的可以前去參考,此處不做過多解釋,本文著眼於如何利用成果解決問題。

看了公式可能有點蒙圈,還是根據語料庫來解釋一下 設語料來舉例

  • 自然語言 是 如何 形成 的 呢
  • 如何 處理 自然語言 是 很 重要 的
  • 是 又 如何

假設現在要根據語料庫計算計算的概率,而計算剛好沒有出現過,那麼

$P(計算)=\frac{N_1}{16}=\frac{6}{16} \tag{只出現過一次的詞有6個}$

此時,原先出現過的詞的概率需調整

$P(自然語言)=\frac{c}{N}=\frac{2}{16}=>\frac{(c+1)N_{c+1}}{N_cN}=\frac{(2+1)N_{2+1}}{N_2N}=\frac{3}{16}$

突然發現了神奇的一幕,調整以後概率還變大了,這是因為舉例的語料庫太小,很多地方不合理,在較大的語料庫中是不會出現這種情況的,拿漢字來說,常用的漢字的比例在總漢字中的比例是很小的,也就是c越大,$N_c$越小,那麼一般情況下$N_{c+1}<N_{c}$(具體證明參考齊夫定律),即概率調整後是減少的。

五、總結

本文簡單介紹一些在統計語言模型中需要的一些平滑過渡的方法,總體而言就是考慮未登入詞的情況,方法並非絕對,如果讀者還有更多的方法歡迎介紹。