【朴素贝叶斯】实战朴素贝叶斯_文本分类

【文本分类】

文本分类是经典的NLP问题,就是把一个文本自动分到若干个类别之一当中。类别可以是政治、经济、女性、财经等,既可以用字符串形式表示,也可以内部用整数形式来表示。对于我的文本过滤问题,则类别只有两个:不应该过滤 和 应该过滤。接下来是文本表示问题,即用什么量来代表一个文本,从而可以区别其他文本。通常是用“特征词”来表示。特征词是一些经过挑选的词语(特征选择问题我们后面再详细讲),这些词语能最好的表征一个文本,从而与其他的文本相区别。特征词的数量一般很大,通常有几万个,共同组成了朴素贝叶斯模型的输入空间;每一个特征词就是空间中的一个维度,有两个可能取值,分别是1(表示当前样本包含这个词)和0(表示当前样本不包含这个词)。这样,我们通过文本表示的设计,将文本分类和朴素贝叶斯模型的相关参数对应起来了,分类任务就转化成了贝叶斯预测任务。当输入特征都被提取出来之后 ,利用贝叶斯公式进行计算就可以了。

不过,事情没那么简单——真那么简单也没有意思了。我们具体看看,贝叶斯模型是怎么做的。


【朴素贝叶斯——贝努利模型】

贝努利模型?和贝努利分布有什么关系?我们先别管这个名字,先看做法吧。

其实贝努利模型就是严格按照我们上面的描述过程进行操作的。我们再回顾一下,假设我们已经挑选好了特征词,由1w个,如下:

x(0), x(1), x(2)......x(9999)

来了一个新的待分类样本,进行分词、停用词过滤,得到了一个由(部分)特征词组成的序列,这个序列可以用一个0-1向量来表示,如下:

0, 0, 1, 0, .........

当序列包含某个特征词的时候,这一个维度的值为0,否则为0。可以想到,这个向量的绝大部分维度的值都是0,尤其是当这个文本比较短小的时候。那概率怎么算?尤其是,对于值是0的那些特征维度,概率怎么算?贝努利模型的回答是:不管取值是0还是1,都是输入维度的一个取值,概率该怎么算还怎么算,严格按照朴素贝叶斯模型走。就是说,这么算:

p(c(0) | X) = p(c(0)) * p( x(0,0) | c(0) ) * p( x(1,0) | c(0) ) * p( x(2,1) | c(0) ) * ... p( x(9999,0) | c(0) )

注:我随机将某个维度的值取0或者1,能说明问题就好,类别暂定为c(0),其他类别也是一样。而前文中,我们也提到过,实际上我们并没有存储  p( x(i,0) | c(0) ) 的值,而仅仅存储  p( x(i,1) | c(0) ) 的,p( x(i,0) | c(0) ) 的值由 1.0 - p( x(i,1) | c(0) ) 计算得到。我就不将这个公式带入到上面的公式当中了,大家明白意思就好。

以上就是朴素贝叶斯——贝努利模型。用贝努利这个名字,我猜想可能与贝努利分布有关。贝努利分布,就是每一次都有两个可选择值,yes或者no,以一定的概率出现;这样组成的序列,就是贝努利序列。而对于上面的分类问题,考虑每一维特征的时候,也是有两个选择:它在输入样本里,或者不在,这两个值至少有一个被考虑进去。而R维的输入向量,也是一个贝努利序列。


不过对于文本分类,还有一种做法,也是大家用朴素贝叶斯的时候自然而然选择的一个做法。这种选择,可能有独特的考虑,也可能是——对朴素贝叶斯模型的原始模型没有充分理解。总之,有这样的做法,效果还不一定比原始的朴素贝叶斯模型差。


【朴素贝叶斯——多项式模型】

这个模型和上面贝努利模型的关键区别有两个:

  1. 贝努利模型是以“文档”为统计单位,即统计某个特征词出现在多少个文档当中 (最大似然方法估计条件概率p(x(i)|c)的时候),当某个特征词在某一个文档中出现多次的时候,贝努利模型忽略了出现的次数,只算作一次。而多项式模型是以“词”为统计单位,当某个特征词在某个文档中多次出现的时候,与贝努利模型相反,它算作多次——这个更符合做NLP人的想法。
  2. 对特征向量中0值维度的处理。对于某个新的输入样本,当某个维度的取值是0的时候(也就是该特征词不出现在输入样本中),贝努利模型是要计算 p( x(i,0) | c(0)) 的值。而多项式模型直接忽略这样的特征,即只用 p( x(i,1) | c(0) ) 的值来进行计算,从而区分各个类别。

