本文檔翻譯自
srilm手冊
ngram-discount.7.html
NAME
ngram-discount – 這裏主要說明
srilm中實現的平滑算法
NOTATION
a_z 表明以
a爲起始詞,以
z爲結束詞的
ngram,其中
_表明
0個或多個詞
p(a_z) 前
n-1個詞爲
a_的狀況下,第
n個詞爲
z的條件機率
a_ n元
a_z的前
n-1個詞構成的前綴
_z n元
a_z的後
n-1個詞構成的後綴
c(a_z) n元
a_z在訓練語料中出現的次數
n(*_z) 符合
*_z這一模式的獨立
n元數目,「
*_z」中‘
*’表明通配符
n1,n[1] 出現次數爲
1的
ngram數目
DESCRIPTION
Ngram語言模型主要用於估計前
n-1詞爲
a_的狀況下,第
n個詞爲
z的機率,即機率
Pr(z|a_),爲簡單起見,通常使用
P(a_z)表示。估算機率最直接的方式就是分別在訓練集中統計
c(a_z)和
c(a_),而後求以下公式,即獲得相關機率運算結果:
(
1)
p(a_z) = c(a_z)/c(a_)
如上的機率估算方法又稱爲最大似然估計方法。該方法比較直觀易懂,但存在一個不足點就是對於語料中不存在的
n元,其機率估算結果將爲
0。爲了不該狀況的發生,能夠經過將觀察到的
ngram一部分機率分佈出去,並將這部分機率值分配到未觀察到的
ngram上。這種機率從新分配方式即爲一般所說的平滑
(smoothing)或折扣
(discounting)。
大部分平滑算法均可以使用以下公式來表示
(
2)
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z)
若
ngram a_z在訓練集中發生了,則直接使用機率
f(a_z),該機率值通常都小於最大似然估計機率值結果,這樣留下的一部分機率值可用於訓練語料中未覆蓋到的
n元
a_*。不一樣的平滑算法區別主要在於採用何種折扣方法對最大似然估計結果進行折扣。
應用公式(
2)計算機率
p(a_z)時,若
ngram a_z在訓練語料中沒有出現,則直接使用低階機率分佈
p(_z)
,若歷史
a_在訓練語料中沒有出現,即
c(a_) = 0,這時能夠直接使用
p(_z)做爲當前
ngram的機率值,即
bow(a_) = 1;不然須要將
bow(a_)乘到
p(_z)上,以保證機率分佈的歸一性,即:
Sum_z p(a_z) = 1
假設
Z爲詞典中全部詞構成的集合,
Z0爲詞典中全部知足條件
c(a_z) = 0的詞構成的集合,
Z1爲詞典中全部知足條件
c(a_z) > 0的詞構成的集合。在
f(a_z)計算好的狀況下,
bow(a_)能夠經過以下方式估算獲得:
(3) Sum_Z p(a_z) = 1
Sum_Z1 f(a_z) + Sum_Z0 bow(a_) p(_z) = 1
bow(a_) = (1 - Sum_Z1 f(a_z)) / Sum_Z0 p(_z)
= (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 p(_z))
= (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z))
上式中分母
Sum_Z0 p(_z)表明在歷史「
_」條件下,全部知足條件
c(a_z) = 0的詞機率之和,而
Z1爲詞典中全部知足條件
c(a_z) > 0的詞構成的集合,所以存在以下的關係
Sum_Z0 p(_z) + Sum_Z1 p(_z) = 1
由於
Z0和
Z1構成了
ngram 「
_z」全部可能的狀況。所以有:
Sum_Z0 p(_z) = 1 - Sum_Z1 p(_z)
平滑通常採用如下兩種策略中的一種
1) 回退平滑
當
ngrma 統計結果
c(a_z) > 0,回退平滑算法以
c(a_z)爲基礎計算
p(a_z) ,不然在
c(a_z) = 0的狀況,回退平滑算計算
p(a_z)時只考慮
c
(_z);
2) 插值平滑
插值平滑算法在
c(a_z) > 0的狀況下,計算
p(a_z)時,除了考慮
c(a_z)以外,還須要考慮低階的
ngram,如
c(_z)等。
插值平滑算法可用以下公式來表示
(4) p(a_z) = g(a_z) + bow(a_) p(_z)
其中
g(a_z)在
c(a_z) = 0的狀況下,爲
0。和回退平滑算法同樣,在
c(a_z)>0的狀況下,插值平滑算法也須要從
g(a_z)中折扣掉一部分機率,用於
c(a_z) = 0的全部
z構成的
ngram。
折扣平滑算法的
bow(a_)計算公式:
(5) Sum_Z p(a_z) = 1
Sum_Z1 g(a_z) + Sum_Z bow(a_) p(_z) = 1
bow(a_) = 1 - Sum_Z1 g(a_z)
插值平滑算法,一樣能夠用公式
(2)的表示方式表示,以下所示:
(6) f(a_z) = g(a_z) + bow(a_) p(_z)
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z)
SRILM中的大部分平滑算法同時擁有回退和插值兩種方式。根據以往的經驗,通常插值方式的效果要優於回退方式。平滑算法方面,
kneser-ney平滑要優於其餘的平滑算法。
OPTIONS
本部分主要介紹
ngram-count中各個折扣算法的公式。介紹各折扣算法時,首先介紹各折扣算法的動機,而後介紹如何根據
counts值計算公式(
2)中
f(a_z)和
bow(a_)。
須要注意的是一些
counts因爲
-gtmin參數的緣由,可能在統計模型不存在;參考下一部份
Warning 4
大部分模型中,回退版本是默認的平滑方式,而插值版本能夠經過
-interpolate獲取。在插值平滑方式中,公式(
4)中
g(a_z) 和
bow(a_)一樣根據
counts值計算獲得。
每個折扣參數選項後面均可以跟一個(
1-9)的數字,用來表示只對某一個特定元數的
ngram作折扣計算,具體能夠參看
ngram-count用戶手冊。
-cdiscount D
Ney 的絕對摺扣(
absolute discounting)使用參數
D做爲折扣常數。
D必需要介於
0和
1之間。若是
z 1表明全部知足
c(a_z) > 0的單詞
z的集合,則有以下等式存在:
f(a_z) = (c(a_z) - D) / c(a_)
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z) ; Eqn.2
bow(a_) = (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z)) ; Eqn.3
上面爲回退平滑的計算公式,對於插值平滑,有以下計算公式:
g(a_z) = max(0, c(a_z) - D) / c(a_)
p(a_z) = g(a_z) + bow(a_) p(_z) ; Eqn.4
bow(a_) = 1 - Sum_Z1 g(a_z) ; Eqn.5
= D n(a_*) / c(a_)
折扣係數
D建議能夠經過以下公式計算獲取
D = n1 / (n1 + 2*n2)
上式中
n1表明出現次數爲
1次的
ngram數目
n2表明出現次數爲
2次的
ngram數目
-kndiscount 和
–ukndiscount
Kneser-Ney折扣。前一個參數對應於
modified Kneser-Ney折扣,然後一個參數對應於最初的
Kneser-Ney折扣。
Kneser-Ney折扣算法和絕對摺扣算法比較類似,該算法一樣是在
ngram統計量
count上減去一個常數
D計算折扣機率。
modified Kneser-Ney和
Kneser-Ney的不一樣點就在於如何計算該常數
D。
Kneser-Ney折扣的主要思想是爲低階的
ngram使用一個修改後的機率估計(
modified
probability estimation)方法。具體來講,
n元低階的修正機率(
modified probability)和訓練
語料中該低階的不一樣前驅詞數量成比例。經過折扣和歸一化運算,有以下公式:
f(a_z) = (c(a_z) - D0) / c(a_) ;; for highest order N-grams
f(_z) = (n(*_z) - D1) / n(*_*) ;; for lower order N-grams
其中
n(*_z)表明不一樣的
*_z數量,這裏
*表明獨立詞通配符。
D0和
D1表明兩個不一樣的折扣
常數,這是由於不一樣元數的
ngram使用不一樣的常數。最終的條件機率和回退權重能夠經過
以下公式(
2)和(
3)計算:
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z) ; Eqn.2
bow(a_) = (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z)) ; Eqn.3
對於插值平滑有以下計算公式
p(a_z) = g(a_z) + bow(a_) p(_z) ; Eqn.4
假設
z1爲集合
{z: c(a_z) > 0},對於高階
ngram有:
g(a_z) = max(0, c(a_z) - D) / c(a_)
bow(a_) = 1 - Sum_Z1 g(a_z)
= 1 - Sum_Z1 c(a_z) / c(a_) + Sum_Z1 D / c(a_)
= D n(a_*) / c(a_)
假設
z2爲集合
{z: n(*_z) > 0},對於低階
ngram有:
g(_z) = max(0, n(*_z) - D) / n(*_*)
bow(_) = 1 - Sum_Z2 g(_z)
= 1 - Sum_Z2 n(*_z) / n(*_*) + Sum_Z2 D / n(*_*)
= D n(_*) / n(*_*)
最初的
Knser-Ney折扣算法(
-ukndiscount)對於任何
ngram使用同一常數
D進行折扣計算,該折扣常數根據以下公式計算獲取:
D = n1 / (n1 + 2*n2)
上式中
n1表明出現次數爲
1次的
ngram數目
n2表明出現次數爲
2次的
ngram數目
Chen和
Goodman的
Modified Kneser-Ney折扣(
-kndiscount)算法對於每個
ngram均使用三個折扣常數,一個用於出現次數爲
1次的
ngram,一個用於出現次數爲
2次的
ngram,一個用於出現次數爲
3次和
3次以上的
ngram,公式以下所示:
Y = n1/(n1+2*n2)
D1 = 1 - 2Y(n2/n1)
D2 = 2 - 3Y(n3/n2)
D3+ = 3 - 4Y(n4/n3)
Warning
SRILM中
Kneser-Ney折扣算法實際修改了低階
ngram的出現次數(
counts)。所以當使用
-write參數輸出
-kndiscount和
-ukndiscount折扣算法下全部
ngram的出現次數(
counts)時,只有最高階的
ngram和以
開始的ngram的出現次數(counts)爲c(a_z),其餘的ngram的出現次數爲修改後的值n(*_z),參考Warning2
-wbdiscount
Witten-Bell折扣算法。直觀理解該算法就是分配給低階的權重應該和在當前歷史(
a_)後接的不一樣詞的統計量成比例,用公式能夠表示以下:
bow(a_) = n(a_*) / (n(a_*) + c(a_))
上式中
n(a_*)表明訓練語料中歷史
a_後接的不一樣種類的詞條數。
Witten-Bell開始只是一個插值折扣平滑算法,所以在參數
-interpolate下,有:
g(a_z) = c(a_z) / (n(a_*) + c(a_))
p(a_z) = g(a_z) + bow(a_) p(_z) ; Eqn.4
不加
-interpolate參數,即獲得了一個回退平滑版本的
Witter-Bell折扣平滑算法,該算法中
f(a_z)和插值算法中的
g(a_z)計算方法同樣。
f(a_z) = c(a_z) / (n(a_*) + c(a_))
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z) ; Eqn.2
bow(a_) = (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z)) ; Eqn.3
-ndiscount
Ristad天然折扣算法,該算法目前在
SRILM中只存在回退平滑版本,不存在插值平滑版本,所以
-interpolate對該算法無任何影響。該算法具體可參考「
A natural law of succession」。
c(a_z) c(a_) (c(a_) + 1) + n(a_*) (1 - n(a_*))
f(a_z) = -------- -------------------------------------------------
c(a_) c(a_)^2 + c(a_) + 2 n(a_*)
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z) ; Eqn.2
bow(a_) = (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z)) ; Eqn.3
-count-lm
暫不介紹
-addsmooth D
經過對每一個
ngram出現次數加上一個常量
D來達到平滑效果。
p(a_z) = (c(a_z) + D) / (c(a_) + D n(*))
default
若用戶未指定任何折扣算法,則
ngram-count默認採用
Good-Turing折扣算法(
Katz平滑算法)。
Good-Turing折扣算法認爲,對於發生次數爲
r的
ngram,應該認爲其發生次數爲
r'次,其中:
r' = (r+1) n[r+1]/n[r]
上式中
n[r]表明全部發生次數爲
r次的
ngram數目。
對於較大的
r,能夠認爲
r是一個可信的統計結果,所以不作上面的折扣計算,默認狀況下
unigram中的
r只要大於
1,其餘
ngram中的
r只要大於
7就認爲可信,這時採用最大似然估計機率值。這些限制能夠經過使用
-gtnmax參數來控制。
f(a_z) = (c(a_z) / c(a_)) if c(a_z) > gtmax
對於出現次數知足
1 <= c(a_z) <= gtmax:的
ngram有以下折扣公式:
n[gtmax + 1]
A = (gtmax + 1) ----------------
n[1]
n[c(a_z) + 1]
c'(a_z) = (c(a_z) + 1) -----------------
n[c(a_z)]
c(a_z) (c'(a_z) / c(a_z) - A)
f(a_z) = -------- ----------------------
c(a_) (1 - A)
-interpolate參數對上述公式沒有任何影響,所以只有回退平滑版本:
p(a_z) = (c(a_z) > 0) ? f(a_z) : bow(a_) p(_z) ; Eqn.2
bow(a_) = (1 - Sum_Z1 f(a_z)) / (1 - Sum_Z1 f(_z)) ; Eqn.3
FILE FORMATS
經過使用以下的命令,
SRILM能夠根據一個文本文件統計生成
ngram Count文件
ngram-count -order N -text file.txt -write file.cnt
-order參數指定要統計的
ngram的最大長度。
file.txt文件必定要一句話一行,且其中詞與詞之間經過空格隔開。輸出文件
file.cnt中一行包含一個
ngram後接一個
table鍵,後接統計到的出現次數:
a_z c(a_z)
Warning 1
SRILM 默認會在
file.txt文件中每一個句子首尾分別加上句子開始標記
和句子結束標記,所以不須要再
file.txt文件中每一個句子加上這兩個標記。
筆者注:新版本的
SRILM系統中,能夠經過
-no-sos和
-no-eos控制不加這兩個符號。
Warning 2
SRILM中
Kneser-Ney折扣算法實際修改了低階
ngram的出現次數(
counts)。所以當使用
-write參數輸出
-kndiscount和
-ukndiscount折扣算法下全部
ngram的出現次數(
counts)時,只有最高階的
ngram和以
開始的ngram的出現次數(counts)爲c(a_z),其餘的ngram的出現次數爲修改後的值n(*_z)。
對於大多平滑算法而言(除
-count-lm),
SRILM都使用
ARPA格式生成和使用
N-gram模型。生成一個模型文件的最簡單的方法以下所示:
ngram-count -order N -text file.txt -lm file.lm
ARPA格式的模型文件
file.lm每一行爲一個
ngram及其相關信息,具體格式以下:
log10(f(a_z)) a_z log10(bow(a_z))
根據公式(
2),第一項
log10(f(a_z))表明
ngram a_z 的機率值以
10爲底的對數結果,後面更一個
ngram,
ngram中每個單詞經過空格隔開,最後一項爲以
a_z 開始的
(n+1)grams的回退係數求以
10爲底的對數結果。
Warning 3
不論是回退仍是插值平滑,統一使用
ARPA格式來表示,即插值平滑的相關係數根據公式(
6)轉換爲回退表示。
Warning 4
並非全部的
ngram都有參數指定的最高元。參數
-gtmin, -gt1min, ..., -gt9min用於指定最小出現多少次的
n元纔會被包含在語言模型中。默認狀況下,全部的一元和二元都會被包含進語言模型,高階的
ngram只會包含出現次數大於等於
2的
ngram。(
Some exceptions arise, because if one N-gram is included in the model file, all its prefix N-grams have to be included as well. This causes some higher order 1-count N-grams to be included when using KN discounting, which uses modified counts as described in Warning 2.)(這句話未翻譯)
Warning 5
並非模型中的全部
ngram都有回退值,最高階的
ngram並不須要回退值。對於其餘的低階
ngram來講,其存在回退值是由於其構成了某個更高階
ngram的前綴。對於其餘的低階
ngram來講回退值默認爲
1,取以
10爲底的對數後即爲
0。
來源:http://blog.chinaunix.net/uid-20658401-id-1587798.html