从0探索NLP——KenLM
前情提要
上一篇文章介绍了传统统计语言模型——NGram的原理及其平滑方式,本次介绍一下基于这些理论的一种实现KenLM。
常用的N-gram训练工具有SRILM、IRSTLM、BerkeleyLM和KenLM等
KenLM比SRILM晚出来,训练速度也更快,号称单机版训练超级快,经过测试确实很快,支持大规模的语料训练,文件的输入格式一行行以空格隔开的文本。
官方网站
环境安装方式在官网里也有——安装依赖的编译环境boost、zlib、bzip、eigen后下载源码cmake即可。推荐使用Linux环境安装,很方便,Win10安装需要自己下载安装编译环境。
使用介绍
准备Tokenize(可以是分词也可以是按字拆分)后的语料文件
信息
华宇 信息
北京
信息
华宇
执行命令
$KENLM_BUILD_HOME/bin/lmplz -o [n] --text [语料文件] --arpa [模型结果]
这里我们只训练2gram的
$KENLM_BUILD_HOME/bin/lmplz -o 2 --text test.txt --arpa test.arpa
生成模型文件.arpa,内容用如下
\data\
ngram 1=6
ngram 2=7
\1-grams:
-0.89085555 <unk> 0
0 <s> -0.22184873
-0.89085555 </s> 0
-0.46488678 信息 0
-0.69896996 华宇 -0.30103
-0.69896996 北京 -0.30103
\2-grams:
-0.89085555 信息 </s>
-0.50267535 华宇 </s>
-0.24850096 北京 </s>
-0.44889864 <s> 信息
-0.37527603 华宇 信息
-0.56863624 <s> 华宇
-0.6575773 <s> 北京
\end\
打开python IDE,使用代码测试计算一个句子的分数
import kenlm as kl
model = kl.Model('/data/project/corpus/kenlm-test/test.arpa')
print(model.score('北京 华宇 信息',bos=True,eos=True))
# -2.923708915710449
这个分数是并不是最终概率,根据上篇理论介绍的文章所述“在计算中通常会对概率公式两边取log10”,所以这个分数是
lg
(
P
(
<
s
>
北京华宇信息
<
/
s
>
)
)
=
−
2.923708915710449
\lg(P(<s> 北京 华宇 信息 </s>))=-2.923708915710449
lg(P(<s>北京华宇信息</s>))=−2.923708915710449
那么实际概率就是
P
(
<
s
>
北京华宇信息
<
/
s
>
)
=
1
0
−
2.923708915710449
=
0.001192040
P(<s> 北京 华宇 信息 </s>)=10^{-2.923708915710449}=0.001192040
P(<s>北京华宇信息</s>)=10−2.923708915710449=0.001192040
原理介绍
模型生成
符号说明
n 当前 G r a m 阶数 N G r a m 最大阶数 r 某个 G r a m 的出现数 w i 表示一个 N G r a m 中第 i 个 G r a m w 1 n = w 1 , . . . , w n 表示一个 N G r a m w L 表示一个 N G r a m 的左邻接 G r a m w R 表示一个 N G r a m 的右邻接 G r a m c o u n t ( ) 计数函数 \begin{aligned} n& & &当前Gram阶数 \\ N& & &Gram最大阶数 \\ r& & &某个Gram的出现数 \\ w_{i}& & &表示一个NGram中第i个Gram \\ w_{1}^{n}=w_{1},...,w_{n}& & &表示一个NGram \\ w_{L}& & &表示一个NGram的左邻接Gram \\ w_{R}& & &表示一个NGram的右邻接Gram \\ count()& & &计数函数 \\ \end{aligned} nNrwiw1n=w1,...,wnwLwRcount()当前Gram阶数Gram最大阶数某个Gram的出现数表示一个NGram中第i个Gram表示一个NGram表示一个NGram的左邻接Gram表示一个NGram的右邻接Gram计数函数
模逻辑框图
增加标记符
在原始训练语料的每一句话的开头和结尾分别加上起始符 <s> 和终止符 </s>。
<s> 信息 </s>
<s> 华宇 信息 </s>
<s> 北京 </s>
<s> 信息 </s>
<s> 华宇 </s>
原始计数
形成1Gram、2Gram…NGram并分别计数。
1Gram | 原始计数(count) |
---|---|
<s> | 5 |
信息 | 3 |
华宇 | 2 |
北京 | 1 |
</s> | 5 |
2Gram | 原始计数(count) |
---|---|
<s> 信息 | 2 |
信息 </s> | 3 |
<s> 华宇 | 2 |
华宇 信息 | 1 |
<s> 北京 | 1 |
北京 </s> | 1 |
华宇 </s> | 1 |
调节计数
调节计数统计的是每个Gram的邻接能力(novel continuation),即Gram前面可能出现的情况的种数。其目的是调节一些多而单独意义不大的Gram的计数,可以理解为这些被调节的Gram频率高的原因是某种由该Gram组成的搭配频率很高,但脱离这种搭配该Gram几乎没有别的用法,这样的Gram不配拥有如此高的概率,就好像“富二代有钱并不一定能挣钱”一样,他有钱是因为他家有钱,脱离开这个“家”他一文不值。
特别的,当n=N或 Gram是“<s>”时,调节计数等于原始计数,公式表示是
c
o
u
n
t
a
d
j
(
w
1
n
)
=
{
c
o
u
n
t
(
w
1
n
)
,
i
f
(
n
=
N
∣
∣
w
1
=
<
s
>
)
c
o
u
n
t
(
w
L
:
c
o
u
n
t
(
w
L
w
1
n
)
>
0
)
,
o
t
h
e
r
w
i
s
e
\mathbf{count_{adj}}{(w_{1}^{n})}=\left\{ \begin{aligned} &\mathbf{count}{(w_{1}^{n})} &&,if(n=N||w_{1}=<s>) \\ &\mathbf{count}{(w_{L}:count(w_{L}w_{1}^{n})>0)} &&,otherwise \\ \end{aligned} \right.
countadj(w1n)={count(w1n)count(wL:count(wLw1n)>0),if(n=N∣∣w1=<s>),otherwise
用这语料举个例子:“信息”的前面可以是“<s>”,也可以是“华宇”,所以“信息”的调节计数是2.
1Gram | 调节计数(count_adj) |
---|---|
<s> | 5 |
信息 | 2 |
华宇 | 1 |
北京 | 1 |
</s> | 3 |
2Gram的就是n=N,因为咱们设置的参数-o 是2,说以2Gram的调整计数与原始计数相同。
2Gram | 调节计数(count_adj) |
---|---|
<s> 信息 | 2 |
信息 </s> | 3 |
<s> 华宇 | 2 |
华宇 信息 | 1 |
<s> 北京 | 1 |
北京 </s> | 1 |
华宇 </s> | 1 |
从这里,原始计数作废,计算都使用调节计数。准备工作差不多了,接下来就是KenLM的平滑之路,其选用的是Kneser-Ney平滑,由于上一篇已经介绍了原理这里就给出一个简要的式子:
P
K
N
(
w
i
∣
w
i
−
n
+
1
i
−
1
)
=
P
p
s
e
(
c
o
u
n
t
a
d
j
,
c
o
u
n
t
d
i
s
)
+
B
o
W
(
w
i
−
n
+
1
i
−
1
)
P
(
w
i
−
n
+
2
i
)
\mathbf{P_{KN}}(w_{i}|w_{i-n+1}^{i-1})=\mathbf{P_{pse}}(\mathbf{count_{adj}},\mathbf{count_{dis}})+\mathbf{BoW}(w_{i-n+1}^{i-1})\mathbf{P}(w_{i-n+2}^{i})
PKN(wi∣wi−n+1i−1)=Ppse(countadj,countdis)+BoW(wi−n+1i−1)P(wi−n+2i)
大体分为4步
计数打折(Discounting)
KenLM的平滑之路第一步——首先是做Discounting处理,这里采用的是Chen and Goodman的方法:
c
o
u
n
t
d
i
s
(
n
,
r
)
=
{
0
,
r
=
0
r
−
(
r
+
1
)
∗
t
n
,
1
∗
t
n
,
r
+
1
(
t
n
,
1
+
2
t
n
,
2
)
∗
t
n
,
r
,
r
∈
[
1
,
3
]
c
o
u
n
t
d
i
s
(
n
,
3
)
,
r
>
3
\mathbf{count_{dis}}(n,r)=\left\{ \begin{aligned} &0&&,r=0 \\ &r-\frac{(r+1)*t_{n,1}*t_{n,r+1}}{(t_{n,1}+2t_{n,2})*t_{n,r}} &&,r\in[1,3] \\ &\mathbf{count_{dis}}(n,3)&&,r>3 \end{aligned} \right.
countdis(n,r)=⎩
⎨
⎧0r−(tn,1+2tn,2)∗tn,r(r+1)∗tn,1∗tn,r+1countdis(n,3),r=0,r∈[1,3],r>3
其中 t_{n,r}表示的是在n阶Gram中出现r次的Gram的种数,再次强调,这里的次数指的是调节计数,也是用于对调节计数的打折。举个例子t_{1,1}的意思就是1Gram中出现1次的1Gram个数,有“华宇”和“北京”,所以t_{1,1}=2,公示表示是:
t
n
,
r
=
c
o
u
n
t
(
w
1
n
:
c
o
u
n
t
(
w
1
n
)
=
r
)
t_{n,r}=\mathbf{count}(w_1^n:count(w_1^n)=r)
tn,r=count(w1n:count(w1n)=r)
取值范围上,n肯定是小于等于N的了,本例N是2,至于r取到多少,根据公式知r小于等于3+1。计算 t_{n,r}
项{n,r} | 值 | 包含的Gram |
---|---|---|
{1,1} | 2 | “华宇” “北京” |
{1,2} | 1 | “信息” |
{1,3} | 1 | “</s>” |
{1,4} | 0 | / |
{2,1} | 4 | “华宇 信息” “<s> 北京” “北京 </s>” “华宇 </s>” |
{2,2} | 2 | “<s> 信息” “<s> 华宇” |
{2,3} | 1 | “信息 </s>” |
{2,4} | 0 | / |
再根据上面的表计算count_dis
项{n,r} | 值 |
---|---|
{1,1} | 1/2 |
{1,2} | 1/2 |
{1,3} | 3 |
{1,5} | 3 |
{2,1} | 1/2 |
{2,2} | 5/4 |
{2,3} | 3 |
计算伪概率(Pseudo Probability)
KenLM的平滑之路第二步——KenLM称之为伪概率,其实就是Kneser-Ney平滑式子的第一项,根据Kneser-Ney计算公式知:
P
p
s
e
(
w
n
∣
w
1
n
−
1
)
=
c
o
u
n
t
a
d
j
(
w
1
n
)
−
c
o
u
n
t
d
i
s
(
n
,
c
o
u
n
t
a
d
j
(
w
1
n
)
)
w
R
:
∑
w
R
c
o
u
n
t
a
d
j
(
w
1
w
R
)
\mathbf{P_{pse}}(w_n|w_1^{n-1})=\frac{count_{adj}(w_1^{n})-count_{dis}(n,count_{adj}(w_1^{n}))}{w_{R}:\sum_{w_{R}}count_{adj}(w_{1}w_{R})}
Ppse(wn∣w1n−1)=wR:∑wRcountadj(w1wR)countadj(w1n)−countdis(n,countadj(w1n))
可以发现更正常NGram的概率公式相比,就是分子多减去一项计数打折。
方便理解,这里拿本例涉及的n=1,n=2做一下带入:
P
p
s
e
(
w
1
)
=
c
o
u
n
t
a
d
j
(
w
1
)
−
c
o
u
n
t
d
i
s
(
1
,
c
o
u
n
t
a
d
j
(
w
1
)
)
∑
c
o
u
n
t
a
d
j
(
w
1
,
w
R
)
P
p
s
e
(
w
2
∣
w
1
)
=
c
o
u
n
t
a
d
j
(
w
1
,
w
2
)
−
c
o
u
n
t
d
i
s
(
2
,
c
o
u
n
t
a
d
j
(
w
1
,
w
2
)
)
∑
c
o
u
n
t
a
d
j
(
w
1
,
w
R
)
\begin{aligned} \mathbf{P_{pse}}(w_1)&=\frac{count_{adj}(w_1)-count_{dis}(1,count_{adj}(w_1))}{\sum{count_{adj}(w_1,w_R)}} \\ \mathbf{P_{pse}}(w_2|w_1)&=\frac{count_{adj}(w_1,w_2)-count_{dis}(2,count_{adj}(w_1,w_2))}{\sum{count_{adj}(w_1,w_R)}} \end{aligned}
Ppse(w1)Ppse(w2∣w1)=∑countadj(w1,wR)countadj(w1)−countdis(1,countadj(w1))=∑countadj(w1,wR)countadj(w1,w2)−countdis(2,countadj(w1,w2))
进一步拿例子中的“华宇”、“华宇 信息”举例
P
p
s
e
(
华宇
)
=
c
o
u
n
t
a
d
j
(
华宇
)
−
c
o
u
n
t
d
i
s
(
2
,
c
o
u
n
t
a
d
j
(
华宇
)
)
∑
c
o
u
n
t
a
d
j
(
w
R
)
=
1
−
c
o
u
n
t
d
i
s
(
1
,
2
)
c
o
u
n
t
a
d
j
(
北京
)
+
c
o
u
n
t
a
d
j
(
华宇
)
+
c
o
u
n
t
a
d
j
(
信息
)
+
c
o
u
n
t
a
d
j
(
<
/
s
>
)
=
1
−
1
/
2
1
+
1
+
2
+
3
=
1
/
14
P
p
s
e
(
信息
∣
华宇
)
=
c
o
u
n
t
a
d
j
(
华宇
,
信息
)
−
c
o
u
n
t
d
i
s
(
2
,
c
o
u
n
t
a
d
j
(
华宇
,
信息
)
)
∑
c
o
u
n
t
a
d
j
(
华宇
,
w
R
)
=
1
−
c
o
u
n
t
d
i
s
(
2
,
1
)
c
o
u
n
t
a
d
j
(
华宇
,
信息
)
+
c
o
u
n
t
a
d
j
(
华宇
,
<
/
s
>
)
=
1
−
1
/
2
1
+
1
=
1
/
4
\begin{aligned} \mathbf{P_{pse}}(华宇)&=\frac{count_{adj}(华宇)-count_{dis}(2,count_{adj}(华宇))}{\sum{count_{adj}(w_R)}} \\ &=\frac{1-count_{dis}(1,2)}{count_{adj}(北京)+count_{adj}(华宇)+count_{adj}(信息)+count_{adj}(</s>)} \\ &=\frac{1-1/2}{1+1+2+3} \\ &=1/14 \\ \mathbf{P_{pse}}(信息|华宇)&=\frac{count_{adj}(华宇,信息)-count_{dis}(2,count_{adj}(华宇,信息))}{\sum{count_{adj}(华宇,w_R)}} \\ &=\frac{1-count_{dis}(2,1)}{count_{adj}(华宇,信息)+count_{adj}(华宇,</s>)} \\ &=\frac{1-1/2}{1+1} \\ &=1/4 \\ \end{aligned}
Ppse(华宇)Ppse(信息∣华宇)=∑countadj(wR)countadj(华宇)−countdis(2,countadj(华宇))=countadj(北京)+countadj(华宇)+countadj(信息)+countadj(</s>)1−countdis(1,2)=1+1+2+31−1/2=1/14=∑countadj(华宇,wR)countadj(华宇,信息)−countdis(2,countadj(华宇,信息))=countadj(华宇,信息)+countadj(华宇,</s>)1−countdis(2,1)=1+11−1/2=1/4
1Gram | 伪概率(P_pse) |
---|---|
<s> | 2/7 |
信息 | 3/14 |
华宇 | 1/14 |
北京 | 1/14 |
</s> | 0 |
<unk> | 0 |
说明一下, <unk> 表示未登录词 (OOV, out of vocabulary),因为计数为零,所以伪概率的值为零。
2Gram | 伪概率(P_pse) |
---|---|
<s> 信息 | 3/20 |
信息 </s> | 0 |
<s> 华宇 | 3/20 |
华宇 信息 | 1/4 |
<s> 北京 | 1/10 |
北京 </s> | 1/2 |
华宇 </s> | 1/4 |
计算回退权值 (Back-off weight)
KenLM的平滑之路第三步——KenLM称之为回退权值,其实就是Kneser-Ney平滑式子的第二项的权重系数。上一篇已经详细介绍了原理,所以这里就直接给出计算公式。
P
(
w
n
∣
w
1
n
−
1
)
=
B
o
W
(
w
1
n
−
1
)
∗
P
(
w
n
∣
w
2
n
−
1
)
B
o
W
(
w
1
n
−
1
)
=
∑
r
=
1
3
c
o
u
n
t
d
i
s
(
n
,
r
)
∗
c
o
u
n
t
(
w
R
:
c
o
u
n
t
a
d
j
(
w
1
n
−
1
w
R
)
=
r
)
∑
w
R
c
o
u
n
t
a
d
j
(
w
1
n
−
1
w
R
)
\begin{aligned} \mathbf{P}(w_n|w_1^{n-1})&=\mathbf{BoW}(w_1^{n-1})*\mathbf{P}(w_n|w_2^{n-1}) \\ \mathbf{BoW}(w_1^{n-1})&=\frac{\sum_{r=1}^{3}count_{dis}(n,r)*count(w_{R}:count_{adj}(w_1^{n-1}w_{R})=r)}{\sum_{w_{R}}count_{adj}(w_1^{n-1}w_{R})} \end{aligned}
P(wn∣w1n−1)BoW(w1n−1)=BoW(w1n−1)∗P(wn∣w2n−1)=∑wRcountadj(w1n−1wR)∑r=13countdis(n,r)∗count(wR:countadj(w1n−1wR)=r)
这里再次强调一下,回退的思想是“用低阶NGram的概率推测高阶NGram的概率”,所以当P中计算的是1Gram即n=1时,由于不存在更低阶的0Gram,公式将变得特殊,此时的BoW变成了一个常值Bow(ϕ)。
B
o
W
(
ϕ
)
=
∑
r
=
1
3
c
o
u
n
t
d
i
s
(
1
,
r
)
∗
c
o
u
n
t
(
w
R
:
c
o
u
n
t
a
d
j
(
w
R
)
=
r
)
∑
w
R
≠
<
s
>
c
o
u
n
t
a
d
j
(
w
R
)
=
∑
r
=
1
3
c
o
u
n
t
d
i
s
(
1
,
r
)
∗
t
1
,
r
∑
w
R
≠
<
s
>
c
o
u
n
t
a
d
j
(
w
R
)
\begin{aligned} \mathbf{BoW}(\phi)&=\frac{\sum_{r=1}^{3}count_{dis}(1,r)*count(w_{R}:count_{adj}(w_{R})=r)}{\sum_{w_{R}\ne{<s>}}count_{adj}(w_{R})} \\ &=\frac{\sum_{r=1}^{3}count_{dis}(1,r)*t_{1,r}}{\sum_{w_{R}\ne{<s>}}count_{adj}(w_{R})} \end{aligned}
BoW(ϕ)=∑wR=<s>countadj(wR)∑r=13countdis(1,r)∗count(wR:countadj(wR)=r)=∑wR=<s>countadj(wR)∑r=13countdis(1,r)∗t1,r
这里分母上不能加上<s>,因为我计算的这个概率P的表面上是“NGram的出现概率”,实际上根据上篇对NGram的介绍,完整理解应该是“在有(N-1)Gram做上文的前提下出现该第N个Gram的概率”,举个例子P(华宇 信息)实际上是在上文是“华宇”的前提下,下一个词是信息的概率。那么<s>作为句子开头是不可能有上文的,不能算到w_R。按照本例来说:
B
o
W
(
ϕ
)
=
c
o
u
n
t
d
i
s
(
1
,
1
)
∗
2
+
c
o
u
n
t
d
i
s
(
1
,
2
)
∗
1
+
c
o
u
n
t
d
i
s
(
1
,
3
)
∗
1
c
o
u
n
t
a
d
j
(
传统
)
+
c
o
u
n
t
a
d
j
(
语言
)
+
c
o
u
n
t
a
d
j
(
模型
)
+
c
o
u
n
t
a
d
j
(
<
/
s
>
)
=
9
14
\mathbf{BoW}(\phi)=\frac{count_{dis}(1,1)*2+count_{dis}(1,2)*1+count_{dis}(1,3)*1}{count_{adj}(传统)+count_{adj}(语言)+count_{adj}(模型)+count_{adj}(</s>)}=\frac{9}{14}
BoW(ϕ)=countadj(传统)+countadj(语言)+countadj(模型)+countadj(</s>)countdis(1,1)∗2+countdis(1,2)∗1+countdis(1,3)∗1=149
再举个例子,计算“华宇 信息”的概率时需要用到“华宇”的回退权值:
P
(
信息
∣
华宇
)
=
B
o
W
(
华宇
)
∗
P
(
信息
)
B
o
W
(
华宇
)
=
c
o
u
n
t
d
i
s
(
2
,
1
)
∗
2
+
c
o
u
n
t
d
i
s
(
2
,
2
)
∗
0
+
c
o
u
n
t
d
i
s
(
2
,
3
)
∗
0
1
+
1
\begin{aligned} \mathbf{P}(信息|华宇)&=\mathbf{BoW}(华宇)*\mathbf{P}(信息) \\ \mathbf{BoW}(华宇)&=\frac{count_{dis}(2,1)*2+count_{dis}(2,2)*0+count_{dis}(2,3)*0}{1+1} \end{aligned}
P(信息∣华宇)BoW(华宇)=BoW(华宇)∗P(信息)=1+1countdis(2,1)∗2+countdis(2,2)∗0+countdis(2,3)∗0
这里:
- 分子中第一个数字2,是以“华宇”开头的2Gram中,调节计数中为1的种数,{“华宇 信息”、“华宇 </s>”}
- 分子中第二个数字0,是以“华宇”开头的2Gram中,调节计数中为2的种数,没有
- 分子中第三个数字0,是以“华宇”开头的2Gram中,调节计数中为3的种数,没有
- 分母中第一个数字1,是以“华宇”开头的2Gram“华宇 信息”的调节计数
- 分母中第二个数字1,是以“华宇”开头的2Gram“华宇 </s>”的调节计数
同理计算
1Gram | 回退权值(BoW) | 取lg |
---|---|---|
<s> | 3/5 | -0.221849 |
信息 | 1 | 0 |
华宇 | 1/2 | -0.301030 |
北京 | 1/2 | -0.301030 |
</s> | 0 | NA |
<unk> | 0 | NA |
再次说明,</s> 、<unk>的回退权值实际上不用计算,因为 </s> 的后面不可能接词,<unk>都是个未知数跟别说后面能接什么了。
到这里我就得出模型中1-grams第三列的东西了
插值(Interpolation)
KenLM的平滑之路第四步——最后一步,计算了 NGram 对应的伪概率和回退权值之后, 利用下面的插值方法可以得到最终的条件概率。由于插值方法是一种递归算法,所以我们从1Gram情景开始定义,记词汇表大小为V,只有1Gram的BoW特殊,记空词汇表ϕ:
P
(
w
i
)
=
P
p
s
e
(
w
i
)
+
B
o
W
(
ϕ
)
1
V
\mathbf{P}(w_i)=\mathbf{P_{pse}}(w_i)+\mathbf{BoW}(\phi)\frac{1}{V}
P(wi)=Ppse(wi)+BoW(ϕ)V1
再看看2Gram:
P
(
w
i
∣
w
i
−
1
)
=
P
p
s
e
(
w
i
∣
w
i
−
1
)
+
B
o
W
(
w
i
−
1
)
P
(
w
i
)
\mathbf{P}(w_i|w_{i-1})=\mathbf{P_{pse}}(w_i|w_{i-1})+\mathbf{BoW}(w_{i-1})\mathbf{P}(w_i)
P(wi∣wi−1)=Ppse(wi∣wi−1)+BoW(wi−1)P(wi)
再看看NGram:
P
(
w
i
∣
w
i
−
n
+
1
i
−
1
)
=
P
p
s
e
(
w
i
∣
w
i
−
n
+
1
i
−
1
)
+
B
o
W
(
w
i
−
n
+
1
i
−
1
)
P
(
w
i
∣
w
i
−
n
+
2
i
−
1
)
\mathbf{P}(w_i|w_{i-n+1}^{i-1})=\mathbf{P_{pse}}(w_i|w_{i-n+1}^{i-1})+\mathbf{BoW}(w_{i-n+1}^{i-1})\mathbf{P}(w_i|w_{i-n+2}^{i-1})
P(wi∣wi−n+1i−1)=Ppse(wi∣wi−n+1i−1)+BoW(wi−n+1i−1)P(wi∣wi−n+2i−1)
以咱们的例子说:
P
(
信息
)
=
P
p
s
e
(
信息
)
+
B
o
W
(
ϕ
)
∗
1
V
=
3
14
+
9
14
∗
1
5
=
24
70
\begin{aligned} \mathbf{P}(信息)&=\mathbf{P_{pse}}(信息)+\mathbf{BoW}(\phi)*\frac{1}{V} \\ &=\frac{3}{14}+\frac{9}{14}*\frac{1}{5}& \\ &=\frac{24}{70} \end{aligned}
P(信息)=Ppse(信息)+BoW(ϕ)∗V1=143+149∗51=7024
1Gram | 概率§ | lg |
---|---|---|
<s> | 0 | 0 |
信息 | 24/70 | -0.464887 |
华宇 | 14/70 | -0.698970 |
北京 | 14/70 | -0.698970 |
</s> | 9/70 | -0.890856 |
<unk> | 9/70 | -0.890856 |
注意,按照公式计算<s>的概率是29/70,如前文说的<s>前面没东西了,所以概率是0 。
P ( 信息 ∣ 华宇 ) = P p s e ( 信息 ∣ 华宇 ) + B o W ( 华宇 ) ∗ P ( 信息 ) = 1 4 + 1 2 ∗ + 24 70 = 59 140 \begin{aligned} \mathbf{P}(信息|华宇)&=\mathbf{P_{pse}}(信息|华宇)+\mathbf{BoW}(华宇)*\mathbf{P}(信息) \\ &=\frac{1}{4}+\frac{1}{2}*+\frac{24}{70} \\ &=\frac{59}{140} \end{aligned} P(信息∣华宇)=Ppse(信息∣华宇)+BoW(华宇)∗P(信息)=41+21∗+7024=14059
2Gram | 概率§ | lg |
---|---|---|
<s> 信息 | 249/700 | -0.448899 |
信息 </s> | 9/70 | -0.890856 |
<s> 华宇 | 189/700 | -0.568636 |
华宇 信息 | 59/140 | -0.375276 |
<s> 北京 | 11/50 | -0.657577 |
北京 </s> | 79/140 | -0.248501 |
华宇 </s> | 44/140 | -0.502675 |
到这里我就得出模型中第一列的东西了
概率计算
对于模型训练好后任意概率的计算,首先输入的要是Tokenize后的(和训练时用相同Tokenizer),生成NGram序列,计算每一个的概率的lg对数,再加和,返回的时该句子的概率的lg对数。
至于每一个的概率lg的计算是一个递归的过程,模型中有现成的就直接用(模型第一列)。没有的话,那就根据插值公式计算前缀的回退概率lg(模型第三列)和去掉第一个Gram的概率lg。连前缀都没有那就只能直接取去掉第一个Gram的概率lg了。这里的“去掉第一个Gram的概率lg”就是递归计算了。
逻辑框图
例子验证
lg
P
(
北京华宇信息
)
=
lg
P
(
<
s
>
)
+
lg
P
(
北京
∣
<
s
>
)
+
lg
P
(
华宇
∣
北京
)
+
lg
P
(
信息
∣
华宇
)
+
lg
P
(
<
/
s
>
∣
信息
)
\lg{\mathbf{P}(北京华宇信息)}=\lg{\mathbf{P}(<s>)}+\lg{\mathbf{P}(北京|<s>)}+\lg{\mathbf{P}(华宇|北京)}+\lg{\mathbf{P}(信息|华宇)}+\lg{\mathbf{P}(</ s>|信息)} \\
lgP(北京华宇信息)=lgP(<s>)+lgP(北京∣<s>)+lgP(华宇∣北京)+lgP(信息∣华宇)+lgP(</s>∣信息)
代入计算
lg
P
(
<
s
>
)
=
0
lg
P
(
北京
∣
<
s
>
)
=
−
0.657577
lg
P
(
华宇
∣
北京
)
=
lg
B
o
W
(
北京
)
∗
P
(
华宇
)
=
−
0.999999
lg
P
(
信息
∣
华宇
)
=
−
0.375276
lg
P
(
<
/
s
>
∣
信息
)
=
−
0.890856
lg
P
(
北京华宇信息
)
=
−
2.923708
\begin{aligned} &\lg{\mathbf{P}(<s>)}= 0\\ &\lg{\mathbf{P}(北京|<s>)}= -0.657577\\ &\lg{\mathbf{P}(华宇|北京)}= \lg{\mathbf{BoW}(北京)*\mathbf{P}(华宇)}=-0.999999\\ &\lg{\mathbf{P}(信息|华宇)}= -0.375276 \\ &\lg{\mathbf{P}(</ s>|信息)}= -0.890856 \\ &\lg{\mathbf{P}(北京华宇信息)}= -2.923708 \end{aligned}
lgP(<s>)=0lgP(北京∣<s>)=−0.657577lgP(华宇∣北京)=lgBoW(北京)∗P(华宇)=−0.999999lgP(信息∣华宇)=−0.375276lgP(</s>∣信息)=−0.890856lgP(北京华宇信息)=−2.923708
与样例一致