码迷,mamicode.com
首页 > 编程语言 > 详细

使用朴素贝叶斯算法简单实现垃圾邮件过滤之算法介绍实现过程

时间:2018-12-17 20:12:07      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:int   lov   垃圾邮件   邮件   evo   dataset   相加   imp   lower   

一、算法介绍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  # 返回属于正常邮件类的条件概率数组,属于侮辱垃圾邮件类的条件概率数组,文档属于垃圾邮件类的概率

完整代码

 

运行结果

使用朴素贝叶斯算法简单实现垃圾邮件过滤之算法介绍实现过程

标签:int   lov   垃圾邮件   邮件   evo   dataset   相加   imp   lower   

原文地址:https://www.cnblogs.com/love528/p/10133202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!