朴素贝叶斯案例:过滤垃圾邮件
1. 案例的流程
示例:使用朴素贝叶斯对电子邮件进行分类
(1)收集数据:提供文本文件。
(2)准备数据:将文本文件解析成词条向量。
(3)分析数据:检查词条确保解析的正确性。
(4)训练算法:使用我们之前建立的trainNB0()函数。
(5)测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率。
(6)使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上。
2. 文件解析函数
# 该函数的作用是用于分割文本,以便于生成词汇列表
# 该函数位于bayes.py文件中
def textParse(bigString):
import re
# 这里通过正则表达式来分割样本
# 该正则表达式的含义为:以非字母数字下划线为标志进行分割(长度为0个或无限个)
listOfTokens = re.split(r'\W*',bigString)
# 返回分割之后的样本,单词(词条)要求:长度大于2且均为小写
return [ tok.lower() for tok in listOfTokens if len(tok) > 2]
3. 垃圾邮件测试函数
# 该函数的作用是用于分类垃圾邮件并测试错误率
# 该函数位于bayes.py文件中
def spamTest():
docList = [] # 代表分割词条之后的样本列表
classList = [] # 代表样本的类别列表
fullText = [] # 代表存储所有的词条列表
for i in range(1,26): # 共有25个文件
wordList = textParse(open('email/spam/%d.txt' % i).read()) # 导入电子邮件(垃圾),分割样本,生成词条列表
docList.append(wordList) # 添加样本列表
fullText.extend(wordList) # 添加样本里面的单词
classList.append(1) # 添加该样本所属的类别(1为垃圾邮件,0为非垃圾邮件)
wordList = textParse(open('email/ham/%d.txt' % i).read()) # 导入电子邮件(正常)
docList.append(wordList)
fullText.extend(wordList)
classList.append(0)
vocabList = createVocabList(docList) # 生成单词列表,进而可以生成词条向量
trainSet = list(range(50))
testSet = []
# 以下代码用于从训练集里随机构建测试集,并在训练集中删除相应的测试样本
for i in range(10):
# random.uniform 方法代表生成一个指定范围的随机浮点数,该范围区间左闭右开
# 随机从训练集中选择一个样本作为测试样本
randIndex = int(random.uniform(0,len(trainSet)))
testSet.append(randIndex)
del(trainSet[randIndex])
trainMat = [] # 创建训练矩阵,存储的都是训练样本的词条向量
trainClasses = [] # 代表训练样本的类别
for docIndex in trainSet:
trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
trainClasses.append(classList[docIndex])
# 通过贝叶斯计算三个概率
p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses)) # pSpam代表垃圾邮件的概率
errorCount = 0 # 代表错误分类的样本计数器
for docIndex in testSet:
wordVector = setOfWords2Vec(vocabList,docList[docIndex]) # 生成测试样本的词条向量
forecastClass = classifyNB(array(wordVector),p0V,p1V,pSpam)
realClass = classList[docIndex]
if forecastClass != realClass: # 如果预测的类别与实际类别不符合
errorCount+=1
print('the error class is: %s ---- the real class is %s' % (forecastClass,realClass))
print('the error rate is:', float(errorCount) / len(testSet)) # 计算错误率
# 该函数的作用是用于测试
# 该函数位于personalTest.py文件中
import baye1
baye1.spamTest()
'''
the error class is: 1 ---- the real class is 0
the error class is: 1 ---- the real class is 0
the error rate is: 0.2
the error class is: 1 ---- the real class is 0
the error class is: 1 ---- the real class is 0
the error class is: 1 ---- the real class is 0
the error class is: 1 ---- the real class is 0
the error class is: 1 ---- the real class is 0
the error rate is: 0.5
'''
'''
需要注意的是:由于本案例中训练样本和测试样本是随机的,因此每次执行时,错误率都会不同。
'''
标签:real,词条,Chapter4,样本,贝叶斯,----,error,class,朴素
From: https://www.cnblogs.com/gao79135/p/17353082.html