贝叶斯文本分类

jopen 8年前

1 、基本定义:

  分类是把一个事物分到某个类别中。一个事物具有很多属性,我们可以把它的众多属性转化为向量表示形式,即 x=(x1,x2,x3,…,xn) ,分别代表每个实例有n个属性值 实例的集合x 记为 X ,称为属性集。相应的类标签集合 C={c1,c2,…cm} ,X  C 的关系是不确定的,可以将X  C 看作是随机变量, P(C|X) 称为 C 的后验概率,与之相对的, P(C) 称为 C 的先验概率。后验概率是需要计算算出来的,先验概率是天生就知道的,不需要复杂公式求解。

  根据贝叶斯公式,后验概率 P(C|X)=P(X|C)P(C)/P(X) ,但在比较不同 C 值的后验概率时,分母 P(X) 总是常数,我们可以把它忽略掉,后验概率 P(C|X)=P(X|C)P(C) ,先验概率 P(C) 可以通过计算训练集中属于每一个类的训练样本所占的比例,容易估计,对类条件概率P(X|C) 的估计,这里我只说朴素贝叶斯分类器方法,因为 朴素贝叶斯假设事物属性之间相互条件独立, P(X|C) = ∏P(xi|ci) 。

2 、文本分类过程

例如文档: Love makes all hard hearts gentle. 可以用一个文本特征向量来表示, x=(Love, makes, all, hard, hearts , gentle) 

在文本分类中,我们首先需要准备一些打上标签的训练样本,这里的打标签就是分类的类别C中元素

朴素贝叶斯分类器是一种监督学习模型,常见有两种模型,多项式模型 (Multinomial Model) 即词频型和伯努利模型 (Bernoulli Model) 即文档型。二者的计算粒度不一样,多项式模型以单词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。

计算后验概率时,对于一个文档 d ,在多项式模型中,只有在 d 中出现过的单词,才会参与后验概率计算,而在伯努利模型中,没有在 d 中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为  反例  参与的。这里暂不考虑特征抽取、为避免消除测试文档时类条件概率中有为 0 现象而做的取对数等问题。

2.1 多项式模型

1 )基本原理

在多项式模型中,   设某文档 d=(t1,t2,…,tk)  tk 是该文档中出现过的单词,允许重复,则

先验概率 P(c)=   c 下单词总数 / 整个训练样本的单词总数

类条件概率 P(tk|c)=(  c 下单词 tk 在各个文档中出现过的次数之和 +1)/(  c 下单词总数 +|V|)

V 是训练样本的单词表(即抽取单词,单词出现多次,只算一个), |V| 则表示训练样本包含多少种单词。  P(tk|c) 可以看作是单词 tk 在证明 d 属于类 c 上提供了多大的证据,而 P(c) 则可以认为是类别 c 在整体上占多大比例 ( 有多大可能性 ) 

2 )举例

给定一组分好类的文本训练数据,如下:

docId
doc
类别abusive?
1 my dog has flea problems help please
no
2 maybe not take him to dog park stupid
yes
3 my dalmation is so cute I love him
no
4 stop posting stupid worthless garbage
yes
5 mr licks ate my steak how to stop him no
6 quit buying worthless dog food stupid yes

给定一个新样本 I love love my stupid dalmation ,对其进行分类。该文本用属性向量表示为 d=(I, love, love, my, stupid, dalmation) ,类别集合为 Y={yes, no} 

 yes 下总共有 19 个单词,类 no 下总共有 24 个单词,训练样本单词总数为 43 ,因此P(yes)=19/43, P(no)=24/43 。类条件概率计算如下:

P(I | yes)=(0+1)/(19+32)=1/51

P(love | yes)=(0+1)/(19+32)=1/51,此处有两个love,均为1/56

P(my | yes)=(0+1)/(19+32)=1/51

P(stupid | yes)=(3+1)/(19+32)=4/51

P(dilmation | yes)=(0+1)/(19+32)=1/51

P(I | no)=(1+1)/(24+32)=2/56

P(love | no)=(1+1)/(24+32)=2/56,此处也是两个love均为2/56

P(my | no)=(3+1)/(24+32)=4/56

P(stupid | no)=(0+1)/(24+32)=1/56

P(dilmation | no)=(1+1)/(24+32)=2/56

分母中的 19,是指 yes 类别下 textc 的长度,也即训练样本的单词总数, 32 是指训练样本有 32个不重复的单词 24 是指 no 类下共有 24 个单词。

有了以上类条件概率,开始计算后验概率:

P(yes | d)=(1/51) 5 ×4/51   ×19/43=76/756640375443≈1.0044401867334042e-10

P(no | d)= (2/56) 4 ×4/56×1/56    ×24/43=1536/1326162116608≈1.1582294357259384e-09

比较大小,即可知道这个文档属于类别 no,也就是非abusive的 

2.2 伯努利模型

1 )基本原理

P(c)=   c 下文件总数 / 整个训练样本的文件总数

P(tk|c)=(  c 下包含单词 tk 的文件数 +1)/(  c 下文件总数 +2)

2 )举例

使用前面例子中的数据,模型换成伯努利模型。

 yes 下总共有 3 个文件,类 no 下有3 个文件,训练样本文件总数为6 ,因此P(yes)=1/2, P(my | yes)=(0+1)/(3+2)=1/5 

P(dog | yes)=(2+1)/(3+2)=3/5,把所有的43个单词的条件概率都计算出来,同理把no类别下的43个单词的条件概率也都计算出来

有了以上类条件概率,开始计算后验概率,

P(yes|d)=P(yes)×P(I|yes)×P(love|yes)×P(my|yes)×P(stupid|yes)×P(dalmation|yes)×(1-P(my|yes))×(1-P(...|yes))(其余所有的单词都是1-P()的形式)

同理P(no|d)计算过程相同,此处就不罗列计算了。

计算结果谁大就是哪个类别,具体数字我就不算了,最终结果也可能与多项式模型给出的结果不一致 

后记: 文本分类是作为离散型数据的,朴素贝叶斯用于很多方面,数据就会有连续和离散的,连续型时可用正态分布,还可用区间,将数据的各属性分成几个区间段进行概率计算,测试时看其属性的值在哪个区间就用哪个条件概率。再有 TF、TDIDF,这些只是描述事物属性时的不同计算方法,例如文本分类时,可以用单词在本文档中出现的次数描述一个文档,可以用出现还是没出现即0和1来描述,还可以用单词在本类文档中出现的次数与这个单词在剩余类出现的次数(降低此属性对某类的重要性)相结合来表述。