基于朴素贝叶斯分类算法的邮件过滤系统

转自穆晨

阅读目录

回到顶部

前言

朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统。

本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现。

本文侧重于工程实现,至于其中很多算法的细节请参考之前的一篇文章:朴素贝叶斯分类算法原理分析与代码实现

回到顶部

准备数据:切分文本

获取到文本文件之后,首先要做的是两件事情:

1. 将文本文件转换为词汇列表

2. 将上一步的结果进一步转换为词向量

对于 1,具体来说,就是将文本文件以非字母或数字之外的字符为界进行切割。

仅仅使用字符串的 split 函数实现起来很麻烦,而Python中真正处理文本的利器是正则表达式,使用正则表达式可轻易实现这个任务。

如下函数可用于实现1:

 1 #=============================================
 2 #    输入:
 3 #        bigString:       待转换文档字符串
 4 #    输出:
 5 #        待转换文档的列表格式
 6 #=============================================
 7 def textParse(bigString):
 8     import re
 9     listOfTokens = re.split(r‘\W*‘, bigString)
10     return [tok.lower() for tok in listOfTokens if len(tok) > 2]

注意,由于切分后的结果有可能出现空格符,因此在返回时再加了一层过滤。

关于正则表达式的具体用法不属于本文讲解范围,有兴趣的读者请自行查阅相关资料。

对于2,在上一篇文章:朴素贝叶斯分类算法原理分析与代码实现中已经有过实现的范例,这里就不再累述。

回到顶部

训练并测试

1. 从代码中指定路径的目录中查找邮件(不同分类的两个目录),搜集所有邮件信息并将其转换为词向量格式。

2. 将这部分数据再分为训练集部分和测试集部分。

3. 调用朴素贝叶斯分类函数对数据集进行训练,得到贝叶斯公式中的各个概率子项。

4. 求出待分类文档的词向量并继续完成此贝叶斯公式来计算该词向量的属于各分类的概率。取其中最大概率为分类结果。

5. 将上一步得到的分类结果和实际结果对照,打印最终测试信息。

如下代码用于训练及测试:

 1 #=============================================
 2 #    输入:
 3 #        vocabList:     词汇列表
 4 #        inputSet:       待转换文档的列表格式
 5 #    输出:
 6 #        returnVec:    转换后的词向量(词袋模型)
 7 #=============================================
 8 def bagOfWords2VecMN(vocabList, inputSet):
 9     ‘文档(列表格式) -> 词向量(词袋模型)‘
