n-gram语言模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n-gram语言模型相关的知识,希望对你有一定的参考价值。

参考技术A 在自然语言处理中的一个基本问题: 如何计算一段文本序列在某种语言下出现的概率? 之所为称其为一个基本问题,是因为它在很多NLP任务中都扮演着重要的角色。例如,"我经常会去图书馆____",预测该句后面的词。我们会通过已有的语料或上下文,来统计预测这句话可以填某个词的概率。将概率最大的作为预测结果返回。再比如机器翻译中,‘I like Tom so much.’ ===>‘我’,‘喜欢’,‘汤姆’,‘非常’ 将这个集合里的字词排列组合成句子,然后用语言模型去计算形成句子的概率大小。概率越大,说明翻译越顺畅,越好,就作为最终的答案返回。

统计语言模型给出了这一类问题的一个基本解决框架。对于一段文本序列

它的概率可以表示为:

即将序列的联合概率转化为一系列条件概率的乘积。问题变成了如何去预测这些给定previous words下的条件概率:

由于其巨大的参数空间,这样一个原始的模型在实际中并没有什么用。我们更多的是采用其简化版本—— Ngram模型 :

常见的如bigram模型(N=2)和trigram模型(N=3)。事实上,由于模型复杂度和预测精度的限制,我们很少会考虑N>3的模型。

我们可以用最大似然法去求解Ngram模型的参数——等价于去统计每个Ngram的条件词频。

为了避免统计中出现的零概率问题,针对于Ngram模型有很多处理的小技巧。

n-gram语言模型的思想,可以追溯到信息论大师香农的研究工作,他提出一个问题: 给定一串字母,如“for ex”,下一个最大可能性出现的字母是什么? 从训练语料数据中,我们可以通过极大似然估计的方法,得到N个概率分布:是a的概率是0.4,是b的概率是0.0001,是c的概率是…,当然, 别忘记约束条件:所有的N个概率分布的总和为1.

n-gram模型概率公式推导。根据条件概率和乘法公式:

得到 

拿一个应用来讲,假设T是由词序列A1,A2,A3,…An组成的,那么P(T)=P(A1A2A3…An)=P(A1)P(A2|A1)P(A3|A1A2)…P(An|A1A2…An-1) 

如果直接这么计算,是有很大困难的,需要引入马尔科夫假设,即:一个item的出现概率,只与其前m个items有关 ,当m=0时,就是unigram,m=1时,是bigram模型。

因此,P(T)可以求得,例如,当利用bigram模型时,P(T)=P(A1)P(A2|A1)P(A3|A2)…P(An|An-1) 

而P(An|An-1)条件概率可以通过极大似然估计求得,等于Count(An-1,An)/Count(An-1)。

·著名的 google books Ngram Viewer ,它的n-gram数据格式是这样的:

代表了一个 1-gram的数据片段 ,第一行的意思是,“circumvallate”这个单词在1978年出现335次,存在91本书中。这些元数据,除了频率335次是必须的,其他的元数据(例如,还有词性等)可以根据应用需求来定。下面是一个 5-gram数据片段 :

当然,也可以是其他形式,例如, HanLP 的n-gram模型是bigram:

每一行代表,两个相邻单词共同出现时的频率(相对于背后的语料库)。

· 文化研究 ·分词算法 ·语音识别 ·输入法 ·机器翻译

文化研究:n-gram模型看起来比较枯燥和冰冷,但实际上,google books ngram项目,催生了一门新学科( Culturomics )的成立,通过数字化的文本,来研究人类行为和文化趋势。可查看知乎上的 详细介绍 ,。《可视化未来》这本书也有详细介绍。还有TED上的视频 《what_we_learned_from_5_million_books》 ,十分精彩。

输入法:大家每天都在使用的东西,请看:输入“tashiyanjiushengwude”,可能的输出有:

究竟哪个是输入者最想表达的意思,这背后的技术就要用到n-gram语言模型了。item就是每一个拼音对应的可能的字。还记得智能ABC吗? 据说 是运用n-gram的鼻祖了。 不过搜狗输入法后来居上,它采用更先进的 云计算技术 (n-gram模型的数据量可是相当之大,后面会说到) 。

