使用朴素贝叶斯算法简单实现垃圾邮件过滤之算法介绍实现过程
Posted love528
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用朴素贝叶斯算法简单实现垃圾邮件过滤之算法介绍实现过程相关的知识,希望对你有一定的参考价值。
一、算法介绍https://www.cnblogs.com/love528/p/10125089.html
二、实现过程
实验步骤
(1)收集数据:提供文本文件。
(2)准备数据:将文本文件解析成词条向量。
(3)分析数据:检查词条确保解析的正确性。
(4)训练算法:计算不同的独立特征的条件概率。
(5)测试算法:计算错误率。
(6)使用算法:构建一个完整的程序对一组文档进行分类。
主要代码解析
(1) 分词
使用正则表达式将邮件文本其划分成一个个单词的形式
import re
def textParse(bigString):
listOfTokens = re.split(r‘W*‘, bigString)
return [tok.lower() for tok in listOfTokens if len(tok) > 2]
(2) 生成词汇表
将所有的邮件进行分词后生成一个dataSet,然后生成一个词汇表,这个词汇表是一个集合,即每个单词只出现一次。
def createVocabList(dataSet):
vocabSet = set([]) # 创建一个空的不重复列表
for document in dataSet:
vocabSet = vocabSet | set(document) # 取并集
return list(vocabSet)
(3) 生成词向量
每一封邮件的词汇都存在了词汇表中,因此将每一封邮件生成一个词向量,若该词汇存在于词汇表中,对应位置则为1,不存在为0,这里词向量的维度与词汇表相同。
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0] * len(vocabList) # 创建一个元素都为0的向量
for
word in
inputSet:
if
word in
vocabList:
# 如果词条存在于词汇表中,则置1
returnVec[vocabList.index(word)] = 1 # 查找单词索引
else:
print("the word: %s is
not in my Vocabulary!" % word)
return
returnVec
# 返回文档向量
(4) 训练算法
计算Pr(W|S)、Pr(W|H),Pr( |S)表示在垃圾邮件的条件下第i个特征的概率,首先将所有的类别为1的词向量相加,可以得到每个特征的个数,除以类别为1的单词总数就是垃圾邮件中每个单词的概率。
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix) # 计算训练的文档数目
numWords = len(trainMatrix[0]) # 计算每篇文档的词条数
pAbusive = sum(trainCategory) / float(numTrainDocs) # 文档属于垃圾邮件类的概率
p0Num = np.ones(numWords)
p1Num = np.ones(numWords) # 创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
p0Denom = 2.0
p1Denom = 2.0 # 分母初始化为2 ,拉普拉斯平滑
for i in
range(numTrainDocs):
if
trainCategory[i] == 1: # 统计属于侮辱类的条件概率所需的数据,即P(w0|1),P(w1|1),P(w2|1)···
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else: # 统计属于非侮辱类的条件概率所需的数据,即P(w0|0),P(w1|0),P(w2|0)···
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p1Vect = np.log(p1Num / p1Denom)
p0Vect = np.log(p0Num / p0Denom) # 取对数,防止下溢出
return p0Vect, p1Vect, pAbusive # 返回属于正常邮件类的条件概率数组,属于侮辱垃圾邮件类的条件概率数组,文档属于垃圾邮件类的概率
完整代码
运行结果
以上是关于使用朴素贝叶斯算法简单实现垃圾邮件过滤之算法介绍实现过程的主要内容,如果未能解决你的问题,请参考以下文章