美文网首页
使用贝叶斯过滤邮件

使用贝叶斯过滤邮件

作者: Yonginggg | 来源:发表于2019-08-03 10:42 被阅读0次

示例:使用朴素贝叶斯过滤垃圾邮件

示例:使用朴素贝叶斯对电子邮件进行分类
(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下的⽂本⽂件, 并将它们解析为词列表

接下来构建⼀个测试集与⼀个训练集

相关文章

网友评论

      本文标题:使用贝叶斯过滤邮件

      本文链接:https://www.haomeiwen.com/subject/lbtjdctx.html