统计语言模型学习笔记

来源:互联网 发布:js中的深拷贝和浅拷贝 编辑:程序博客网 时间:2024/05/21 04:42

一、统计语言模型基本原理

一个句子是否合理,就看它出现的可能性大小如何。至于可能性就用概率来衡量

假设 S 表示某个句子,此句子有一连串按照特定顺序排列的词 w1, w2, ..., wn 组成,其中 n 表示词的个数。现在我们想知道 S 在文本中出现的可能性,用数学表示就是 S 的概率 P(S)。既然 S = w1, w2, w3, ..., wn,不妨把 P(S) 展开表示:

P(S) = p(w1, w2, w3, ..., wn)(3.1)
= p(w1) * p(w2 / w1) * p(w3 / w1, w2) * ... * p(wn / w1, w2, ..., wn-1)(3.2)

其中,p(wi) 表示 wi 在文本中出现的概率,p(wi / wi-1) 表示在已经 wi-1 出现的条件下,wi 紧跟着出现的概率。

       从计算上来看,第一个词的概率 p(w1) 很容易计算,第二个词的条件概率 p(w2 / w1) 计算也不算太麻烦,第三个词的条件概率 p(w3 / w1, w2) 计算已经很难了,因为三个词任意组合太多了,到了最后一个词 wn 的条件概率 p(wn / w1, w2, ..., wn-1) 的可能性太多,无法估算。

为了解决这个问题,俄罗斯的数学家马尔科夫做了一个假设,假设任意一个词 wi 出现的概率只和它前面的词 wi-1 有关。于是,问题就变得很简单了,现在 S 出现的概率为:

P(S) = p(w1) * p(w2 / w1) * p(w3 / w2) * ... * p(wn / wn-1)(3.3)

公式 3.3 对应的统计语言模型是二元模型 (bigram model).

接下来就是如何估计条件概率 p(wi / wi-1),根据它的定义:

p(wi / wi-1) = p(wi, wi-1) / p(wi-1)

而估计联合概率 p(wi, wi-1) 和边缘概率 p(wi-1) 使得问题变得简单。因为有大量的语料,只要数一数 wi-1, wi 词对在语料中出现的次数 #(wi, wi-1);以及 wi-1 本身在语料中出现的次数 #wi-1,然后用两个数分别除以语料库词的总数 #,即可得到这些词和二元组的相对频率。

f(wi-1, wi) = #(wi-1, wi) / #
f(wi) = #(wi) / #

根据大数定理,只要统计量足够,相对频率就等于概率,即:

p(wi-1, wi) = f(wi-1, wi) = #(wi-1, wi) / #
p(wi) = f(wi) = #(wi) / #

因此:

p(wi / wi-1) = p(wi-1, wi) / p(wi-1) = #(wi-1, wi) / #(wi)

至此,我们已经有了一个完整的句子出现的概率计算方法

二、高阶语言模型

上一节的公式 3.3 模型的假设前提是,句子中每个词只和前面一个词有关,而和更前面的词就无关了,这似乎太简单化了,或者说近似过头了。更普遍的假设是某个词和前面的若干个词有关。
假设文本中的每个词 wi 和前面的 N-1 个词有关,而与更前面的词无关,因此:

p(wi / w1, w2, ..., wi-1) = p(wi / wi-N+1, ..., wi-1)(3.10)

公式 3.10 的这种假设被称为 N-1 阶马尔科夫假设,对应的语言模型称为 N 元模型(N-gram model)。在实际应用中最多的时 N=3 的三元模型,更高阶的模型就很少用了。因为 3 阶以上的模型,随着阶数上升,效果提升不明显,而消耗的资源增加却非常快。

三、模型的训练

使用语言模型需要知道模型中所有的条件概率,我们称之为模型参数。通过对语料的统计,得到这些参数的过程称为模型的训练。

回到二元模型 3.3,如果同现的次数 #(wi-1, wi) = 0 怎么办?是否意味着条件概率 p(wi / wi-1) = 0 ?反过来,如果 wi-1wi 和 wi-1 都只出现了一次,是否敢得出 p(wi / wi-1) = 1 的结论 ?这就涉及到可靠性问题了。本节主要讨论模型训练中如何解决这两个问题。

在数理统计中,我们之所以敢于用对采样数据的观察结果来预测概率,是因为有大数定理在背后做支持,它的要求是有足够的观察值。但是我们在处理实际问题的时候,语料永远是不够的,训练统计语言模型的艺术就在于解决好统计样本不足时的概率估算问题。古德图灵估计给出了解决方案,其基本思想是:在统计中相信可靠的统计数据,而对不可靠的统计数据打一定的折扣,同时将折扣出来的那一小部分概率给予未看见的事件。现在以统计词典中的每个词的概率为例,来说明古德-图灵估计公式:

假定在语料中出现 r 次的词有 Nr 个,特别的,未出现的词的数量为 N0。语料库的大小为 N,那么:

出现 r 次的词在整个语料库中的相对频度则是 r / N。但是当 r 比较小的时候,它的统计不可靠,因此出现 r 次的那些词在计算它们的概率时需要使用一个更小的次数,记为 dr,古德-图灵估计的计算公式为:

dr = (r + 1) * Nr+1 / Nr

显然


一般来讲,Nr+1 < Nr,所以大多数情况下 dr < r。这样就可以给未出现的词赋一个很小的值,从而解决了零概率的问题。同时下调了出现频率很低的词的频率。当然,在实际的自然语言处理中,一般对出现次数超过某个阀值的词,频率不下调。

这样出现 r 次的词的频率估计为 dr / N。于是,对于频率超过一定阀值的词,他们的概率估计就是他们在语料库中的相对频度,对于频率小于这个阀值的词,他们的概率估计就小于他们的相对频度,出现次数越少的,折扣越多。对于未看见的词,也给予了一个比较小的概率。这样所有词的概率估计就都很平滑了。

对于二元组 (wi-1, wi) 的条件概率估计 p(wi / wi-1) 也可以做同样的处理。估计二元模型概率的公式如下:

其中 T 是一个阀值,一般在 8-10 左右,函数 fgt() 表示经过古德-图灵估计后的相对频度。而

四、在分词上的应用

假设一个句子,可以有两种不同的分法,定义如下:

A1,A2,A3, ..., An
B1,B2,B3, ..., Bm

其中,Ai, Bi 都是汉语中的词。最好的一种分词方法应该保证分完词后这个句子出现的概率最大,也就是说,如果 A1,A2, ..., An 是最好的分法,那么其概率满足:
p(A1,A2, ..., An) > p(B1, B2, ..., Bm)

因此,只要利用上一章提到的统计语言模型计算出每种分词后句子出现的概率,并找出其中概率最大的,就能够找出最好的分词方法。
0 0