当前位置:   article > 正文

常见的语言模型(一)----n-gram_n-gram模型

n-gram模型

一:什么是语言模型

假设一门语言中所有可能的句子服从某种分布,每个句子加起来的概率为1,那么语言模型的任务就是预测每个句子在语言中出现的概率,对于一个好的模型,常见的句子应该得出相对较高的概率,非法的句子应该概率接近于零。

二:语言模型的计算

给定一个句子:(按词序排列)
S =W1,W2,W3…Wn。
那么语言模型可表示为:
p(s) = P(W1,W2,W3…Wn)= P(W1)*P(W2|W1)P(W3|W1,W2)…P(Wn|W1,W2,W3…Wn-1)其中
P(Wn|W1,W2,W3…Wn-1)表示已知前n-1个单词时,第n单词为Wn的条件概率。如果能对这一项建模,只需要将前面每个单词的条件概率相乘,就能计算出一个句子出现的概率。但是这么做有两个很大的缺点:
1,参数空间过大。条件概率P(Wn|W1,W2,W3…Wn-1)的可能性太多(尤其是中文),无法估算,不可能有用。假设一门语言的词汇量为V,如果要将P(Wn|W1,W2,W3…Wn-1)的所有参数保存在一个模型中,那么就会有V的n次方个参数。一般一个普通的句子的长度,就远远超出了实际可行的范围
2,参数过于稀疏。不管通过何种分词方法,对于在语料库中没有出现过的非常多的非法词队组合,根据最大似然估计得到的概率依旧是0

三:n-gram模型

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。
1,承接上面问题,为了解决参数过多的问题,我们引入马尔科夫假设:随机一个词出现的概率只与他前面出现的有限的一个或者几个词有关。
2,如果一个词的出现与他周围的词是独立的,我们就称之为unigram,也就是一元语言模型,即:
P(s) = P(W1)*P(W2)*P(W3)…P(Wn) 即:
在这里插入图片描述

*如果**一个词的出现仅仅依赖他前面出现的一个词,那么我们就称之为bigram**,即:
  • 1

在这里插入图片描述
在这里插入图片描述

如果**一个词的出现仅仅依赖它前面出现的两个词,那么我们就称之为trigram**,即:
  • 1

在这里插入图片描述

一般来说,N元模型就是假设当前单词出现的概率只与他前面N-1个词有关。 而且这些概率参数都是可以通过大规模语料库来计算。因此上面的公式可以近似为:
在这里插入图片描述
在这里插入图片描述

但是在实际中用的最多的就是bigram和trigram,N>4的情况非常少,缺点正如上面谈到的,数据稀疏问题,参数过多问题,而且时间的增加并不会带来精度的大幅度提升。

四:实例

1,一元模型
在一元模型中,按照上述内容,我们要先做了一个条件无关假设(独立假设,与朴素贝叶斯类似),即每个词出现的概率是条件无关的。则有:
在这里插入图片描述
通过p(s)我们知道了一个句子的概率,接着我们再通过极大似然估计来得到每个实例的概率,需要注意的是,每个p(Wn)都是V个实例的(V就是我们语料库的大小),最后我们可以得到该句子的在V语料库训练下的概率。
比如:我们的训练语料如下:
‘星期五早晨,我特意起了个大早,为的就是看看早晨的天空’
我们的字典为:
‘星期五早晨,我特意起了个大早为的就是看天空’
如:p(星)=1/27,p(期)=1/27,一直算到后面的空为1/27.于是我们就需要存储我们学习得到的模型参数,一个向量,22维,每个维度保存着每个单词的概率值。于是我们得出,只要将每句话拆开为每个单词然后用累积形式运算,这样我们就能算出每句话的概率来了。此处注意,重复单词概率应该相加,例如p(看看) = p(看)*p(看) = 2/27,如此我们将所有相乘,即可得到p(s)
2,二元语言模型
下面例子来自于:自然语言处理中的N-Gram模型详解 - 白马负金羁 - CSDN博客和《北京大学 常宝宝 以及 The University of Melbourne “Web Search and Text Analysis” 课程的幻灯片素材》
假设有一个语料库,我们统计了下面一些单词出现的次数

在这里插入图片描述
下面的这些概率作为已知条件
在这里插入图片描述
p(want|) = 0.25
下表是一个基于B-gram的二维模型统计结果(行和列组合统计技术)
在这里插入图片描述
据此我们可以得到二维的B-gram的频率统计结果:
在这里插入图片描述

接下来我们根据以上概率表,来计算s1 = ‘i want english food’与s2 = 'want i english food’在该语料库的训练下,哪个句子更为合理。首先我们判断:
在这里插入图片描述
= 0.25 * 0.33 * 0.0011 * 0.5 * 0.68 = 0.000031

在这里插入图片描述
= 0.25 * 0.0022 * 0.0011 * 0.5 * 0.68 = 0.00000002057
明显S1的概率大于S2,也就是说同S2相比,S1更像一句人话。

五、n-gram的n大小对性能的影响

n更大的时候
n: 对下一个词出现的约束性信息更多,更大的辨别力,但是更稀疏,并且n-gram的总数也更多,为 [公式] 个(V为词汇表的大小)
n更小的时候
在训练语料库中出现的次数更多,更可靠的统计结果,更高的可靠性 ,但是约束信息更少
其中当N为特定值的时候,我们来看一下n-gram可能的总数,如下表:

在这里插入图片描述
对于上图,我用一个例子来进行解释,加入目前词汇表中就只有三个单词,”我爱你“,那么bigram的总数是32=9个,有”我我“,我爱,我你,爱爱,爱你,爱我,你你,你我,你爱这9个,所以对应上面的表示是bigrams是200002=400000000,trigrams=20000^3 = 8*10e12

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/628969
推荐阅读
相关标签
  

闽ICP备14008679号