目录
一、Noisy Channel Model
二、语言模型
1.句子的概率
2.马尔科夫假设
3.语言模型:N-gram
①Unigram
②Bigram
4.计算语言模型的概率
5.评估语言模型
6.平滑
①拉普拉斯平滑
②Interpolation
该模型就是自然语言处理中常用的模型,它是根据贝叶斯定理得来的,用于把信号源转换成文本,信号源可以是多种,可以适用于多个场景。
比如机器翻译:p(中文|英文) 正比于 p(英文|中文)p(中文)
那么text就是中文,信号源source就是英文。给定了中文,翻译出英文,但通常p(英文|中文)只能是翻译的堆叠,并没有什么语法,因此需要通过p(中文)来保证输出的内容符合语法。而这个p(text)就是语言模型。
除了机器翻译,还适用于拼写纠错、语音识别、密码破解等。前半部分的p(source|text)是用来做翻译、纠错、识别、破解的,但不保证语法正确,因此需要语言模型p(text)。
语言模型的主要作用,是用来判断是否一句话从语法上通顺。
比如:今天是周日VS今天周日是,通过语言模型,我们期望得出:前者的概率大于后者的概率。
一个句子的概率,当进行完分词之后,可以通过概率的链式法则计算,举例如下:
那么如何去计算呢?比如我们应该怎样计算P(休息 | 今天,是,春节,我们,都,休息)?
其实很简单
①在语料库中,找到“今天是春节我们都”,看看后面跟的词是什么。
②假设文章中有2句话包含“今天是春节我们都”,一个是“今天是春节我们都休息”,一个“今天是春节我们都放假”,那么P(休息 | 今天,是,春节,我们,都,休息)就是1/2,但这个方法不太好,因为句子长,不容易在文章中找到,会有稀疏性的问题。
Markov Assumption简单来说就是对条件概率进行近似,将有多个条件的条件概率,近似为只有1-3个条件的条件概率,举例如下:
如果只跟1个条件,就是first order马尔科夫假设,2个条件,就是second order马尔科夫假设,以此类推。
举例如下:
假设左边是已经训练好的语言模型,那么“今天是周日”和“今天周日是”这两句话,我们如果用first order马尔科夫假设进行概率计算,所得结果是如下所示:
相当于单词之间相互独立,根据下面的例子来看,显然效果不太好,它无法判定单词的前后顺序。
Bigram来自于1st order马尔科夫模型,这个模型中考虑了两个单词之间的顺序。根据下面的例子可以看出,Bigram可以区分开不同顺序的单词所组成的句子。
更高阶的统称为N-gram,就是考虑三个单词之间的顺序,更为复杂。一般不会超过6,最常用的是Bigram
①P(单个的词) = 这个词出现次数/语料库总词数
②P(A|B):假如文章中出现了BA, BC,那么P(A|B) = 1/2
举例如下:
语料库共19个词,出现了2次“今天”,则P(今天)=2/19
“今天”后面跟的词,一个是“的”,一个是“上午”,则P(上午|今天) = 1/2
训练好语言模型后,我们可以通过让模型去填空的方法去评估模型好坏,根据填空完之后得到的句子的准确性判断:
不过通过句子来判断会很麻烦,我们还是让模型继续填词,但这次我们直接看它填的词所对应的概率及条件概率,通过一系列计算,使用Perplexity进行判断。
计算方式如下:
①取所有模型填上的词的概率及条件概率,称为likelihood
②对所有的likelihood取对数
③对所有的log-likelihood取平均数x
④代入2^(-x)中,取最小值
由于计算概率的时候,只要有一个词没出现在语料库中,那么分子就会有1项为0,导致整个概率直接为0,因此我们需要对概率加上一个平滑项。
在分子上+1,分母上+V,V是词典的大小,这样加完之后,其他的所有可能性算出来之后,求和为1。举例如下:
也可以不加1,分子加k,分母加kV
k可以由机器自动选择:把k看做一个参数,得到一个关于k的函数f(k),训练好模型,可以令perplexity=f(x),那么我们就需要最小化f(x)即可得到最佳的k。
场景:当语料库中缺少2个短语:in the kitchen, in the arboretum,那么对于模型来说,这两个短语是同等对待的,因此计算条件概率的时候也是相同的。但实际上,在语料库中出现了kitchen这个单词,并且次数很多,因此,在计算条件概率的时候,比如使用trigram的方法,也同时考虑了bigram以及unigram,并且对每一个语言模型赋予权重。(注意,三个模型的权重之和为1)
更一般地: