语言模型的计算N-gram

文章分别参考自:掘金深入浅出讲解语言模型 - 知乎

语言模型:例如在语音识别中,给定一段“厨房里食油用完了”的语音,有可能会输出“厨房里食油用完了”和“厨房里石油用完了”这两个读音完全一样的文本序列。如果语言模型能判断出前者大于后者的概率,我们就可以输出:“厨房里食油用完了”的文本序列,这就是语言模型要做的事。简而言之就是计算一个句子的概率的模型。

给定一个句子或者文本序列S,S是由w1,w2...wk个词语组成,则它的概率可以表示为:

P(S)=P(w1,w2,...wk)=P(w1)P(w2|w1)...P(wk|w1,w2,...wk-1)

但是这样会存在两个缺陷:

1.参数空间过大:条件概率P(wn|w1,w2,...wn-1)的可能性太多,无法进行估算

2.数据稀疏严重:对于非常多词对的组合,在语料库中都没有出现,依据最大似然估计法得到的概率将会是0。

为了解决第一个参数空间过大的问题,引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关。

如果一个词的出现与它周围的词是独立的,则称之为unigram即一元语言模型:
P(S)=P(w1)P(w2)P(w3)...P(wk)

如果一个词的出现仅依赖于它前面出现的一个词,则称之为bigram即二元语言模型:

P(S)=P(w1,w2,w3,...wk)

        =P(w1)P(w2|w1)P(w3|w1,w2)...P(wk|w1,w2,...wk-1)

        约等于P(w1)P(w2|w1)P(w3|w2)...P(wk|wk-1)

如果一个词的出现仅依赖于它前面出现得两个词,则称之为trigram即三元语言模型:

P(S)=P(w1,w2,...wk)

        =P(w1)P(w2|w1)P(w3|w1,w2)...P(wk|w1,w2,...,wk-1)

        约等于P(w1)P(w2|w1)P(w3|w2,w1)...P(wk|wk-1,wk-2)

一般来说,N元模型就是假设当前词出现得概率只与它前面的N-1个词有关。而这些概率参数都可以通过大规模语料库来计算。在实践中1用的最多就是bigram和trigram,高于四元的用的非常少,因为训练它需要更庞大的语料且数据稀疏严重,时间复杂度高精度提升的却不多。

一元语言模型:

在一元语言模型中,我们的句子概率定义为:

P(s)=P(w1)P(w2)P(w3)...P(wk),该式子成立的条件有一个假设,就是条件无关假设,我们认为每个词都是条件无关的。句子的概率计算公式已经有了,如何估计P(w1)P(w2)P(w3)...P(wk)这些值呢。用极大似然估计法。

比如:我们说我们的训练语料是下面这个简单的语料:

星期五早晨,我特意起了个大早,为的就是看看早晨的天空。

那么我们的字典为:“星期五早晨,我特意起了个大早为的就是看天空” 22个不同的词,每个词语的概率直接用极大似然估计法估计得到。

如:P(星)=1/27,P(期)=1/27,一直算到后面的空为1/27。

于是我们需要存储我们学习得到的模型参数,一个向量,22维,每个维度保存着每个单词的概率值。

下面举一个简单的例子模拟如何用语言模型估计一句话的概率。看字出现了两次,2/27

P(我看看早晨的天空)=P(我)P(看)P(看)P(早)P(晨)P(的)P(天)P(空)=1/27*2/27...*1/27

于是得出只要将每句话拆开为每个单词然后用累积形式运算,这样就能算出每句话的概率了。但是这样并没有解决问题。

二元语言模型

在介绍之前,首先看两句话,he eats pizza与he drinks pizza,我们需要用语言模型来判断这两句话出现的概率。

P(he eats pizza)=P(he)*P(eats)*P(pizza)

P(he drinks pizza)=P(he)*P(drinks)*P(pizza)

可以看出,通过一元语言模型的计算公式,看不出上面两个句子的概率有多大差别,

但我们很明显知道第一句话比第二句的概率要大得多。因为正确的表达应该就是吃披萨,而不是喝披萨。

但是由于使用了一元语言模型,假设每个词都是条件无关的,这样的话就会导致我们考虑不到两个词之间的关系搭配。比如在这个例子中,很明显应该判断的是P(pizza|eats)和P(pizza|drinks)的概率大小比较。这也是二元语言模型需要考虑的问题。

再比如:我们对语音识别系统说了一句话,系统经过识别后分别得到了三种可能的文档:“我爱中国”,“我爱钟国”,‘我爱种果’那么哪种文本是你最想表达的呢?

一般我们可以采用统计的方法,在一个语料库中,分别对“我爱中国”,“我爱钟国”,‘我爱种果’三句话进行统计。假设“我爱中国”出现的次数为N1,“我爱钟国”出现的次数为N2,以及‘我爱种果’出现的次数为N3;整个语料库中的句子数为N0;那么我们只需要比较三个句子在语料库中出现的概率:N1/N0,N2/N0,N3/N0并取概率最大的一个句子。

