文章来自公众号:【机器学习炼丹术】

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)$越大。
然而这个公式是有两个问题

  1. 参数空间过大。假如这个句子十分的长,那么第n个词就要基于后面n-1个词计算概率,参数是n-1,太多了。
  2. 数据过于稠密。简略的说就是并不是所有的词的组合都会呈现,万一本文数据库中就刚好有某一个组合没有呈现过,那么这个组合对应的概率就是0,这个句子的概率因为有一个因子是0,乘起来还是0就不好了。

为了解决第一个问题
引入马尔可夫假如:模型的以后状态仅仅依赖于后面的几个状态。
这个假如简化了模型,缩小的参数,假如仅仅依赖于后面两个状态的话,那么第n个词就只用基于后面的n-1和n-2个词,而不是从1到n-1所有的词,参数升高。
依据这个依赖数量,n-gram能够分为:

  1. Bi-gram:仅仅依赖后面一个词,例如:$p(i)p(love|i)p(deep|love)p(learning|deep)$,bi这个英文前缀,示意两个,所以,这里其实就是“I love”、“love deep”、“deep learning”这样两单词的组合的意思;
  2. Tri-gram:tri示意3个的意思,所以就是以来后面两个词,变成了$p(i)p(love|i)p(deep|i,love)p(learning|deep,love)$
  3. 这里也能够领会到n-gram中的n是一个什么含意。当然也能够弄个4-gram然而罕用的就是2和3。

    这里举个例子

    • <sos> i love deep learning <eos>
    • <sos> deep learning I love <eos>
    • <sos>I want apple <eos>

这三句话就是咱们的全副文本数据库了,咱们想要失去$p(love|i)$的概率,那么就是文本中i呈现的次数,3次,i love呈现了两次,那么这个概率就是$2/3$.这里多了一个sos示意句子的开始start of sentence,eos就是end of sentent句子的完结。所以这里的i的概率其实不是$p(i)$,而是$p(i|sos)$。

  1. 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中了,而是图像处理中,然而用的也比拟少,以理解为主)

这样的模型能够做什么呢?

  1. 词性标注:

love能够示意名词,也能够示意动词。对数据库中所有的单词进行词性标注,而后判断I love的love是一个什么词性,就用n-gram模型:$p(动词|I的词性,love)=\frac{前一个词是代词,love是动词的组合的数量}{后面一个词是代词,不论love是什么词性的组合的数量}$

  1. 文本类别判断之是否是垃圾邮件:

数据库中有垃圾邮件和非垃圾邮件,而后依据模型能够晓得垃圾邮件中有什么词组,比方:大甩卖、滞销这样的词汇。而后在依据这些内容,计算一个文本是否是垃圾邮件的概率。(这里讲的不粗疏,晓得能够做这个就行了)

  1. 文本主题的剖析。这个关键在于寻找同义词,同义词的英文是(synonyms);
  2. 也能够做情感剖析。常常用在电影评论下面,判断一个评论是侧面评论(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:这个是命名实体辨认。这个工作能够用下面讲的语言模型实现,然而当初曾经不必这么古老的办法了。这个工作的目标就是辨认语料中的人名、地名、组织机构等命名实体,比方说晓得李雷是一个名字,晓得谷歌是一家公司,晓得人民小道是一条马路的名字等等。