首页 > 编程语言 >【Python机器学习】朴素贝叶斯——使用朴素贝叶斯过滤垃圾邮件

【Python机器学习】朴素贝叶斯——使用朴素贝叶斯过滤垃圾邮件

时间:2024-07-29 16:55:15浏览次数:12  
标签:wordList Python docIndex 贝叶斯 tok 朴素 字符串 trainingSet append

使用朴素贝叶斯解决一些现实生活中的问题时,需要先从文本内容中得到字符串列表,然后生成词向量。

使用朴素贝叶斯对电子邮件进行分类的过程:

1、收集数据:提供文本文件

2、准备数据:将文本文件解析成词条向量

3、分析数据:检查词条确保解析的正确性

4、训练算法

5、测试算法:构建一个新的测试函数来计算文档集的错误率

6、使用算法:构建一个完整的程序对一组文档进行分类,输出错分的文档。

准备数据:切分文本

对于一个文本字符串,可以使用Python的string.split()方法将其切分。但是这种方法下,标点符号也会被当成词的一部分。可以使用正则表达式来切分句子,其中分隔符是除单词、数字外的任意字符串。比如:

import re

mySent='This book is the best book on Python on M.L. I have ever laid eyes upon.'
regEx=re.compile('\\W')
listOfTokens=regEx.split(mySent)
print(listOfTokens)

现在得到了一系列词组成的词表,但是里面的空字符串需要去掉。可以计算每个字符串的长度,只返回长度大于0的字符串,并且,句子的第一个单词是大写的,如果目的是句子查找,那么这个特点会很有用,但是这里的文本只看出词袋,所以我们希望所有词的形式都是统一的:

print([tok.lower() for tok in listOfTokens if len(tok)>0])

现在拿一封完整的电子邮件观察实际处理结果:

需要注意的是,由于‘URL:answer.py?hl=en&answer=174623’的一部分,因而会出现en和py这样的单词,当对URL进行切分时,会得到很多词。我们是想去掉这些单词,因此在实现时会过滤掉长度小于3的字符串。在实际的解析程序中,要用更高级的过滤器来对诸如HTML和URL的对象进行处理。

测试算法:使用朴素贝叶斯进行交叉验证

下面将文本解析器集成到一个完整分类器中:

def textParse(bigString):
    import re
    listOfTokens=re.split(r'\W',bigString)
    #小写、切分、长度大于等于3
    return [tok.lower() for tok in listOfTokens if len(tok)>2]

def spamTest():
    docList=[]
    classList=[]
    fullText=[]
    for i in range(1,126):
        #打开文件
        wordList=textParse(open('email/spam/%d.txt' % i).read())
        #文档列表添加文本
        docList.append(wordList)
        #全文本列表增加文档列表
        fullText.extend(wordList)
        #列表增加1
        classList.append(1)
        wordList=textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList=createVocabList(docList)
    trainingSet=range(50)
    testSet=[]
    for i in range(10):
        #随机构建训练集
        #random.uniform:范围内随机生成实数
        randIndex=int(random.uniform(0,len(trainingSet)))
        #测试集中增加,并在训练集中删除
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
    trainMat=[]
    trainClasses=[]
    for docIndex in trainingSet:
        trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam=trainNBO(array(trainMat),array(trainClasses))
    errorCount=0
    for docIndex in testSet:
        wordVector=setOfWords2Vec(vocabList,docList[docIndex])
        #对测试集分类
        if classifyNB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
            errorCount=errorCount+1
    print('错误率:',float(errorCount)/len(testSet))

第一个函数textParse()接受一个大字符串并将其解析为字符串列表。该函数去掉少于两个字符的字符串,并将所有字符串转为小写。

第二个函数spamTest()对贝叶斯垃圾邮件分类器进行自动化处理。导入文件夹spam与ham文件夹下的文本文件,并将它们解析成词列表。之后构建一个测试集与训练集,两个集合中的邮件都是随机选出的。50封电子邮件中,随机选择10封为测试集。分类器所需要的概率计算只利用训练集中的文档来完成。Python变量trainingSet是一个整数列表,其中的值从0到49。测试集外的剩余部分作为测试集的过程称为留存交叉验证。假定现在只完成了一次迭代,那么为了更精确地估计分类器的错误率,就应该进行多次迭代后求出平均错误率。

