赞
踩
语言模型(language model)是自然语言处理的重要技术。自然语言处理中最常见的数据就是文本数据。我们可以把一段自然语言文本看作一段离散的时间序列。假设一段长度为
T
T
T的文本中的词依次为
w
1
,
w
2
,
⋯
,
w
T
w_1,w_2,\cdots ,w_T
w1,w2,⋯,wT,那么在离散的时间序列中,
w
t
(
1
≤
t
≤
T
)
w_t(1\le t \le T)
wt(1≤t≤T)可以看作在时间步
t
t
t的输出或者标签。给定一个长度为
T
T
T的序列
w
1
,
w
2
,
⋯
,
w
T
w_1,w_2,\cdots ,w_T
w1,w2,⋯,wT,语言模型将计算该序列的概率:
P
(
w
1
,
w
2
,
⋯
,
w
T
)
P(w_1,w_2,\cdots ,w_T)
P(w1,w2,⋯,wT)
简单来说,语言模型的概念为:语言模型计算一个句子是句子的概率的模型。(文本序列就是句子喽)
例如下面三句话以及它们是句子的概率分别为
第一句话是句子的概率为0.8,因为这句话即合乎语义又合乎语法,因此这句话是句子的概率很高;第二句话为句子的概率为0.01,这是因为虽然这个句子符合语法但是却不合乎语义,因为构建的语言模型中,“博主”和“一般”出现在一起的概率就很小;而第三句话读都读不同,显然不符合语法,因此是句子的概率极低。
语言模型有很多的用处,它可以用于提升语音识别性能或输入法准确度等。例如,当我们输入“zi ran yu yan chu li”,它所对应的中文可能是“自然语言处理”、“子然语言出力”、“紫然玉言储例”,经过语言模型的判断这三个句子的概率为0.9.,001,0.0001,我们就可以得到是句子概率最高得一句话“自然语言处理”,这也是我们正向得到的。
统计语言模型通过概率来刻画语言模型,假设序列
w
1
,
w
2
,
⋯
,
w
T
w_1,w_2,\cdots ,w_T
w1,w2,⋯,wT中的每个词是依次生成的,则有:
P
(
s
)
=
P
(
w
1
,
w
2
,
⋯
,
w
T
)
=
∏
t
=
1
T
P
(
w
t
∣
w
1
,
⋯
,
w
t
−
1
)
P(s)=P(w_1,w_2,\cdots ,w_T) = \prod_{t=1}^{T}P(w_t|w_1, \cdots ,w_{t-1})
P(s)=P(w1,w2,⋯,wT)=t=1∏TP(wt∣w1,⋯,wt−1)
例如,一段含有4个词的文本序列的概率为:
P
(
w
1
,
w
2
,
w
3
,
w
4
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
1
,
w
2
)
P
(
w
4
∣
w
1
,
w
2
,
w
3
)
P(w_1,w_2,w_3,w_4)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)P(w_4|w_1,w_2,w_3)
P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w1,w2,w3)
为计算语言模型,我们需要计算词的概率,以及一个词在给定前几个词的情况下的条件概率,即语言模型的参数。
词的概率可以通过该词在训练数据集中的相对词频来计算,用语料的频率代替概率(频率学派),即计算词在训练数据集中的出现的次数与训练数据集的总词数之比:
P
(
w
i
)
=
c
o
u
n
t
(
w
i
)
N
P(w_i)=\frac{count(w_i)}{N}
P(wi)=Ncount(wi)
一个词在给定前几个词的情况下的条件概率也可以通过训练数据集中的相对词频计算,其计算公式为:
P
(
w
i
∣
w
i
−
1
)
=
P
(
w
i
−
1
,
w
i
)
P
(
w
i
−
1
)
=
c
o
u
n
t
(
w
i
−
1
,
w
i
)
/
N
c
o
u
n
t
(
w
i
−
1
)
/
N
=
c
o
u
n
t
(
w
i
−
1
,
w
i
)
c
o
u
n
t
(
w
i
−
1
)
P(w_i|w_{i-1})=\frac{P(w_{i-1},w_i)}{P(w_{i-1})}=\frac{count(w_{i-1},w_i)/N}{count(w_{i-1})/N}=\frac{count(w_{i-1},w_i)}{count(w_{i-1})}
P(wi∣wi−1)=P(wi−1)P(wi−1,wi)=count(wi−1)/Ncount(wi−1,wi)/N=count(wi−1)count(wi−1,wi)
但是只是这样构建语言模型的话,还存在一些问题。例如在下面的例子中,对于一句话
s
e
n
t
e
n
c
e
=
{
w
1
,
w
2
,
⋯
,
w
n
}
sentence=\{w_1,w_2,\cdots,w_n\}
sentence={w1,w2,⋯,wn}:
当这句话为“张三很帅”的时候,使用语言模型计算它为句子的概率为: P ( 张 三 很 帅 ) = P ( 张 三 ) ∗ P ( 很 ∣ 张 三 ) ∗ P ( 帅 ∣ 张 三 , 很 ) P(张三\; 很\; 帅)=P(张三)*P(很|张三)*P(帅|张三,很) P(张三很帅)=P(张三)∗P(很∣张三)∗P(帅∣张三,很),由于张三是一个常见的名字,因此在预料中很容易出现,因此通过语言模型可以计算出它的一个概率为 P 1 P_1 P1。
但对于“张得帅很帅”这句话,它的概率为: P ( 张 得 帅 很 帅 ) = P ( 张 得 帅 ) ∗ P ( 很 ∣ 张 得 帅 ) ∗ P ( 帅 ∣ 张 得 帅 , 很 ) P(张得帅\; 很\; 帅)=P(张得帅)*P(很|张得帅)*P(帅|张得帅,很) P(张得帅很帅)=P(张得帅)∗P(很∣张得帅)∗P(帅∣张得帅,很),“张得帅”也可能是一个人名,因此“张得帅很帅”也是一句正确的话,但是“张得帅”在语料库中可能就没有出现过,因此 P ( 张 得 帅 ) P(张得帅) P(张得帅)的概率为0,那么最终的结果也为0。这显然有些不合理,因为“张得帅很帅”明显是一句话。“张得帅很帅”这句话概率为0的原因是因为有一些词在语料库中没有出现过。
而对于“张三很漂亮”这句话,它的概率为: P ( 张 三 很 漂 亮 ) = P ( 张 三 ) ∗ P ( 很 ∣ 张 三 ) ∗ P ( 漂 亮 ∣ 张 三 , 很 ) P(张三\; 很\; 漂亮)=P(张三)*P(很|张三)*P(漂亮|张三,很) P(张三很漂亮)=P(张三)∗P(很∣张三)∗P(漂亮∣张三,很),其中“张三”可能是个男生,“张三跟漂亮”在语料库中出现的概率为0,因此总的概率为0。但是这句话中的每一个词的概率都不为0,并且 P ( 张 三 ) P(张三) P(张三), P ( 很 ∣ 张 三 ) P(很|张三) P(很∣张三)也都不为0,但是再加一个“漂亮”概率就为0了,这是因为这一句话太长了。
由上面例子可以看出,当一个句子明明就是句子的时候,它为句子的概率可能为0,怎么处理这种情况那?可以使用统计语言模型中的平滑操作。
统计语言模型中的平滑操作
有一些词或者词组在语料中没有出现过,但是这不能代表它不可能存在。**平滑操作就是给那些没有出现过的词或者词组也给一个比较小的概率。**平滑操作有很多种。
拉普拉斯平滑(Laplace Smoothing)也称为加1平滑:每个词在原来出现次数的基础上加1,下面是经过拉普拉斯平滑后的计算公式:
P
(
w
)
=
c
o
u
n
t
(
w
)
N
⇒
P
(
w
)
=
c
o
u
n
t
(
w
)
+
1
N
+
V
P(w) = \frac{count(w)}{N} \Rightarrow P(w) = \frac{count(w)+1}{N+V}
P(w)=Ncount(w)⇒P(w)=N+Vcount(w)+1
其中V,加1的词的个数,下面来看一个简单的例子,有三个词A、B、C,每个词的个数分别为0、990、10,在未经过平滑时,每个词的概率为:
A
:
0
P
(
A
)
=
0
/
1000
=
0
B
:
990
P
(
B
)
=
990
/
1000
=
0.99
C
:
10
P
(
C
)
=
10
/
1000
=
0.01
A:0 \; P(A)=0/1000=0 \\ B:990 \; P(B)=990/1000=0.99 \\ C:10 \:P(C)=10/1000=0.01
A:0P(A)=0/1000=0B:990P(B)=990/1000=0.99C:10P(C)=10/1000=0.01
经过平滑之后,每个词的概率为:
A
:
1
P
(
A
)
=
1
/
1003
=
0.001
B
:
991
P
(
B
)
=
991
/
1003
=
0.988
C
:
11
P
(
C
)
=
11
/
1003
=
0.011
A:1 \; P(A)=1/1003=0.001 \\ B:991 \; P(B)=991/1003=0.988 \\ C:11 \:P(C)=11/1003=0.011
A:1P(A)=1/1003=0.001B:991P(B)=991/1003=0.988C:11P(C)=11/1003=0.011
可见之前概率较大的词的概率变小了,概率较小的次的概率变大了。但是平滑操作还存在参数空间过大和数据稀疏严重的问题(空间参数过大导致了数据系数严重的问题),因此可以使用马尔科夫假设来解决此问题。
当序列长度增加时,计算和存储多个词共同出现的概率的复杂程度会呈指数级增加。因此可以通过马尔科夫假设解决该问题,马尔科夫假设是指下一个词的出现仅依赖于前面的n个词(因为一个词与它间隔很长的词之间的关系可能就不是很大了),即k阶马尔科夫链。如果基于n-1阶马尔科夫链,就可以将语言模型改写为:
P
(
s
)
=
P
(
w
1
,
w
2
,
⋯
,
w
n
)
≈
∏
t
=
1
T
P
(
w
t
∣
w
t
−
(
n
−
1
)
,
⋯
,
w
t
−
1
)
P(s)=P(w_1,w_2,\cdots ,w_n) \approx \prod_{t=1}^{T}P(w_t|w_{t-(n-1)}, \cdots ,w_{t-1})
P(s)=P(w1,w2,⋯,wn)≈t=1∏TP(wt∣wt−(n−1),⋯,wt−1)
以上也叫作n元语法。它是基于n-1阶马尔科夫链的概率语言模型。当n分别为1、2、3和k时,我们将其分别称作一元语法(unigram)、二元语法(bigram)、三元语法(trigram)和k元语法(k-gram)。长度为T的序列
w
1
,
w
2
,
⋯
,
w
T
w_1,w_2,\cdots ,w_T
w1,w2,⋯,wT在一元语法、二元语法、三元语法和k元语法中的概率分别是:
u
n
i
g
r
a
m
:
P
(
s
)
=
P
(
w
1
)
P
(
w
2
)
P
(
w
3
)
⋯
P
(
w
T
)
b
i
g
r
a
m
:
P
(
s
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
2
)
⋯
P
(
w
T
∣
w
T
−
1
)
t
r
i
g
r
a
m
:
P
(
s
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
1
w
2
)
⋯
P
(
w
T
∣
w
T
−
2
w
T
−
1
)
k
−
g
r
a
m
:
P
(
s
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
P
(
w
3
∣
w
1
w
2
)
⋯
P
(
w
T
∣
w
T
−
k
+
1
w
T
−
1
)
unigram:P(s)=P(w_1)P(w_2)P(w_3) \cdots P(w_T)\\ bigram:P(s)=P(w_1)P(w_2|w_1)P(w_3|w_2) \cdots P(w_T|w_{T-1})\\ trigram:P(s)=P(w_1)P(w_2|w_1)P(w_3|w_1w_2) \cdots P(w_T|w_{T-2}w_{T-1})\\ k-gram:P(s)=P(w_1)P(w_2|w_1)P(w_3|w_1w_2) \cdots P(w_T|w_{T-k+1}w_{T-1})\\
unigram:P(s)=P(w1)P(w2)P(w3)⋯P(wT)bigram:P(s)=P(w1)P(w2∣w1)P(w3∣w2)⋯P(wT∣wT−1)trigram:P(s)=P(w1)P(w2∣w1)P(w3∣w1w2)⋯P(wT∣wT−2wT−1)k−gram:P(s)=P(w1)P(w2∣w1)P(w3∣w1w2)⋯P(wT∣wT−k+1wT−1)
当n较小时,n元语法往往并不准确。例如,在一元语法中,由3个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当n较大时,n元语法需要计算并存储大量的词频和多词相邻词频。
下面以“我 明天 下午 打 网球”,看一下原始语言模型和经过马尔科夫优化后的语言模型应该怎么计算:
P
(
我
,
明
天
,
下
午
,
打
,
网
球
)
=
P
(
我
)
P
(
明
天
∣
我
)
P
(
下
午
∣
我
,
明
天
)
P
(
打
∣
我
,
明
天
,
下
午
)
P
(
网
球
∣
我
,
明
天
,
下
午
,
打
)
=
P
(
我
)
P
(
明
天
)
P
(
下
午
)
P
(
打
)
P
(
网
球
)
u
n
i
g
r
a
m
=
P
(
我
)
P
(
明
天
∣
我
)
P
(
下
午
∣
明
天
)
P
(
打
∣
下
午
)
P
(
网
球
∣
打
)
b
i
g
r
a
m
=
P
(
我
)
P
(
明
天
∣
我
)
P
(
下
午
∣
我
,
明
天
)
P
(
打
∣
明
天
,
下
午
)
P
(
网
球
∣
下
午
,
打
)
t
r
i
g
r
a
m
P(我,明天,下午,打,网球)\\ =P(我)P(明天|我)P(下午|我,明天)P(打|我,明天,下午)P(网球|我,明天,下午,打)\\ =P(我)P(明天)P(下午)P(打)P(网球)\; \; \;unigram\\ =P(我)P(明天|我)P(下午|明天)P(打|下午)P(网球|打)\; \; \;bigram\\ =P(我)P(明天|我)P(下午|我,明天)P(打|明天,下午)P(网球|下午,打)\; \; \;trigram
P(我,明天,下午,打,网球)=P(我)P(明天∣我)P(下午∣我,明天)P(打∣我,明天,下午)P(网球∣我,明天,下午,打)=P(我)P(明天)P(下午)P(打)P(网球)unigram=P(我)P(明天∣我)P(下午∣明天)P(打∣下午)P(网球∣打)bigram=P(我)P(明天∣我)P(下午∣我,明天)P(打∣明天,下午)P(网球∣下午,打)trigram
语言模型在实质上是一个多分类问题,语言模型计算一个句子是句子的概率。对于一个句子s,其中有
w
1
,
w
2
,
⋯
,
w
n
w_1,w_2,\cdots ,w_n
w1,w2,⋯,wn共n个词,它是句子的概率为:
P
(
s
)
=
P
(
w
1
,
w
2
,
⋯
,
w
n
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
⋯
P
(
w
n
∣
w
1
,
w
2
⋯
w
n
−
1
)
P(s)=P(w_1,w_2, \cdots ,w_n)=P(w_1)P(w_2|w_1) \cdots P(w_n|w_1,w_2 \cdots w_{n-1})
P(s)=P(w1,w2,⋯,wn)=P(w1)P(w2∣w1)⋯P(wn∣w1,w2⋯wn−1)
下面就需要计算出每一项的概率,就可以计算出句子s为句子的概率了,那么每一项有怎么计算哪?对于第一项
P
(
w
1
)
P(w_1)
P(w1),计算为对于所有的词
w
1
,
w
2
,
⋯
w
T
w_1,w_2,\cdots w_T
w1,w2,⋯wT,
w
1
w_1
w1出现的概率分布,可以理解为输入为None,标签为
w
1
w_1
w1,词表大小的一个多分类问题;对于第二项
P
(
w
2
∣
w
1
)
P(w_2|w_1)
P(w2∣w1)为当输入为
w
1
w_1
w1,标签为
w
2
w_2
w2;其他项可以依次类推。综上所述,每一项都可以理解为是一个词表大小的多分类问题。
下图为一个基于前馈神经网络的语言模型,它使用前几个词的词向量,并把它们连接在一起,后面接一个隐藏层,然后是一个分类层,分类层就是一个词表大小的分类器。
语言模型的评价指标,就可以使用困惑度来表示,一个句子的困惑度为一个句子的概率开负的n分之一次方,表示为:
P
P
(
s
)
=
P
(
w
1
,
w
2
,
⋯
w
n
)
−
1
n
=
1
P
(
w
1
,
w
2
,
⋯
,
w
n
)
n
PP(s) = P(w_1,w_2,\cdots w_n)^{- \frac{1}{n}}=\sqrt[n]{\frac{1}{P(w_1,w_2,\cdots ,w_n)}}
PP(s)=P(w1,w2,⋯wn)−n1=nP(w1,w2,⋯,wn)1
句子概率越大,语言模型越好,困惑度越小。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。