做概率统计的都知道,语料库的规模越大,做出的n-gram对统计语言模型才更有用。n-gram,无论是存储还是检索,对技术都是极大的挑战。 

主要参考文章:

【1】 N-Gram语言模型   原文更精彩

通俗理解N-gram语言模型。(转)

N-gram语言模型

考虑一个语音识别系统,假设用户说了这么一句话:“I have a gun”,因为发音的相似,该语音识别系统发现如下几句话都是可能的候选:1、I have a gun. 2、I have a gull. 3、I have a gub. 那么问题来了,到底哪一个是正确答案呢?

一般的解决方法是采用统计的方法。即比较上面的1、2和3这三句话哪一句在英语中出现的概率最高,哪句概率最高就把哪句返回给用户。那么如何计算一个句子出现的概率呢?说白了就是“数数”的方法。但是即使是“数数”也有很多种数法,其中,最简单的策略如下:

给定一个语料库,数出其中所有的长度为4的句子的个数,设为N,然后再看在这N个长度为4的句子中,“I have a gun”出现了多少次,不妨设为N0,那么句子“I have a gun”的概率就是N0/N。其它两个句子的概率也这么计算。

上述的这种数数方法,从逻辑上讲是完全OK的,但是因为自然语言的灵活多变性,以及语料库的规模总是有限的,对于一个稍长一点的句子,很可能语料库中根本就没有。比如说下面这个句子:“I am looking for a restaurant to eat breakfast”,直观上看,这句话在语料库中应该出现次数很多吧?但是如果把这句话输入到Google的搜索框中,点击搜索,你会发现返回的结果中根本就没有完全匹配上的。所以,我们需要提出更加有效的“数数”方法。

为了把事情说清楚,需要引入一些简单的数学符号。

1、word序列:w1, w2, w3, … , wn

2、链式规则:P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

好了,我们想要计算“I have a gun”的概率,也就是计算P(I,have,a,gun),按照链式规则,则有:

P(I,have,a,gun)=P(I)P(have|I)P(a|I,have)P(gun|I,have,a)

但是事情并没有得到简化,例如要计算P(gun|I,have,a),按照条件概率公式展开:

P(gun|I,have,a) = P(I,have,a,gun)/P(I,have,a)

发现了什么?为了计算P(gun|I,have,a),我们需要先计算P(I,have,a,gun)和P(I,have,a)。哎?P(I,have,a,gun)不就是我们一开始想要计算的值吗?所以绕了一圈,我们又回到了原地?

好了,现在我们来整理一下思路。

对于一个句子,其可以表示为一个word序列:w1, w2, w3, … , wn。我们现在想要计算句子出现的概率,也就是计算P(w1, w2, w3, … , wn)。这个概率我们可以直接用数数的方法求解,但是效果并不好,所以我们利用链式规则,把计算P(w1, w2, w3, … , wn)转化为计算一系列的乘积:P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)。但是转化之后,问题并没有变得简单。怎么办?

N-gram这时候就派上用场了。

对于1-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1)

对于2-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2)

对于3-gram,其假设是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2,wn-3)

依次类推。

所以:

在1-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)

在2-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)

在3-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)

假设我们采用的是1-gram模型,那么:

P(I,have,a,gun)=P(I)P(have|I)P(a|have)P(gun|a).

然后,我们再用“数数”的方法求P(I)和其他的三个条件概率:

P(I)=语料库中I出现的次数 / 语料库中的总词数

P(have|I) = 语料库中I和have一起出现的次数 / 语料库中I出现的次数。

总结,本文只是对N-gram做了非常简单的介绍,目的在于简单易懂,但是不够严谨。感兴趣的同学可以进一步查阅相关的资料。在任何一本关于自然语言处理的书上都能够找到N-gram的内容。

以上是关于n-gram语言模型的主要内容,如果未能解决你的问题,请参考以下文章

n-gram

n-gram语言模型LM

n-gram语言模型LM

n-gram语言模型LM

什么是N-gram语言模型

n-gram语言模型