版权声明:本文为博主jmh原创文章,未经博主允许不得转载。 https://blog.csdn.net/jmh1996/article/details/82807640
引入
假设给定以下不含音调的拼音字母序列: zu guo wo ai ni 那么,这几个拼音对应的文字到底是什么呢? 可能的情况有: 1: 祖国 我爱你 2:族锅 我矮你 3:祖国 我挨你 ··· 显然,我们人类是可以轻而易举的知道,第一种解释最合理,可是 我们如何告诉机器第一种解释"最合理"呢? 而且,什么叫最合理?合理的准则是什么? 历史上,关于某个句子是否合理,存在两大类判断方法: 第一类是所谓的规则法,也就是说这种方法把"(名词)我爱你” 写作一个规则,告诉机器,符合这条规则的句子是合理的!这类方法,当然是有效的,但是只能是定性的分析。
第二类则是所谓的统计法,这种方法企图通过某种方式估算出某个句子的概率,然后认为概率越大的句子其越合理。这样就可以定量分析句子是否合理了。
语言模型
语言模型,就是使用数学的方法来刻画某个句子的"合理性",而不需要使用语义学的相关处理。 给定一个语句S=
(
W
1
=
w
1
,
W
2
=
w
2
,
…
,
W
n
=
w
n
)
(W_{1}=w_{1},W_{2}=w_{2},\dots ,W_{n}=w_{n})
( W 1 = w 1 , W 2 = w 2 , … , W n = w n ) ,表示这个句子里面的第i个词
W
i
W_{i}
W i 取值为
w
i
w_{i}
w i ,例如上面的例1:S=
(
W
1
=
祖
,
W
2
=
国
,
W
3
=
我
,
W
4
=
爱
,
W
5
=
你
)
(W_{1}=祖,W_{2}=国,W_{3}=我,W_{4}=爱,W_{5}=你)
( W 1 = 祖 , W 2 = 国 , W 3 = 我 , W 4 = 爱 , W 5 = 你 ) ,我们定义其概率P(S)为:
p
(
S
)
=
p
(
W
1
=
w
1
,
W
2
=
w
2
,
…
,
W
n
=
w
n
)
p(S)=p(W_{1}=w_{1},W_{2}=w_{2},\dots ,W_{n}=w_{n})
p ( S ) = p ( W 1 = w 1 , W 2 = w 2 , … , W n = w n ) ,这是一个联合概率。我们把这个式子做一个简单的恒等变换:
p
(
S
)
=
p
(
W
1
=
w
1
,
W
2
=
w
2
,
…
,
W
n
=
w
n
)
p(S)=p(W_{1}=w_{1},W_{2}=w_{2},\dots ,W_{n}=w_{n})
p ( S ) = p ( W 1 = w 1 , W 2 = w 2 , … , W n = w n ) ==>
p
(
S
)
=
p
(
W
n
=
w
n
∣
W
1
=
w
1
,
W
2
=
w
2
,
…
,
W
n
−
1
=
w
n
−
1
)
∗
p
(
W
1
=
w
1
,
W
2
=
w
2
,
…
,
W
n
−
1
=
w
n
−
1
)
p(S)=p(W_{n}=w_{n}|W_{1}=w_{1},W_{2}=w_{2},\dots ,W_{n-1}=w_{n-1})*p(W_{1}=w_{1},W_{2}=w_{2},\dots ,W_{n-1}=w_{n-1})
p ( S ) = p ( W n = w n ∣ W 1 = w 1 , W 2 = w 2 , … , W n − 1 = w n − 1 ) ∗ p ( W 1 = w 1 , W 2 = w 2 , … , W n − 1 = w n − 1 ) 这其实就是一个条件概率公式的简单变换使用的原理是:P(AB)=P(A|B)*P(B)=P(B|A)*P(A) 这个式子还可以把
p
(
W
1
=
w
1
,
W
2
=
w
2
,
…
,
W
n
−
1
=
w
n
−
1
)
p(W_{1}=w_{1},W_{2}=w_{2},\dots ,W_{n-1}=w_{n-1})
p ( W 1 = w 1 , W 2 = w 2 , … , W n − 1 = w n − 1 ) 继续变换。最后原式子就可以写成:
p
(
S
)
=
p
(
W
1
=
w
1
)
∗
p
(
W
2
∣
W
1
=
w
1
)
∗
p
(
W
3
=
w
3
∣
W
1
=
w
1
,
W
2
=
w
2
)
∗
⋯
∗
p
(
W
n
=
w
n
∣
W
1
=
w
1
,
W
2
=
w
2
,
.
.
.
,
W
n
−
1
=
w
n
−
1
)
p(S)=p(W_{1}=w_{1})*p(W_{2}|W_{1}=w_{1})*p(W_{3}=w_{3}|W_{1}=w_{1},W_{2}=w_{2})*\dots * p(W_{n}=w_{n}|W_{1}=w_{1},W_{2}=w_{2},...,W_{n-1}=w_{n-1})
p ( S ) = p ( W 1 = w 1 ) ∗ p ( W 2 ∣ W 1 = w 1 ) ∗ p ( W 3 = w 3 ∣ W 1 = w 1 , W 2 = w 2 ) ∗ ⋯ ∗ p ( W n = w n ∣ W 1 = w 1 , W 2 = w 2 , . . . , W n − 1 = w n − 1 )
p
(
S
)
=
∏
i
=
1
i
=
n
p
(
W
i
=
w
i
∣
W
1
=
w
1
,
W
2
=
w
2
,
.
.
.
.
W
i
−
1
=
w
i
−
1
)
p(S)=\prod_{i=1}^{i=n}p(W_{i}=w_{i}|W_{1}=w_{1},W_{2}=w_{2},....W_{i-1}=w_{i-1})
p ( S ) = i = 1 ∏ i = n p ( W i = w i ∣ W 1 = w 1 , W 2 = w 2 , . . . . W i − 1 = w i − 1 ) 里面的每一个因子都可以看成:确定前i-1个词是什么样子了,第i个词为wi的概率。这前i-1个词叫做第i个词的历史。
这个模型就是语言模型。
当谈到模型的时候,我们需要明确四个东西:输入,输出,参数,输入到输出的运算关系。在语言模型里面,输入的当然是句子,输出就是这个句子的概率,参数是上面式子里面的各个条件概率,运算关系就是将各个条件概率相乘。
然而这个定义式子却不好应用。这是因为如果词特别多的话,那么我们要学习特别多的条件概率。比如说,我们常用汉字有5000个,汉语里面每个句子的平均长度为22。那么我们要学习的东西就很多了:我们要学习,每个汉字的概率(P(W=w) ),这里就有5000个参数了,出现一个汉字同时相连出现另外一个汉字的概率
P
(
W
2
=
w
j
∣
W
1
=
w
i
)
P(W_{2}=w_{j}|W_{1}=w_{i})
P ( W 2 = w j ∣ W 1 = w i ) ,这里就有
500
0
2
5000^{2}
5 0 0 0 2 个条件概率。出现两个汉字后出现另外一个汉字的概率···可以想象,这里需要确定的条件概率的数目特别多,计算机根本就存储不过来啊。
于是,我们就简化一下:第i词出现的概率,近似为之前若干个词有关,而不是与前面所有的词有关。根据假设不同,我们可以得到1元文法,2元文法,···n元文法。n元文法假设第i个词只与前n-1个数相关。具体的,在2元文法里面,我们假设第i个词出现的概率,仅需要考虑前一个词是什么即可。也就是说我们假设
p
(
W
i
=
w
i
∣
W
1
=
w
1
,
W
2
=
w
2
,
.
.
.
.
W
i
−
1
=
w
i
−
1
)
p(W_{i}=w_{i}|W_{1}=w_{1},W_{2}=w_{2},....W_{i-1}=w_{i-1})
p ( W i = w i ∣ W 1 = w 1 , W 2 = w 2 , . . . . W i − 1 = w i − 1 ) 约等于
p
(
W
i
=
w
i
∣
W
i
−
1
=
w
i
−
1
)
p(W_{i}=w_{i}|W_{i-1}=w_{i-1})
p ( W i = w i ∣ W i − 1 = w i − 1 ) ,好啦,这样子的话,需要确定的参数一下子就降低了。我们只需要在一个语料库里面,使用统计的方法去估计这个所有的
p
(
W
i
=
w
i
∣
W
i
−
1
=
w
i
−
1
)
p(W_{i}=w_{i}|W_{i-1}=w_{i-1})
p ( W i = w i ∣ W i − 1 = w i − 1 ) 就好啦。
还是上面的例子, 近似前,我们需要计算:
p
(
S
1
)
=
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
5
=
你
∣
W
1
=
祖
,
W
2
=
国
,
W
3
=
我
,
W
4
=
爱
)
p(S_{1})=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_{5}=你|W_{1}=祖,W_{2}=国,W_{3}=我,W_{4}=爱)
p ( S 1 ) = 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 5 = 你 ∣ W 1 = 祖 , W 2 = 国 , W 3 = 我 , W 4 = 爱 ) 近似后:
p
(
S
1
)
=
p
(
W
1
=
祖
)
∗
p
(
W
2
=
国
∣
W
1
=
祖
)
∗
p
(
W
3
=
我
∣
W
2
=
国
)
∗
p
(
W
4
=
爱
∣
W
3
=
我
)
∗
p
(
W
5
=
你
∣
W
4
=
爱
)
p(S_{1})=p(W_{1}=祖)*p(W_{2}=国|W_{1}=祖)*p(W_{3}=我|W_{2}=国)*p(W_{4}=爱|W_{3}=我)*p(W_{5}=你|W_{4}=爱)
p ( S 1 ) = p ( W 1 = 祖 ) ∗ p ( W 2 = 国 ∣ W 1 = 祖 ) ∗ p ( W 3 = 我 ∣ W 2 = 国 ) ∗ p ( W 4 = 爱 ∣ W 3 = 我 ) ∗ p ( W 5 = 你 ∣ W 4 = 爱 ) 值得注意的是,这只是一个近似的简化技巧 这样就好办啦!我们接下来统计一下这些个条件概率。 假设,我们一个语料库包含k个不同的词,那么我们需要估计多少个概率呢?对于相邻的两个词
(
w
i
,
w
i
+
1
)
(w_{i},w_{i+1})
( w i , w i + 1 ) ,那么相邻的两个词一共有多少种可能的组合呢?显然是K*K,于是我们再去统计历史串为wi的情况下后一个词为w_{i+1}的条件频率就可以啦。我们定义
p
(
w
i
+
1
∣
w
i
)
=
w
i
+
1
,
w
i
一
起
出
现
的
次
数
w
i
和
所
有
词
出
现
的
次
数
p(w_{i+1}|w_{i})=\frac{w_{i+1},w{i}一起出现的次数}{w_{i}和所有词出现的次数}
p ( w i + 1 ∣ w i ) = w i 和 所 有 词 出 现 的 次 数 w i + 1 , w i 一 起 出 现 的 次 数
我们来实际应用一下: 给定以下几条预料: John read Moby Dick. Mary read a different book. She read a book by Cher.
现在我们要计算S=John read a book 这个句子的概率p(S)。在实际中我们会引入两个比较特殊的词:句子开始符,以及句子结束符。 那么
p
(
S
)
=
p
(
J
o
h
n
∣
句
子
开
始
)
∗
p
(
r
e
a
d
∣
J
o
h
n
)
∗
p
(
a
∣
r
e
a
d
)
∗
p
(
b
o
o
k
∣
a
)
∗
p
(
句
子
结
尾
∣
b
o
o
k
)
p(S)=p(John|句子开始)*p(read|John)*p(a|read)*p(book|a)*p(句子结尾|book)
p ( S ) = p ( J o h n ∣ 句 子 开 始 ) ∗ p ( r e a d ∣ J o h n ) ∗ p ( a ∣ r e a d ) ∗ p ( b o o k ∣ a ) ∗ p ( 句 子 结 尾 ∣ b o o k ) 现在来估计里面各个条件概率就可以啦。
p
(
J
o
h
n
∣
句
子
开
始
)
=
1
3
,
p
(
r
e
a
d
∣
J
o
h
n
)
=
1
1
,
p
(
a
∣
r
e
a
d
)
=
2
3
.
p
(
b
o
o
k
∣
a
)
=
1
2
,
p
(
句
子
结
尾
∣
b
o
o
k
)
=
1
2
p(John|句子开始)=\frac{1}{3},p(read|John)=\frac{1}{1},p(a|read)=\frac{2}{3}.p(book|a)=\frac{1}{2},p(句子结尾|book)=\frac{1}{2}
p ( J o h n ∣ 句 子 开 始 ) = 3 1 , p ( r e a d ∣ J o h n ) = 1 1 , p ( a ∣ r e a d ) = 3 2 . p ( b o o k ∣ a ) = 2 1 , p ( 句 子 结 尾 ∣ b o o k ) = 2 1 所以
p
(
S
)
=
1
3
∗
1
1
∗
2
3
∗
1
2
∗
1
2
=
0.06
p(S)=\frac{1}{3} *\frac{1}{1} *\frac{2}{3} * \frac{1}{2} * \frac{1}{2}=0.06
p ( S ) = 3 1 ∗ 1 1 ∗ 3 2 ∗ 2 1 ∗ 2 1 = 0 . 0 6
数据平滑
我们定义了
p
(
w
i
+
1
∣
w
i
)
=
w
i
+
1
,
w
i
一
起
出
现
的
次
数
w
i
和
所
有
词
出
现
的
次
数
p(w_{i+1}|w_{i})=\frac{w_{i+1},w{i}一起出现的次数}{w_{i}和所有词出现的次数}
p ( w i + 1 ∣ w i ) = w i 和 所 有 词 出 现 的 次 数 w i + 1 , w i 一 起 出 现 的 次 数 ,这个式子看起来很好算,但是他隐含了一个问题,那就是因为语料数据的缺失导致某些条件概率为0,而这种条件概率为0并不意味着客观上那种句子不存在,只是语料库中没有出现该句子的某个子项造成。例如上面的例子,如果我们要计算 Tom read a book. 这句话的概率的话,我们会得到一个0概率,因为那个连乘的式子中会出现 p(Tom|句子开始),而语料中没有Tom这个词出现,于是我们就得到0了。实际上,我们直观上认识的话,Tom read a book,这类句子是比较合理的。 于是我们得想办法解决这个问题。 最常用的方法就是加1法。
就是说在计算
p
(
w
i
+
1
∣
w
i
)
=
w
i
+
1
,
w
i
一
起
出
现
的
次
数
w
i
和
所
有
词
出
现
的
次
数
p(w_{i+1}|w_{i})=\frac{w_{i+1},w{i}一起出现的次数}{w_{i}和所有词出现的次数}
p ( w i + 1 ∣ w i ) = w i 和 所 有 词 出 现 的 次 数 w i + 1 , w i 一 起 出 现 的 次 数 的时候,假设给定
w
i
w_{i}
w i 时,字典里面的每一个词都会出现一次,但是我们又要保证实际出现的次数越多,这个概率越大,于是我们有:
p
(
w
i
+
1
∣
w
i
)
=
w
i
+
1
,
w
i
一
起
出
现
的
次
数
+
1
w
i
和
所
有
词
一
起
出
现
的
次
数
+
K
p(w_{i+1}|w_{i})=\frac{w_{i+1},w{i}一起出现的次数+1}{w_{i}和所有词一起出现的次数+K}
p ( w i + 1 ∣ w i ) = w i 和 所 有 词 一 起 出 现 的 次 数 + K w i + 1 , w i 一 起 出 现 的 次 数 + 1