通俗讲:自然语言处理(NLP)入门之N-gram语言模型。(朴素贝叶斯分类器的推导)

N-gram语言模型

N-gram是一种语言模型(Language model,这个后面讲),是一种概率模型。这个模型输入的是一个句子,输出的是一个概率(看完就懂这个是什么概率了)。

I love deep learning中如果给出l love ( ) learning.那么空中填入deep的概率就比填入apple的概率大。假设有这样一个句子,I love deep learning,用
w 1 w_1 表示I,
w 2 w_2 表示love,
w 3 w_3 表示deep,
w 4 w_4 表示learn
那么: p ( i l o v e d e e p l e a r n i n g ) = 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 ) 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 ) p(w_2|w_1) 的概率呢?其实就是统计你的文本数据库中有多少个I love这个组合出现,然后除以I的数量(大概是这样,但是具体会有不同后面说),总之就是I love出现的次数越多, p ( l o v e I ) 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 ( l o v e i ) p ( d e e p l o v e ) p ( l e a r n i n g d e e p ) 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 ( l o v e i ) p ( d e e p i , l o v e ) p ( l e a r n i n g d e e p , l o v e ) p(i)p(love|i)p(deep|i,love)p(learning|deep,love)

  3. 这里也可以体会到n-gram中的n是一个什么含义。当然也可以弄个4-gram但是常用的就是2和3。

    这里举个例子

    • i love deep learning
    • deep learning I love
    • I want apple
      这三句话就是我们的全部文本数据库了,我们想要得到 p ( l o v e i ) p(love|i) 的概率,那么就是文本中i出现的次数,3次,i love出现了两次,那么这个概率就是 2 / 3 2/3 .这里多了一个sos表示句子的开始start of sentence,eos就是end of sentent句子的结束。所以这里的i的概率其实不是 p ( i ) p(i) ,而是 p ( i s o s ) p(i|sos)
  4. Unigran:这是一个可能听说过,但是不怎么用的模型。就是每个单词单独考虑,完全不考虑单词之间的组合的一个模型。每一个单子自身就是独立的,用上面的例子就是: p ( i ) p ( l o v e ) p ( d e e p ) ( l e a r n i n g ) 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 l o v e ) = l o v e l o v e p(动词|I的词性,love)=\frac{前一个词是代词,love是动词的组合的数量}{前面一个词是代词,不管love是什么词性的组合的数量}
  2. 文本类别判断之是否是垃圾邮件:
    数据库中有垃圾邮件和非垃圾邮件,然后根据模型可以知道垃圾邮件中有什么词组,比如:大甩卖、畅销这样的词汇。然后在根据这些内容,计算一个文本是否是垃圾邮件的概率。(这里讲的不细致,知道可以做这个就行了)
  3. 文本主题的分析。这个关键在于寻找同义词,同义词的英文是(synonyms);
  4. 也可以做情感分析。经常用在电影评论上面,判断一个评论是正面评论(Positive)还是负面评论(Negtive),还是中立的(neutral)。也可以把文本细分成了六个情感类型:愤怒(Anger),厌恶(Disgust),恐惧(Fear),喜悦(Joy),悲伤(Sadness),惊喜(Surprise)

朴素贝叶斯

目前为止,读者应该能理解n-gram模型了,其中有unigram,bi-gram和tri-gram。然后unigram又提到了BOW模型作为了解。那么语言模型是什么东西呢?其实语言模型就是基于**朴素贝叶斯(naïve Bayesian)**的一个概率模型。

先简单说一下贝叶斯公式吧,这是啥公式: P ( B A ) = P ( A B ) P ( B ) P ( A ) 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(A,B)=P(A|B)P(B)=P(B|A)P(A)
然后贝叶斯定理解决的问题就是:已知 P ( B A ) P(B|A) 怎么得到 P ( A B ) P(A|B) ,这个其实很有用。就用上面的识别垃圾邮件作为例子,A就是{垃圾邮件,不是垃圾邮件},B就是邮件中的信息,想到根据信息来判断是否是垃圾邮件的概率这个比较难,所以就变成了: P ( ) = P ( ) P ( ) P ( ) P(是垃圾邮件|信息)=\frac{P(信息|是垃圾邮件)P(是垃圾邮件)}{P(信息)} 用一个简单的例子,假设这个信息是这样一句话:日赚百万。我们可以去找垃圾邮件中“日赚百万”这个句子出现的概率,然后再根据所有语料库中垃圾邮件的比例,得到这个概率。至于分母的 P ( ) P(信息) 我们可以省略,为什么呢?因为最后我们要找到的是 P ( ) P(是垃圾邮件|信息) P ( ) P(不是垃圾邮件|信息) 之间的概率,两者的分子相同,所以可以省略。好比1和1的概率就是50%和50%,那么10和10的概率也是50%和50%。

所以根据这个原理,我们把之前选择概率高的,改成选择打分高的。什么意思呢?之前可能是0.3,0.7,选择0.7这个类别。现在变成3,7,选择7这个类别。所做的改动就是把分母去掉就行了: S c o r e ( B A ) = P ( A B ) P ( B ) Score(B|A)=P(A|B)P(B)

那么什么是naive Beyesian呢?我们已经讲完了,朴素贝叶斯是一种分类算法,思想就是求解在某个条件下,各个类别出现的概率,哪一个最大,就选择哪个类别。在上面的例子中,求解“日赚百万”这个信息下,邮件是“垃圾邮件”还是”不是垃圾邮件“这两个类别的概率,然后概率大的哪一个就是这个文本的类别。

所以朴素贝叶斯分类器的公式可以写成: c = arg max c P ( c a 1 , a 2 , . . . , a n ) = arg max c P ( a 1 , a 2 , . . . , a n c ) P ( c ) 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是所有类别中的一种,在上面的例子中,c就是”是垃圾邮件”或者“不是垃圾邮件”,其中的a就是已知的所有信息。
  • 到这里,就可以把语言模型和n-gram区分开了,朴素贝叶斯分类器就是语言模型的基础,想象一个垃圾邮件,应该是有一段话的,不会光有四个字“日赚百万”。那么 a 1 a_1 就是这段话的第一个句子,然后 a 2 a_2 就是第二个句子。这就是一种语言模型。当然,用整个句子的话,可以是可以,但是不好(后面会说为什么不好)。假设我们这里的 a 1 a_1 是一个词,然后 a 2 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 ) = i = 1 n P ( a i c ) 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 = arg max c P ( c ) i = 1 n P ( a i c ) c^*=\argmax_c{P(c)\prod_{i=1}^n{P(a_i|c)}} 这个公式就是提到语言模型一定会看到的公式。现在回到之前的一个问题,为什么句子不好。假设a是个句子,那么 P ( a i c ) P(a_i|c) 表示什么含义?表示在你的语料库中,这个句子出现的此时。一个句子一摸一样出现的次数能有几次?同样的含义可以用不同的句子说出来,所以如果用句子的话,这个 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 1,1,1,1,0,0\\1,1,1,1,1,1
      这个矩阵只是体现是否出现,而不是统计出现的次数。
  • Named Entity Recognition,NER:这个是命名实体识别。这个任务可以用上面讲的语言模型实现,但是现在已经不用这么古老的方法了。这个任务的目的就是识别语料中的人名、地名、组织机构等命名实体,比方说知道李雷是一个名字,知道谷歌是一家公司,知道人民大道是一条马路的名字等等。
发布了88 篇原创文章 · 获赞 19 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_34107425/article/details/105419345
今日推荐