机器学习 一个重要应用就是文档的自动分类。可以观察文档出现的词,并把每个词 出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词目一样多。朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法。
朴素贝叶斯的一般过程
由统计学知,如果每个特征需要N个样本,那么对于1000个特征的词汇表将需要N1000个样本。所需要的样本数会随着特征数目增大而迅速增长。如果特征之间相互独立,那么样本数可以从N1000减少到100 x N。
所谓独立(independence),指的是统计意义上的独立,即一个特征或单词出现的可能性与它和其它单词相邻没有关系。例如:单词bacon出现在unhealty后面与出现在delicious后面的概率相同。当然这种假设并不正确,bacon常常出现在delicious附近,而很少出现在unhealthy附近,这个假设正是朴素(naive)的含义。
朴素贝叶斯另一个假设时,所有特征值同等重要 。 其实这个假设也有问题。
朴素贝叶斯分类器通常有两种实现方式:一种基于贝努利模型实现,一种基于多项式模型实现。基于贝努利模型,不考虑词在文档中出现的次数,只考虑出不出现,因此在这个意义上相当于假设词是等权重的。
要从文本中获取特征,需要先拆分文本。
其做法是:这里的特征是来自文本的词条(token),一个词条是字符的任意组合。可以把词条想象为单词,也可以使用非单词词条,如URL、IP地址或者任意其他字符串。然后针每一个文本片段表示为一个词条向量,其中值为1表示词条出现在文档中,0表示词条未出现。
以留言板为例,要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。对此问题建立两个类别:侮辱类和非侮辱类,使用1和0分别表示 。
创建一个bayes.py
def loadDataSet():
postingList=[['my','dog','has','flea', 'problems','help','please'],
['maybe','not','take','hime','to','dog','park','stupid'],
['my','dalmation','is','so','cute','I','love','hime'],
['stop','posting','stupid','worthless','garbage'],
['mr','licks','ate','my','steak','how','to','stop','hime'],
['quit','buying','worthless','dog','food','stupid']]
classVec = [0,1,0,1,0,1]
return postingList,classVec
def createVocabList(dataSet):
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document)
return list(vocabSet)
def setOfWords2Vec(vocabList,inputSet):
returnVec [0]*len(vocabList)
for word in inputSet:
if word in vocabList:
returnVec[vocabList.index(word)] = 1
else: print "the word: %s is not in my Vocabulary!" % word
return returnVec
函数loadDataSet()创建一些实验样本。函数返回的第一个变量是词条切分后的文档集合。
createVocabList()会创建一个包含在所有文档中出现的不重复词的列表。
setOfWords2Vec该函数的输入参数为词汇表及某个文档,输出的是文档向量,向量的每一元素 1或0.
同一条词条在不同类型的文本中出现的频繁通常并不一样,很多词条只会在某些类别的文本中出现,如“微软”、“谷歌”等词条极少出现在战争类题材的文本中,而“黑莓”、“3G”等极少出现在健康类题材的文本中。词条先验概率计算通过提取不同类别中的样本的词条,分析其在所有类别中出现的概率,它会以词条为键值,生成词条先验概率哈希数组(在Python中称为字典结构),以供后期分类算法使用。
根据相互贝叶斯的先验概率计算公式来看,在后期计算中,需要计算词条先验概率累乘。如某词在某类型的样本中从来没有出现,其概率为0,这样将会使累乘结果变为0,算法变得毫无意义。在计算先验概率后,在每个词条的先验概率基础上加上一个适当的较小的概率值,防止累乘出现0.此外,某词在某类型的所有样本中未出现,不代表该词不会出现在该类型的所有文本中,因此,这个较小概率值非常有必要加入先验概率的计算中。
对未知文本分类时,需要计算后验概率,对于在文本中出现的词条,提取其在先验概率哈希数组中的概率值。然后分别计算不同类型哈希数组中出现的词条的验概率累乘,从而得到未知文本属于不同类型的后验概率,其中,最大概率所属类别即为未知文本所属类别。
通常来说,一个分类效果较好的朴素贝叶斯算法,其每个类别的样本数量大致有2000~10000个。近年来,基于朴素贝叶斯分类的改进算法越来越多,最普遍的是在算法中加入权重的影响,针对某些关键词或中心词加上权重,这种方法称为加权朴素贝叶斯算法。可以查询:《厦门大学学报:自然科学版》2012年第4期上饶丽丽等的文章《基于特征相关的改进加权朴素贝叶斯分类算法》。