接下来的for循环遍历训练集的所有文档,对每封邮件基于词汇表并构建词向量。这些词用于计算分类所需的概率。然后遍历测试集,对其中每封邮件进行分类。如果邮件分类错误,则错误数加一,最后给出总的错误百分比。

运行结果:

函数spamTest()会输出在10封随机选择的邮件上的分类错误率。

标签:wordList,Python,docIndex,贝叶斯,tok,朴素,字符串,trainingSet,append
From: https://blog.csdn.net/weixin_39407597/article/details/140770557

相关文章

  • Python 在PDF中添加、替换、或删除图片
    PDF文件中的图片可以丰富文档内容,提升用户的阅读体验。除了在PDF中添加图片外,有时也需要替换或删除其中的图片,以改进视觉效果或更新信息。本文将提供以下三个示例,介绍如何使用Python操作PDF文件中的图片:Python在PDF中添加图片Python替换PDF中的图片Python删除PDF中的图片......
  • 学精python selenium自动化只要读完这一篇
    第一篇基础案例篇大牛测试出品,视频/代码项目案例请联系作者:2574674466前言:●内卷时代测试人员如何面对?逃避还是提高自己?●为什么要学习selenium?●内功如何修炼学习目标:●学会selenium环境搭建、不同浏览器驱动●虚拟环境与代码异常原因分析●十六大元素定位......
  • [附开题]flask框架的校园疫情安全管理系统设计与实现tsckj(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠疫情全球爆发以来,校园作为高密度、高流动性的集体生活环境,其疫情防控工作面临着前所未有的挑战。学校师生众多,活动频繁,一旦发生疫情......
  • SCI一区级-python实现VMD-CNN-Transformer锂离子电池剩余寿命预测
    1. 基本介绍使用VMD结合皮尔逊相关系数实现对锂离子电池数据集去噪,消除数据中“容量再生问题”使用CNN-Transformer实现特征提取:利用卷积神经网络(CNN)进行特征提取。然后,利用改进的变压器模型来捕获时间序列中的固有相关性,并将其特征映射到未来的SOH值。采用迭代策略对每个......
  • Cmake配置Qt程序调用python库的配置方法
    在网上找了一些配置方法,最简单直接的是在cmake中加入如下语句:set(PYTHON_EXECUTABLE/Python/Python311/python.exe)include_directories("/PythonPython311/include")link_directories("/PythonPython311/libs")link_libraries(python3.lib)link_libraries(python311.lib)直......
  • VSCode 的 Python 扩展中更详细的属性提示
    假设我有一个对象args由parser.parse_args()返回,并且它应该具有像args.port=6001、args.seed=1234这样的属性。当我在VSCode中按args.时,port和seed不会显示在建议的属性列表中,因为这些属性可能会......
  • 编写用于关键字检测和按钮发送的 Python Telegram 机器人
    我需要帮助用Python为我的Telegram机器人编写代码。我有一个config.py文件,其中包含两个关键字列表:keywords和button_phrases。keywords-负责在单击时显示子按钮的按钮。Button_phrases-负责单击时打开链接的按钮。我需要机器人检查用户输入的文本并按以下顺......
  • Python monorepo 打包,使用 Poetry
    我想将我的Python源代码组织到一个单一存储库中,具有以下基本结构:projectrootdir-libraryone-pyproject.toml-README-src/orgname/libraryone-__init__.py-somemodule.py-webapi-pyproject.toml-README-src/organa......
  • 如何使用Python AST给表达式a == b添加括号?
    请问,有谁知道如何使用PythonAST在代码中为a==b这样的表达式添加括号?我尝试过重写visit_Compare,但是ast.unparse中的delimit_if自动删除了我添加的括号,因为优先级a==b的值更高。你说的对,直接使用ast.unparse会因为优先级问题导致添加的括号被移除。为了解......
  • 使用 powershell 或 python 从网页列出公司名称
    我希望使用PowerShell或python仅列出URL中的公司名称:https://www.moneycontrol.com/markets/earnings/results-calendar/?activeDate=2024-07-29下面是我的python脚本用于获取网页的结构:importrequestsfrombs4importBeautifulSoup#URLo......