其中2是比较“激进”的,直接把bayes模型的基本计算方式改变了。

为什么叫多项式模型?我猜想啊,是将某个特征词是否出现,当做了多项式某项的系数。当特征词不出现的时候,系数为0,则该项的值对整个多项式的值没有影响——在多项式模型中,某个特征词不出现,则他的条件概率的值对样本对这个类别的条件概率的值也没有影响。


【QA】

说一下我在学习和实现这个模型的时候曾经疑惑的问题。有的现在看起来蛮幼稚的,学习的时候觉得自己已经掌握了这个模型,不过真的实现的时候,遇到下面的幼稚的问题,还是停下来花了些时间去思考。

问题一:

特征词的选择,或者说特征向量的确定,是每个类别都有不同的特征词集合(不同的特征向量),还是各个类别都共享一个特征词集合?

答:各个类别共享一个。

这个问题可以反过来想,如果每个类别一个特征词集合,那么每个集合中的特征词个数是否相同?在计算 p(c(k) | X) 的时候,如果X都不相同,那么条件概率 p(c(k) | X) 的值在k个类别中如何作比较?这些概率也不满足归一化条件啊(原则上是必须要满足的)。所以,各个类别共享一个特征词集合。

上面的思考过程很简单,在实际中,还会有一个推论。我在做文本过滤的时候,需要过滤色情文本,在特征选择之后,发现有些色情词语,如:”裸照“、”自慰“什么的都没有被选作特征词,而很多通用词汇在里面,我就将这些色情词手动加入到特征词集合当中,而删除通用词汇。其实要注意的是,对于正常文本,也有一些区分能力强的词语,就有可能是那些通用词汇,也要相应的保留在集合当中,不能只加入色情词语。形式化地说,色情词语是 p( x(i,1) | c(色情) ) 高的词语,固然需要加入,但是相应地也要保留 p( x(i,1) | c(正常) ) 高的词语在特征词集合。

还是用逆向思维来想,如果特征词集合当中只有色情词汇,那么当一个正常文本来分类的时候,文本不包含任意一个特征词,这样不论对正常类别还是对色情类别,条件概率 p(c(k) | X) 的值无法计算。则该样本无法被分类。有人说,这个例子太极端了。那么,一般色情短文本,自身包含的色情词汇也不是很多,通用中性词汇占大多数。很有可能,色情文本中的色情词汇不在特征词集合里面,通用词汇就更不在了,那么这个文本还是没有办法被分类。总而言之,特征词集合中对于每一类的特征词汇,都要包含一些,才能保证分类正常进行——对于c(k)来讲,至少对某个k,条件概率 p(c(k) | X)  可以计算。

问题二:

这个问题是针对”多项式模型“那一节的要点”2“的。上文说,多项式模型直接忽略 p( x(i,0) | c(0))  的特征。我们知道 p( x(i,1) | c(0) )的值都是小于1的,乘的越少,最终获得的概率越大——这和我们的直觉相悖。我们的直觉是,当某个文本,它包含某个类别的特征词越多,他就越有可能是某个类别的文本。但是事实是,当某个文本中,他一个特征词都不包含,反而计算出的概率是最大的。怎么回事?

答:

其实这个问题和”问题一“相关,或者说是解决了问题一,这个问题就解决了。为什么呢?因为特征向量对于每个类别都是相同的,那么某个特定的输入样本,它所包含的特征词子集,对于每个类别也是相同的,即对每个类别都是”公平的“。赖以分类的,是这些特征词在每个类别当中不同的条件概率值,以及每个类别的先验概率值 (朴素贝叶斯模型的基本参数),而不是这些词本身,或是他们的个数。换句话说,只要样本的特征词子集不是空集,那么子集里面的特征词,对于每个类别的条件概率都是不同的,最终样本对于每个类别的概率值也是不同的,这就足以将这个样本分类了(分到概率值最大的那个类别当中)。



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值