文章来自公众号:【机器学习炼丹术】
N-gram语言模型
N-gram是一种语言模型(Language model,这个后面讲),是一种概率模型。这个模型输入的是一个句子,输出的是一个概率(看完就懂这个是什么概率了)。
I love deep learning中如果给出l love ( ) learning.那么空中填入deep的概率就比填入apple的概率大。假设有这样一个句子,I love deep learning,用
$w_1$表示I,
用$w_2$表示love,
用$w_3$表示deep,
用$w_4$表示learn,
那么:$p(i love deep learning)=p(w_1,w_2,w_3,w_4)=p(w_1)p(w_2|w_1)p(w_3|w_2,w_1)p(w_4|w_3,w_2,w_1)$很好理解,就是第一个词是I的概率,然后乘上已知第一个词是I第二个词是love的概率……整个下来就是这个句子的概率。直观来看,如果这个句子越常见、越自然,那么这个句子的概率就会更大。
那么怎么算这个$p(w_2|w_1)$的概率呢?其实就是统计你的文本数据库中有多少个I love这个组合出现,然后除以I的数量(大概是这样,但是具体会有不同后面说),总之就是I love出现的次数越多,$p(love|I)$越大。
但是这个公式是有两个问题:
- 参数空间过大。假设这个句子非常的长,那么第n个词就要基于前面n-1个词计算概率,参数是n-1,太多了。
- 数据过于稀疏。简单的说就是并不是所有的词的组合都会出现,万一本文数据库中就刚好有某一个组合没有出现过,那么这个组合对应的概率就是0,这个句子的概率因为有一个因子是0,乘起来还是0就不好了。
为了解决第一个问题:
引入马尔可夫假设:模型的当前状态仅仅依赖于前面的几个状态。
这个假设简化了模型,减少的参数,假设仅仅依赖于前面两个状态的话,那么第n个词就只用基于前面的n-1和n-2个词,而不是从1到n-1所有的词,参数降低。
根据这个依赖数量,n-gram可以分为:
- Bi-gram:仅仅依赖前面一个词,例如:$p(i)p(love|i)p(deep|love)p(learning|deep)$,bi这个英文前缀,表示两个,所以,这里其实就是“I love”、“love deep”、“deep learning”这样两单词的组合的意思;
- Tri-gram:tri表示3个的意思,所以就是以来前面两个词,变成了$p(i)p(love|i)p(deep|i,love)p(learning|deep,love)$
这里也可以体会到n-gram中的n是一个什么含义。当然也可以弄个4-gram但是常用的就是2和3。
这里举个例子:
i love deep learning deep learning I love I want apple
这三句话就是我们的全部文本数据库了,我们想要得到$p(love|i)$的概率,那么就是文本中i出现的次数,3次,i love出现了两次,那么这个概率就是$2/3$.这里多了一个sos表示句子的开始start of sentence,eos就是end of sentent句子的结束。所以这里的i的概率其实不是$p(i)$,而是$p(i|sos)$。
Unigran:这是一个可能听说过,但是不怎么用的模型。就是每个单词单独考虑,完全不考虑单词之间的组合的一个模型。每一个单子自身就是独立的,用上面的例子就是:$p(i)p(love)p(deep)(learning)$,这个句子与deep learning love i在Unigram模型下没有区别。这里要再提到一个概念bag of word(BOW)词袋模型,这个模型其实就是Unigram一样,不考虑单词的顺序,只考虑单词的频率。举个例子来理解这个模型:
- I love deep learning.
- I love deep learning and machine learning.
这两句话就是我们的所有的文本数据库,专业一点叫做语料库(corpus),就是我们的文本数据库。然后从语料库corpus中,找到所有出现的单词,然后做出一个词汇表vocabulary,在这个例子中我们的vocabulary就是:{i:0,love:1,deep:2,learning:3,and:4,machine:5}
那么,根据BOW模型,第一个句子用BOW表示就是:[1,1,1,1,0,0],第二个句子就是:[1,1,1,2,1,1]这个就是表示对应单词出现的频率,跟单词在句子中什么位置出现的没有关系。(值得注意的是BOW现在已经不怎么用在NLP中了,而是图像处理中,但是用的也比较少,以了解为主)
这样的模型可以做什么呢?
- 词性标注:
love可以表示名词,也可以表示动词。对数据库中所有的单词进行词性标注,然后判断I love的love是一个什么词性,就用n-gram模型:$p(动词|I的词性,love)=\frac{前一个词是代词,love是动词的组合的数量}{前面一个词是代词,不管love是什么词性的组合的数量}$
- 文本类别判断之是否是垃圾邮件:
数据库中有垃圾邮件和非垃圾邮件,然后根据模型可以知道垃圾邮件中有什么词组,比如:大甩卖、畅销这样的词汇。然后在根据这些内容,计算一个文本是否是垃圾邮件的概率。(这里讲的不细致,知道可以做这个就行了)
- 文本主题的分析。这个关键在于寻找同义词,同义词的英文是(synonyms);
- 也可以做情感分析。经常用在电影评论上面,判断一个评论是正面评论(Positive)还是负面评论(Negtive),还是中立的(neutral)。也可以把文本细分成了六个情感类型:愤怒(Anger),厌恶(Disgust),恐惧(Fear),喜悦(Joy),悲伤(Sadness),惊喜(Surprise)
朴素贝叶斯
目前为止,读者应该能理解n-gram模型了,其中有unigram,bi-gram和tri-gram。然后unigram又提到了BOW模型作为了解。那么语言模型是什么东西呢?其实语言模型就是基于朴素贝叶斯(naïve Bayesian)的一个概率模型。
先简单说一下贝叶斯公式吧,这是啥公式:$P(B|A)=\frac{P(A|B)P(B)}{P(A)}$
或者可以写成这个样子:$P(A,B)=P(A|B)P(B)=P(B|A)P(A)$
然后贝叶斯定理解决的问题就是:已知$P(B|A)$怎么得到$P(A|B)$,这个其实很有用。就用上面的识别垃圾邮件作为例子,A就是{垃圾邮件,不是垃圾邮件},B就是邮件中的信息,想到根据信息来判断是否是垃圾邮件的概率这个比较难,所以就变成了:$P(是垃圾邮件|信息)=\frac{P(信息|是垃圾邮件)P(是垃圾邮件)}{P(信息)}$用一个简单的例子,假设这个信息是这样一句话:日赚百万。我们可以去找垃圾邮件中“日赚百万”这个句子出现的概率,然后再根据所有语料库中垃圾邮件的比例,得到这个概率。至于分母的$P(信息)$我们可以省略,为什么呢?因为最后我们要找到的是$P(是垃圾邮件|信息)$和$P(不是垃圾邮件|信息)$之间的概率,两者的分子相同,所以可以省略。好比1和1的概率就是50%和50%,那么10和10的概率也是50%和50%。
所以根据这个原理,我们把之前选择概率高的,改成选择打分高的。什么意思呢?之前可能是0.3,0.7,选择0.7这个类别。现在变成3,7,选择7这个类别。所做的改动就是把分母去掉就行了:$Score(B|A)=P(A|B)P(B)$
那么什么是naive Beyesian呢?我们已经讲完了,朴素贝叶斯是一种分类算法,思想就是求解在某个条件下,各个类别出现的概率,哪一个最大,就选择哪个类别。在上面的例子中,求解“日赚百万”这个信息下,邮件是“垃圾邮件”还是”不是垃圾邮件“这两个类别的概率,然后概率大的哪一个就是这个文本的类别。
所以朴素贝叶斯分类器的公式可以写成:$c^* = argmax_{c}{P(c|a_1,a_2,...,a_n)}= argmax_{c}{P(a_1,a_2,...,a_n|c)P(c)}$
- 其中$c^*$就是最终判断的类别,然后c是所有类别中的一种,在上面的例子中,c就是”是垃圾邮件”或者“不是垃圾邮件”,其中的a就是已知的所有信息。
- 到这里,就可以把语言模型和n-gram区分开了,朴素贝叶斯分类器就是语言模型的基础,想象一个垃圾邮件,应该是有一段话的,不会光有四个字“日赚百万”。那么$a_1$就是这段话的第一个句子,然后$a_2$就是第二个句子。这就是一种语言模型。当然,用整个句子的话,可以是可以,但是不好(后面会说为什么不好)。假设我们这里的$a_1$是一个词,然后$a_2$是另外一个词,这样的话,就过渡到了之前讲的n-gram模型了。
朴素贝叶斯是基于一个假设的:已知信息a之间相互条件独立:
就是假设下面的公式是成立的:$P(a_1,a_2,...,a_n|c)=P(a_1|c)P(a_2|c)…P(a_n|c)=\prod_{i=1}^n{P(a_i|c)}$
然后把这个假设带到上面朴素贝叶斯分类器的公式中,就可以得到:$c^*=argmax{P(c)\prod_{i=1}^n{P(a_i|c)}}$这个公式就是提到语言模型一定会看到的公式。现在回到之前的一个问题,为什么句子不好。假设a是个句子,那么$P(a_i|c)$表示什么含义?表示在你的语料库中,这个句子出现的此时。一个句子一摸一样出现的次数能有几次?同样的含义可以用不同的句子说出来,所以如果用句子的话,这个$P(a_i|c)$大概率是0。因此,使用词组,使用n-gram的方法会更加有实际意义。
做一个小结:
在NLP中假设提到了语言模型,请想到n-gram模型。然后能够知道什么是贝叶斯理论,以及朴素贝叶斯分类器及它的一个已知信息条件独立的假设。
最后的最后就是,这个语言模型是一个什么级别的呢?在自然语言处理中,处理一些任务,可以用基于天真贝叶斯的语言模型,当然也可以用机器的方法。不过两者并不是完全冲突,更多是两者的结合。
额外的概念:
term-document matrix:有的读者可能会看到这个名词。这个矩阵是这样的,每一行都是一个语料库的文本,每一列示一个单词,用这个例子来解释:
- I love deep learning.
- I love deep learning and machine learning.
那么这个矩阵的行表示的是:第一个文本,第二个文本
列就是:i,love,deep, learning,and,machine
这个矩阵就是:
$1,1,1,1,0,0\\1,1,1,1,1,1$
这个矩阵只是体现是否出现,而不是统计出现的次数。
- Named Entity Recognition,NER:这个是命名实体识别。这个任务可以用上面讲的语言模型实现,但是现在已经不用这么古老的方法了。这个任务的目的就是识别语料中的人名、地名、组织机构等命名实体,比方说知道李雷是一个名字,知道谷歌是一家公司,知道人民大道是一条马路的名字等等。