一、算法介绍

二、实现过程

实验步骤

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

完整代码

 

运行结果