自然語言處理 盤點一下資料平滑演算法

2021-07-16 08:44:51 字數 4205 閱讀 2915

在自然語言處理中,經常要計算單詞序列(句子)出現的概率估計。我們知道,演算法在訓練時,語料庫不可能包含所有可能出現的序列。因此,為了防止對訓練樣本中未出現的新序列概率估計值為零,人們發明了好多改善估計新序列出現概率的演算法,即資料平滑演算法。

最簡單的演算法是laplace法則,思路很簡單,統計測試資料集中的元素在訓練資料集中出現的次數時,計數器的初始值不要設成零,而是設成1。這樣,即使該元素沒有在訓練集中出現,其出現次數統計值至少也是1。因此,其出現的概率估計值就不會是零了。

假設測試集

v 中某個元素在訓練集

t中出現

r 次,經過laplace法則調整後的統計次數為:r∗

=r+1

當然這樣做,純粹是為了不出現零概率,並沒有解決對未見過的例項進行有效**的問題。因此,laplace法則僅僅是一種非常初級的技術,有點太小兒科了。

laplace方法乙個很明顯的問題是 ∑r

∗≠∑r

。 good-turning 方法認為這是乙個重大缺陷,需要給予改進。其實我覺得這真不算重要,只要能合理估計未見過的新例項的概率,總的統計次數發生變化又怎樣呢?

good-turing 修正後的計算公式還真的很巧妙,它在laplace法則後面乘了乙個修正係數,就可以保證總次數不變。這個拿出來炫一炫還是沒問題的: r∗

=(r+

1)nr

+1nr

其中,nr

表示測試集

v 中,一共有nr

個元素在訓練集

t 中出現過 nr

次。雖然我覺得這個方法沒啥用,但是它的確保證了測試集中元素在訓練集中出現的總次數不變。即: n1

=∑r=

0∞rn

r=0×

n0+1

×n1+

2×n2

+...

n2=∑

r=0∞

r∗nr

=1×n

1n0×

n0+2

×n2n

1×n1

+...

=1×n

1+2×

n2+.

..顯然,n1

=n2 。或許這個方法解決不了自然語言處理問題,而且 nr

=0時公式也會失效,但其思路應該還是很有價值的,或許解決其他問題能用得上。

估計發明的作者受到 good-turing 的刺激了,認為這個方法就是「劫富濟貧」,把數量較大的統計次數拿出一部分均給了較小的統計次數,減少貧富差距。只不過這個方法用了乙個很有技巧的公式掩蓋的其本質。

與其羞羞答答「劫富濟貧」,不如來個赤裸裸的方法,於是乎就出現了絕對折扣和線性折扣方法。

問題是,「劫富濟貧」並不是我們的目的,我們需要的是能夠對語料庫中從未出現過的句子做出概率判斷。要得到正確的判斷,需要「劫」多少?「濟」多少?這個問題絕對折扣和線性折扣都回答不了。所以,無論good-turing方法,還是這兩種折扣方法,本質上都沒跳出 laplace 法則的思路。

witten-bell演算法終於從 laplace 演算法跳了出來,有了質的突破。這個方法的基本思想是:如果測試過程中乙個例項在訓練語料庫中未出現過,那麼他就是乙個新事物,也就是說,他是第一次出現。那麼可以用在語料庫中看到新例項(即第一次出現的例項)的概率來代替未出現例項的概率。

假設詞彙在語料庫出現的次數參見下表:

r

1234

5nr50

4030

2010 則

n=1×

50+2×

40+3×

30+4×

20+5×

10=350t=50

+40+30

+20+10

=150

那麼,我們可以用 tn

+t=150

350+

150=

0.3

近似表示在語料庫看到新詞彙的概率。

我不能說這個方法有多少道理,但與那些「劫富濟貧」的方法相比,它至少提供了乙個說得過去的理由。

扣留估計和交叉檢驗這兩種方法估計是受到witten-bell演算法啟發了,但是思路沒跳出該方法套路,而且手法比較卑劣。和witten-bell演算法一樣,對於所有遇到的新事物,都給出完全相同的概率**。