但是此处会出现一个问题,语料库规模又想且语言灵活多变。很可能一个稍微长一点的句子,如“我爱中国的大好河山”,语料库中就没有,那么模型判断出现的概率就为0,由于此种情况较容易出现,甚至有时改动一个字都会导致该句子未在语料库中出现,故即使增加平滑策略效果也不会太好,显然这种统计方法不好。

上述的方法采用的是纵向统计方法,主要是针对语料库,在句子粒度对一个个句子进行统计。我们不妨试一下横向统计方法,以字的粒度进行考虑

从横向角度出发,我们这样考虑“我爱中国”这句话出现的概率。先考虑“我”出现在句子第一个位置的概率,即P(“我”|BEGIN),其中“BEGIN”为句首标识符。接来下再考虑当第一个字是“我”的时候,第二个字是“爱”的概率P(爱|我),依次类推,得到下面的公式:

P(我爱中国)=P(我|BEGIN)P(爱|我)P(中|我,爱)P(国|我,爱,中),我们发现:

P(国|我,爱,中)=P(我,爱,中,国)/P(我,爱,中,但是P(我,爱,中,国)本来就是我们求的值,又绕回来了。

如果我们简化一下模型,比如只考虑在前一个字出现的情况下,后一个字出现的概率。

即P(wj|w1,w2,...wj-1)转化为P(wj|wj-1)这样的简化方式,称为二元语法模型bi-gram。

显然,bi-gram是一种一阶马尔科夫链。这类语言模型就可以称为n元语法模型(N-gram)。当n=1时,即第i个词wi独立于历史,不依赖上下文,一元文法就称作uni-gram。当n=3时,即第i个词wi仅根据其前两个历史词wi-2,wi-1有关,三元文法可以认为是二阶马尔科夫链,称作tri-gram。

模型推导

对于N元语法模型,我们考虑第n个词出现的概率只依赖前N-1个词的概率,故该句子的概率分布为:

P(s)=P(w1,w2,...wn)=P(w1|BEGIN)P(w2|w1)P(w3|w2,w1)...P(wn|w1,w2...wn-1)

最大似然估计:对离散型随机变量,似然函数是等于概率的。根据最大似然估计我们可以得到:

1.对一元语法模型uni-gram,句子概率分布P(s)=P(w0)P(w1)P(w2)...P(wi+1)

2.对2元语法模型bi-gram,句子的概率分布P(s)=P(w1|w0)P(w2|w1)...P(wi+1|wi)

3.对于3元语法模型tri-gram,句子概率分布P(s)=P(w1|w0,w-1)P(w2|w1,w0)...P(wi|wi-1,wi-2)

实例讲解:

假设语料库中有五个句子:

1.我爱中国大好河山

2.我喜欢中华料理

3.果农爱种果

4.我爱中彩票

5.中国真好

当语音识别系统听到wo-ai-zhong-guo后,我们采用bi-gram模型来计算语句是“我爱中国”的概率,根据bi-gram模型:

P(我爱中国)=P(我|<BOS>)P(爱|我)P(中|爱)P(<EOS>|国),<BOS>为句首符号,<EOS>为句尾符号。

其中:

P(我|<BOS>)=N(<BOS>,我)/N(<BOS>)=3/5。具体就是"我"出现在句首的概率为3/5

P(爱|我)=N(我,爱)/N(我)=2/5 除以3/5=2/3

P(中|爱)=N(爱,中)/N(爱)=2/3

P(国|中)=N(中,国)/N(中)=2/4

P(<EOS>|国)=N(国,<EOS>)/N(国)=1/3

因此:P(我爱中国)=3/5*2/5*2/3*2/4*1/3=2/45

进阶优化:

由于上述的模型是概率连乘,故同样会有一项为0整项为0的情况。故我们需要采用平滑技术。一般的平滑策略就是“加1法”;即假设每个N元语法出现的次数比实际出现次数多一次。如“你好”在上面的例子中,P(你|<BOS>)会从0/5调整到1/6。

相关应用:由于N-gram模型计算的是字符串s的概率分布P(s),故可以用来判断“一个字符串是否合理”以及“两个字符串的距离”。

(1)判断一个字符串是否合理:

首先对于自然语言,字符串s是可以由任何中文构成的,只不过P(s)有大有小。例如句子

s1是“我爱中国”,句子s2是“中我国爱”,显然对于中文而言,s1相比s2更为通顺。即

P(s1)>P(s2)。

(2)判断两个字符串的距离:

N-gram的另一项应用就是判断两个字符串的距离。N-gram距离指的是两个字符串s、t的ngram子项Cn(s),Cn(t)以及它们的公共子项Cn(s)和Cn(t)决定。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值