示例:使用朴素贝叶斯过滤垃圾邮件
示例:使用朴素贝叶斯对电子邮件进行分类 |
---|
(1) 收集数据:提供文本文件。 |
(2) 准备数据:将文本文件解析成词条向量。 |
(3) 分析数据:检查词条确保解析的正确性。 |
(4) 训练算法:使用我们之前建立的trainNB0()函数。 |
(5) 测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率。 |
(6) 使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上。 |
准备数据:切分文本
对于⼀个⽂本字符串, 可以使⽤Python的string.split()
⽅法将其切分。
>>> mySent='This book is the best book on Python or M.L. I have ever laid eyes upon.'
>>> mySent.split()
['This', 'book', 'is', 'the', 'best', 'book', 'on', 'Python', 'or', 'M.L.', 'I', 'have', 'ever', 'laid', 'eyes', 'upon.']
去除标点
可以使⽤正则表⽰式来切分句⼦, 其中分隔符是除单词、 数字外的任意字符串。
>>> import re
>>> regEx = re.compile('\\W*')
>>> listOfTokens = regEx.split(mySent)
__main__:1: FutureWarning: split() requires a non-empty pattern match.
>>> listOfTokens
['This', 'book', 'is', 'the', 'best', 'book', 'on', 'Python', 'or', 'M', 'L', 'I', 'have', 'ever', 'laid', 'eyes', 'upon', '']
>>>
去除空字符
,可以计算每个字符串的长度, 只返回长度⼤于0的字符串。
>>> [tok for tok in listOfTokens if len(tok) > 0]
['This', 'book', 'is', 'the', 'best', 'book', 'on', 'Python', 'or', 'M', 'L', 'I', 'have', 'ever', 'laid', 'eyes', 'upon']
Python中有⼀些内嵌的⽅法可以将字符串全部转换成⼩写(.lower())或者⼤写.upper())
>>> [tok.lower() for tok in listOfTokens if len(tok) > 0]
['this', 'book', 'is', 'the', 'best', 'book', 'on', 'python', 'or', 'm', 'l', 'i', 'have', 'ever', 'laid', 'eyes', 'upon']
现在来看数据集中⼀封完整的电⼦邮件的实际处理结果。 该数据集放在email⽂件夹中, 该⽂件夹又包含两个⼦⽂件夹, 分别是spam与ham。
>>> import re
>>> regEx = re.compile('\\W*')
>>> emailText = open('email/ham/6.txt').read()
>>> listOfTokens=regEx.split(emailText)
__main__:1: FutureWarning: split() requires a non-empty pattern match.
>>> listOfTokens
['Hello', 'Since', 'you', 'are', 'an',
....
'changes', 'to', 'Google', 'Groups', '']
测试算法: 使⽤朴素贝叶斯进⾏交叉验证
⽂件解析及完整的垃圾邮件测试函数
textParse()
接受⼀个⼤字符串并将其解析为字符串列表。该函数去掉少于两个字符的字符串, 并将所有字符串转换为⼩写。
# 文本解析
# 输入是字符串,输出是单词列表
def textParse(bigString):
# 导入正则表达式的包
import re
# 用正则表达式分割字符串
listOfTokens = re.split(r'\W*', bigString)
# 返回小写单词列表
return [tok.lower() for tok in listOfTokens if len(tok) > 2]
第⼆个函数spamTest()对贝叶斯垃圾邮件分类器进⾏⾃动化处理。
导⼊⽂件夹spam与ham下的⽂本⽂件, 并将它们解析为词列表
接下来构建⼀个测试集与⼀个训练集
网友评论