自然语言处理NLP中的N-gram模型

自然语言处理NLP中的N-gram模型

Naive Bayes

  首先我们复习一下一个非常基本的模型,朴素贝叶斯(Naive Bayes)。朴素贝叶斯的关键组成是贝叶斯公式与条件独立性假设。为了方便说明,我们举一个垃圾短信分类的例子。

** "在家日赚百万,惊人秘密..."**

  上面这句话抄自我手机中的一条垃圾短信,自从去过澳门,手机就时不时收到这样的关于赌场的短信。朴素贝叶斯模型就是要衡量这句话属于垃圾短信敏感句子的概率,我们以前半句为例:
p ( 垃 圾 短 信 ∣ " 在 家 日 赚 百 万 " ) ∝ p ( 垃 圾 邮 件 ) p ( " 在 家 日 赚 百 万 " ∣ 垃 圾 短 信 ) p(垃圾短信|"在家日赚百万")\propto p(垃圾邮件)p("在家日赚百万"|垃圾短信) p("")p()p("")
由条件独立性假设:
p ( " 在 家 日 赚 百 万 " ∣ J ) = p ( " 在 " , " 家 " , " 日 " , " 赚 " , " 百 " , " 万 " ∣ J ) = p ( " 在 " ∣ J ) p ( " 家 " ∣ J ) p ( " 日 " ∣ J ) p ( " 赚 " ∣ J ) p ( " 百 " ∣ J ) p ( " 万 " ∣ J ) p("在家日赚百万"|J)=p("在","家","日","赚","百","万"|J)\\ =p("在"|J)p("家"|J)p("日"|J)p("赚"|J)p("百"|J)p("万"|J) p(""J)=p("","","","","",""J)=p(""J)p(""J)p(""J)p(""J)p(""J)p(""J)
  上面每一项条件概率都可以通过在训练数据的垃圾短信中统计每个字出现的次数得到,然而这里有一个问题,朴素贝叶斯将句子处理为一个**词袋模型(Bag-of-Words, BoW)**,以至于不考虑每个单词的顺序。这一点在中文里可能没有问题,因为有时候即使把顺序捣乱,我们还是能看懂这句话在说什么,但有时候不行,例如:

** 我烤面筋 = 面筋烤我 ?**

  那么有没有模型是考虑句子中单词之间的顺序的呢?有,N-gram就是。


N-gram

N-gram简介

  在介绍N-gram之前,让我们回想一下**“联想”**的过程是怎样发生的。如果你是一个玩LOL的人,那么当我说“正方形打野”、“你是真的皮”,“你皮任你皮”这些词或词组时,你应该能想到的下一个词可能是“大司马”,而不是“五五开”。如果你不是LOL玩家,没关系,当我说“上火”、“金罐”这两个词,你能想到的下一个词应该更可能“加多宝”,而不是“可口可乐”。
  N-gram正是基于这样的想法,它的第一个特点是某个词的出现依赖于其他若干个词,第二个特点是我们获得的信息越多,预测越准确。我想说,我们每个人的大脑中都有一个N-gram模型,而且是在不断完善和训练的。我们的见识与经历,都在丰富着我们的阅历,增强着我们的联想能力。

  N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。
这里写图片描述

  N-gram本身也指一个由 N N N个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram ( N = 2 N=2 N=2) 和 Tri-gram ( N = 3 N=3 N=3),一般已经够用了。例如在上面这句话里,我可以分解的 Bi-gram 和 Tri-gram :

Bi-gram : {I, love}, {love, deep}, {love, deep}, {deep, learning}
Tri-gram : {I, love, deep}, {love, deep, learning}


N-gram中的概率计算

  假设我们有一个由 n n n个词组成的句子 S = ( w 1 , w 2 , ⋯   , w n ) S=(w_1,w_2,\cdots,w_n) S=(w1,w2,,wn),如何衡量它的概率呢?让我们假设,每一个单词 w i w_i wi都要依赖于从第一个单词 w 1 w_1 w1到它之前一个单词 w i − 1 w_{i-1} wi1的影响:
p ( S ) = p ( w 1 w 2 ⋯ w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) ⋯ p ( w n ∣ w n − 1 ⋯ w 2 w 1 ) p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}\cdots w_2w_1) p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1w2w1)
是不是很简单?是的,不过这个衡量方法有两个缺陷:

  • 参数空间过大,概率 p ( w n ∣ w n − 1 ⋯ w 2 w 1 ) p(w_n|w_{n-1}\cdots w_2w_1) p(wnwn1w2w1) 的参数有 O ( n ) O(n) O(n) 个。
  • 数据稀疏严重,词同时出现的情况可能没有,组合阶数高时尤其明显。

  为了解决第一个问题,我们引入马尔科夫假设(Markov Assumption)一个词的出现仅与它之前的若干个词有关
p ( w 1 ⋯ w n ) = ∏ p ( w i ∣ w i − 1 ⋯ w 1 ) ≈ ∏ p ( w i ∣ w i − 1 ⋯ w i − N + 1 ) p(w_1\cdots w_n)=\prod p(w_i|w_{i-1}\cdots w_1)\approx \prod p(w_i|w_{i-1}\cdots w_{i-N+1}) p(w1wn)=p(wiwi1w1)p(wiwi1wiN+1)

  • 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为 Bi-gram
    p ( S ) = p ( w 1 w 2 ⋯ w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) ⋯ p ( w n ∣ w n − 1 ) p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}) p(S)=p(w1w2wn)=p(w1)p(w2w1)p(wnwn1)
  • 如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为 Tri-gram
    p ( S ) = p ( w 1 w 2 ⋯ w n ) = p ( w 1 ) p ( w 2 ∣ w 1 ) ⋯ p ( w n ∣ w n − 1 w n − 2 ) p(S)=p(w_1w_2\cdots w_n)=p(w_1)p(w_2|w_1)\cdots p(w_n|w_{n-1}w_{n-2}) p(S)=p(w1w2wn)=p(w1)p(w
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值