Chapter4 朴素贝叶斯案例

发布时间 2023-04-25 16:41:35作者: gao79138

朴素贝叶斯案例:过滤垃圾邮件


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

'''

'''
    需要注意的是:由于本案例中训练样本和测试样本是随机的,因此每次执行时,错误率都会不同。
'''