自然语言处理——(一)语言模型

版权声明:本文为博主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}) ,表示这个句子里面的第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}=你) ,我们定义其概率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},\dots ,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(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 ( 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 ) = 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})
里面的每一个因子都可以看成:确定前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}) ,这里就有 500 0 2 5000^{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 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 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}) ,那么相邻的两个词一共有多少种可能的组合呢?显然是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}和所有词出现的次数}

我们来实际应用一下:
给定以下几条预料:
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 ( 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 ( 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 ( 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}和所有词出现的次数} ,这个式子看起来很好算,但是他隐含了一个问题,那就是因为语料数据的缺失导致某些条件概率为0,而这种条件概率为0并不意味着客观上那种句子不存在,只是语料库中没有出现该句子的某个子项造成。例如上面的例子,如果我们要计算 Tom read a book. 这句话的概率的话,我们会得到一个0概率,因为那个连乘的式子中会出现 p(Tom|句子开始),而语料中没有Tom这个词出现,于是我们就得到0了。实际上,我们直观上认识的话,Tom read a book,这类句子是比较合理的。
于是我们得想办法解决这个问题。
最常用的方法就是加1法。

扫描二维码关注公众号,回复: 3370833 查看本文章

就是说在计算 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}和所有词出现的次数} 的时候,假设给定 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}

猜你喜欢

转载自blog.csdn.net/jmh1996/article/details/82807640