前面的平滑演算法對於從來沒出現的n-gram都給與相同的概率估計,有些情況下這並不合適。事實上我們可以考慮根據n-gram中的(n-1)gram的頻率產生乙個更好的概率估計。如果 (n-1)gram很少出現,就給n-gram乙個較小的估計,反之給出乙個較大的估計。

例如,假定要在一批語料庫上構建二元語法模型,其中有兩對詞的同現次數為0: c(

send

the)

=0c(

send

thou

)=0

那麼,按照前面提到的任何一種平滑方法都可以得到: p(

the|

send

)=p(

thou

|sen

d)但是,直覺上我們認為應該有 p(

the|

send

)>p(

thou

|sen

d)因為冠詞the要比單詞thou出現的頻率要高得多。因此,可以通過組合不同資訊資源的方法來產生乙個更好的模型。

一般來講,使用低階的n元模型向高階n元模型插值是有效的,因為當沒有足夠的語料估計高階模型時,低階模型往往可以提供有用的資訊。例如,bigram模型中的刪除插值法,最基本的做法是: pi

nter

p(wi

|wi−

1)=λ

pml(

wi|w

i−1)

+(1−

λ)pm

l(wi

),0≤

λ≤1

由於 pml

(the

|sen

d)=p

ml(t

hou|

send

)=0

而且 pml

(the

)≫pm

l(th

ou)

所以 pin

terp

(the

|sen

d)>pi

nter

p(th

ou|s

end)

在統計自然語言處理中,這種方法通常被稱為線性插值法(linear interpolation),在其他的地方常常被稱為混合模型(mixture model)。插值模型的遞迴定義如下:pi

nter

p(wi

|wi−

(n−1

)...

wi−1

)=λp

ml(w

i|wi

−(n−

1)..

.wi−

1)+(

1−λ)

pint

erp(

wi|w

i−(n

−2).

..wi

−1)

對於三元模型,有 pi

nter

p(wi

|wi−

(n−1

)...

wi−1

)=λp

ml(w

i|wi

−(n−

1)..

.wi−

1)+(

1−λ)

pint

erp(

wi|w

i−1)

對於二元模型,有   pi

nter

p(wi

|wi−

1)=λ

pml(

wi|w

i−1)

+(1−

λ)pm

l(wi

) 於是, pi

nter

p=..

.=λ3

pml(

wi|w

i−2w

i−1)

+λ2p

ml(w

i|wi

−1)+

λ1pm

l(wi

),λ1

+λ2+

λ3=1

katz方法也是一種插值方法,不過它僅對語料庫中未出現的資料進行**。

總起來說,這類插值方法與傳統數學中用已知資料插值**未知資料的方法思路相同,屬於比較靠譜的方法。

[1] 陳鄞,自然語言處理基本理論和方法,哈爾濱工業大學出版社, 第1版 (2023年8月1日)

自然語言處理基礎(4) 資料平滑技術

n元語法模型中,在統計結果中出現了零概率事件反映語言的規律性,即這種現象本來就不該出現,但更多的時候是由於語言模型的訓練文字t的規模以及其分布存在著一定的侷限性和片面性。這就是所謂的 資料稀疏 問題。所謂 資料平滑技術 是指為了產生更準確的概率來調整最大似然估計的技術,基本思想就是提高低概率 如零概...

python自然語言處理(一)

1.從nltk的book模組載入所有東西 fromnltk.book import 2.詞語索引檢視。顯示乙個指定單詞的每一次出現,連同上下文一起顯示。text1.concordance monstrous 3.通過索引看到monstrous上下文中有the pictures和the size,查詢...

自然語言處理隨筆(一)

安裝jieba中文分詞命令 pip install jieba 簡單的例子 import jieba seg list jieba.cut 我來到北京清華大學 cut all true print full mode join seg list 全模式 seg list jieba.cut 我來到北...