10
11     returnVec = [0]*len(vocabList)
12     for word in inputSet:
13         if word in vocabList:
14             returnVec[vocabList.index(word)] += 1
15
16     return returnVec
17
18 #=============================================
19 #    输入:
20 #        代码内指定路径的两种分类邮件
21 #    输出:
22 #        空 (打印贝叶斯分类测试的结果)
23 #=============================================
24 def spamTest():
25     ‘测试贝叶斯分类并打印结果‘
26
27     # 文档字符串集合
28     docList=[]
29     # 文档分类集合
30     classList = []
31     # 所有字符串
32     fullText =[]
33
34     # 从两种分类邮件中各取出25封邮件,获得文档字符串集合,文档分类集合,所有字符串。
35     for i in range(1,26):
36         wordList = textParse(open(‘/home/fangmeng/email/spam/%d.txt‘ % i).read())
37         docList.append(wordList)
38         fullText.extend(wordList)
39         classList.append(1)
40         wordList = textParse(open(‘/home/fangmeng/email/ham/%d.txt‘ % i).read())
41         docList.append(wordList)
42         fullText.extend(wordList)
43         classList.append(0)
44
45     # 词汇表
46     vocabList = createVocabList(docList)
47     # 训练集范围
48     trainingSet = range(50)
49     # 测试集范围
50     testSet=[]
51
52     # 这总共50封邮件里,取10封用来做分类测试。
53     # 同时将这10封测试邮件从训练集范围内移除。
54     for i in range(10):
55         randIndex = int(random.uniform(0,len(trainingSet)))
56         testSet.append(trainingSet[randIndex])
57         del(trainingSet[randIndex])
58
59     # 训练集词向量矩阵
60     trainMat=[]
61     # 训练集分类列表
62     trainClasses = []
63
64     # 构建训练集词向量矩阵和训练集分类列表
65     for docIndex in trainingSet:
66         trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))
67         trainClasses.append(classList[docIndex])
68
69     # 对训练集中邮件进行分类测试并打印测试结果
70     p0V,p1V,pSpam = trainNB0(numpy.array(trainMat),numpy.array(trainClasses))
71     errorCount = 0
72     for docIndex in testSet:
73         wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])
74         if classifyNB(numpy.array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
75             errorCount += 1
76             print "错误分类:\n",docList[docIndex]
77     print ‘错误率: \n‘,float(errorCount)/len(testSet)

打印结果大致如下(测试集为随机选取,故每次执行可能不同):

回到顶部

小结

1. 文档解析在具体的文档分类项目中占有很大比重。完美的文档解析可通过正则表达式达到。

2. 在项目实现时,尽可能使用Python的一些工具(如正则表达式),或者第三方库(如numpy),能很大程度提高开发效率。

时间: 2024-11-08 17:31:04

基于朴素贝叶斯分类算法的邮件过滤系统的相关文章

第六篇:基于朴素贝叶斯分类算法的邮件过滤系统

前言 朴素贝叶斯算法最为广泛而经典的应用毫无疑问是文档分类,更具体的情形是邮件过滤系统. 本文详细地讲解一个基于朴素贝叶斯分类算法的邮件过滤系统的具体实现. 本文侧重于工程实现,至于其中很多算法的细节请参考之前的一篇文章:朴素贝叶斯分类算法原理分析与代码实现. 准备数据:切分文本 获取到文本文件之后,首先要做的是两件事情: 1. 将文本文件转换为词汇列表 2. 将上一步的结果进一步转换为词向量 对于 1,具体来说,就是将文本文件以非字母或数字之外的字符为界进行切割. 仅仅使用字符串的 split

《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现

============================================================================================ <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记,包括对当中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的全部算法源码和算法所用到的源文件,有须要的留言 ====================================================

基于朴素贝叶斯分类器的文本分类算法

源代码下载:NaviveBayesClassify.rar Preface 文本的分类和聚类是一个比较有意思的话题,我以前也写过一篇blog<基于K-Means的文本聚类算法>,加上最近读了几本数据挖掘和机器学习的书籍,因此很想写点东西来记录下学习的所得. 在本文的上半部分<基于朴素贝叶斯分类器的文本分类算法(上)>一文中简单介绍了贝叶斯学习的基本理论,这一篇将展示如何将该理论运用到中文文本分类中来,具体的文本分类原理就不再介绍了,在上半部分有,也可以参见代码的注释. 文本特征向量

数据挖掘系列(8)朴素贝叶斯分类算法原理与实践

隔了很久没有写数据挖掘系列的文章了,今天介绍一下朴素贝叶斯分类算法,讲一下基本原理,再以文本分类实践. 一个简单的例子 朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下: 这个公式虽然看上去简单,但它却能总结历史,预知未来.公式的右边是总结历史,公式的左边是预知未来,如果把Y看出类别,X看出特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来. 举个例子,大学的时候,某男生经常去图

基于C#的机器学习--垃圾邮件过滤

在这一章,我们将建立一个垃圾邮件过滤分类模型.我们将使用一个包含垃圾邮件和非垃圾邮件的原始电子邮件数据集,并使用它来训练我们的ML模型.我们将开始遵循上一章讨论的开发ML模型的步骤.这将帮助我们理解工作流程. 在本章中,我们将讨论以下主题: l  定义问题 l  准备数据 l  数据分析 l  构建数据的特征 l  逻辑回归与朴素贝叶斯的Email垃圾邮件过滤 l  验证分类模型 定义问题 让我们从定义本章要解决的问题开始.我们可能已经对垃圾邮件很熟悉了;垃圾邮件过滤是众电子邮件服务的基本功能.

朴素贝叶斯分类算法(3)

转自:http://www.letiantian.me/2014-10-12-three-models-of-naive-nayes/ 朴素贝叶斯是一个很不错的分类器,在使用朴素贝叶斯分类器划分邮件有关于朴素贝叶斯的简单介绍. 若一个样本有n个特征,分别用[latex]x_{1},x_{2},...,x_{n}[/latex]表示,将其划分到类[latex]y_{k}[/latex]的可能性[latex]P(y_{k}|x_{1},x_{2},...,x_{n})[/latex]为: [late

朴素贝叶斯分类算法介绍及python代码实现案例

朴素贝叶斯分类算法 1.朴素贝叶斯分类算法原理 1.1.概述 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据 朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种 注:朴素的意思是条件概率独立性 P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立 P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z) 1.2.算法思想 朴素贝叶斯的思想是这样的: 如果一个事物在一些属性条件发生

朴素贝叶斯分类算法(1)

转自http://blog.csdn.net/lch614730/article/details/17031145 朴素贝叶斯分类算法(Naive Bayesian classification) PS:本文在讲解的时候会用通俗的例子来讲解 本文我们将学习到: (1)什么是朴素贝叶斯? (2)先验概率和条件概率是如何证明的? (3)文本分类的多项式模型和伯努利模型(附加例子说明) (4)垃圾邮件的分类及代码的演示(暂缺以后会补上) (1)什么是朴素贝叶斯(Naive Bayes,以后简称NB)?

朴素贝叶斯分类算法原理分析与代码实现

前言 本文介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现. 词向量 朴素贝叶斯分类算法常常用于文档的分类,而且实践证明效果是挺不错的. 在说明原理之前,先介绍一个叫词向量的概念. --- 它一般是一个布尔类型的集合,该集合中每个元素都表示其对应的单词是否在文档中出现. 对应关系和词汇表一一对应. 比如说,词汇表只有三个单词:'apple', 'orange', 'melo',某文档中,apple和melo出现过,那么其对应的词向量就是 {1, 0, 1}. 这种模型