基于概率论的分类方法:朴素贝叶斯
使用朴素贝叶斯进行文档分类
在文档分类中,整个文档(比如一封电子邮件)是实例,而电子邮件中的某些元素则构成特征。我们可以观察文档中出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词目一样多。
朴素贝叶斯的一般过程:
1. 收集数据
2. 准备数据:需要数值型或布尔型数据
3. 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好
4. 训练算法:计算不同的独立特征的条件概率
5. 测试算法:计算错误率
6. 使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意分类场景中使用bayes分类器,不一定非要是文本。
注意:朴素贝叶斯分类器通常有两种实现方式:一种基于贝努利模型实现,一种基于多项式模型实现。在本文中采用的实现方式是前一种,只考虑出不出现,不考虑词在文档中出现的次数。
1、准备数据:从文本中构建词向量
把文本看成单词向量或词条向量,也就是说将句子转换为向量。所以必须要将文档转换为词汇表上的向量。然后才考虑出现在所有文档中的所有单词纳入所要的词汇集合或词汇表中。
我们将每个词是否出现作为一个特征,这属于词集模型(setOfWords2Vec())。
如果一个词在文档中出现不止一次,这可能意味着其包含了更多的信息,这种属于词袋模型(bagOfWords2VecMN())。
1、训练算法-从词向量计算概率(trainNB0)
伪代码:
计算每个类别中的文档数目
对每篇训练文档:
对每个类别:
如果词条出现文档中—增加该词条的计数值
增加所有词条的计数值
对每个类别:
对每个词条:
将该词条的数目除以总词条数目得到条件概率
返回每个类别的条件概率3、测试朴素贝叶斯
可以从以下两点对分类器进行修改:
1) 贝叶斯概率需要计算多个概率的乘积以获得文档属于某个类别的概率。如果其中一个概率值为0,那么最后的乘积也为0
2) 下溢出。程序可能出现下溢出或无法得到正确答案,解决的办法是对乘积取自然对数,这样可以避免下溢出或浮点数舍入导致的错误。
注意:每个单词的是否出现被当做一个特征,这被称为词集模型。但在词袋模型中,每个单词可以出现多次。
4、使用算法
A、过滤垃圾电子邮件
一般流程:
(1) 收集数据:提供文本文件
(2) 准备数据:将文本文件解析成词条向量
(3) 分析数据:检查词条确保解析的正确性
(4) 训练算法:使用之前建立的trainNB0()函数
(5) 测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率
(6) 使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上。
1、切分文本split()
将长字符串切分成词表,包括将大写字符转换成小写,并过滤字符长度小于3的字符。
下面演示的依次是:
Python自带切分文本函数split(),其包含标点。
正则表达式切分,包含空字符。(见listOfTokens)
去掉空字符
修改大写字母为小写字母2、使用朴素贝叶斯进行垃圾邮件分类:垃圾邮件测试spamTest()
注意:这里训练测试的方法是从总的数据集中随机选择数字,将其添加到测试集中,同时将其从训练集中剔除。这种随机选择数据的一部分作为训练集,而剩余部分作为测试集的过程为留存交叉验证(hold-out cross validation)。有时为了更精确地估计分类器的错误率,就应该进行多次迭代后求出平均错误率。
B、使用bayes分类器从个人广告中获取区域倾向
一般流程:
(1) 收集数据:从RSS源收集内容,这里需要对RSS源构建一个接口
(2) 准备数据:将文本文件解析成词条向量
(3) 分析数据:检查词条确保解析的正确性
(4) 训练算法:trainNB0()
(5) 测试算法:观察错误率,确保分类器可用。可以修改切分程序,以降低错误率,提高分类结果
(6) 使用算法:构建一个完整的程序,封装所有内容。给定两个RSS源,该程序会显示最常用的公共词。
我并没有进行实验,所以只给出大致的流程。bayes资源:
http://download.****.net/download/qq_34385827/9948675
代码注释非常的详细,希望可以帮助大家更好的理解。
以后会把对应的算法理论都放到模式识别类别里,需要的可以去那边瞅一瞅。
拜嘞个拜,今儿就到这了!祝大家一切顺利