在前面那个简单的例 子 中,我们引人了字符串列表。使用朴素贝叶斯解决一些现实生活中 的 问 题 时 ,需要先从文本内容得到字符串列表,然后生成词向量。下 面 这 个 例 子 中,.我们将了 解朴素贝叶斯的一个最著名的应用:电子邮件垃圾过滤。首先看一下如何使用通用框架来解决 该 问 题 。
4 . 6
示 例 :使 用朴 素 贝叶 斯 过滤 垃圾 邮 件65
示例:使用朴素贝叶斯对电子邮件进行分类 ' ;
(1)
收集数据:提供文本文件。(2)
准备数据:将文本文件解析成词条向量。(3)
分 析数据:检查词条确保解析的正确性。(4)
训练算法 :使用我们之前建立的匕31
恤80()
函数。(5)
测试算法:使用clasSifyN B ( >
,并且构建一个新的测试函数来计算文档集的错误率。(6)
使 用 算 法 :构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上。下面首先给出将文本解析为词条的代码。然后将该代码和前面的分类代码集成为一个函数,
该函数在测试分类器的同时会给出错误率。
4 . 6 . 1 准 备 数 据 :切分文本
前一节介绍了如何创建词向量,并基于这些词向量进行朴素贝叶斯分类的过程。前一节中的 词向量是预先给定的,下面介绍如何从文本文档中构建自己的词列表。
对于一个文本字符串,可以使用
?
沖(^
的3
匕11^.
印1 ^ 0
方法将其切分。下面看看实际的 运行效果。在?¥
也(^
提示符下输人:>>> m y S e n t = 1 This book is the best book on Python or M.L. I have ever laid W eyes u p o n .1
>>> m y S e n t .s p l i t ()
[ 'This1, 'b o o k ', _is_, 1 t h e ', 'b e s t 1, 'b o o k ', 1o n 1, 1 P y t h o n ', 1o r1, _M.L._,
*I', 'h a v e '; 'e v e r ', 'laid1, 'e y e s1, 1 u p o n . 1]
可以 看 到 ,切分的结果不错,但是标点符号也被当成了词的一部分。可以使用正则表示式来切分 句 子 ,其中分隔符是除单词、数字外的任意字符串。
>>> import re
>>> regEx = r e .c o m p i l e (1\ \ W * 1)
>>> listOfTokens = regEx.split(mySent)
>>> listOfTokens
[1 T h i s '7 1 b o o k ', 1 is 1, 't h e', ' be st 1, 'book', 1 o n 1, 'P y t h o n 1, ,o r,,'M', 1L1, 1 ', 'I_, 1 have 1, 1 e v e r1, _laid_, 1 e y e s ', 'upon 1, ■_]
现在得到了一系列词组成的词表,但是里面的空字符串需要去掉。可以计算每个字符串的长度,
只返回长度大于
0
的字符串。>>> [tok for tok. in listOfTokens if len (tok) > 0]
最 后 ,我们发现句子中的第一个单词是大写的。如果目的是句子査找,那么这个特点会很有用。
但这里的文本只看成词袋,所以我们希望所有词的形式都是统一的,不论它们出现在句子中间、
结尾还是开头。
卩
>^00
中有一些内嵌的方法,可以将字符串全部转换成小写(
.lower ())
或者大写( .upper
( ) ),借助这些方法可以达到目的。于 是 ,可以进行如下处理:
>>> [tok.l o w e r () for tok in listOfTokens if len(tok) > 0]
66
第4
章 基 于 概 率 论 的 分 类 方 法 :朴 素贝叶斯4 . 6
示 例 :使用朴素贝叶斯 过滤垃 圾邮 件67
print 'the error rate is: 1,float(errorCount)/len(testSet)
第 一 个 函 数(:65^ 1^ ^ 3 ()接受一个大字符串并将其解析为字符串列表。该函数去掉少于两