zoukankan      html  css  js  c++  java
  • 使用朴素贝叶斯算法简单实现垃圾邮件过滤之实现过程

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

    完整代码

    运行结果

  • 相关阅读:
    C++格式化输入输出
    算法的时间复杂度和空间复杂度
    C++编程中const和#define的区别
    C#中结构体和类的区别
    SQL之删除触发器
    Windows添加和取消右键管理员权限
    SQL之trigger(触发器)
    SQL VIEW(视图)
    二分查找的实现
    C++中this指针
  • 原文地址:https://www.cnblogs.com/love528/p/10133202.html
Copyright © 2011-2022 走看看