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

news2024/11/16 0:42:43

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

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

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封随机选择的邮件上的分类错误率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐5款好用的将pdf翻译成中文的工具。

像word,PPT,Excel等这些文档如果要翻译的话,即使没有合适的工具也可以复制粘贴内容。可PDF有的时候是不可以编辑的,很难用这种方法实现翻译。但是这5款翻译工具就可以做到直接将PDF文件进行翻译。 1、365pdf在线翻译 直达:https:…

力扣Hot100-543二叉树的直径

给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1: 输入:root [1,2,3,4,5] 输出&a…

零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因)

零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因) 目录 零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因)1. Lasso基础知识2. Lasso(Rstudio)——代码实操2. 1 数据处理2. 2…

结构体的引入

结构体也是一种数据组合,它和数组的区别是,数组的元素类型是一样的数据集合体,如果元素类型不一样,就要用到结构体了 下面定义一个学生结构体 struct Student {int num;char name[32];int age;double score;char addr[32]; }; …

谷粒商城实战笔记-88~91-商品发布保存

文章目录 一,基本信息二,规格参数三,销售属性四,SKU信息五,代码分析1,Spu信息的保存2,Sku信息的保存 这一篇包含三节内容: 88-商品服务-API-新增商品-保存SPU基本信息89-商品服务-AP…

Redis缓存穿透、击穿和雪崩的理解和解决思路

Redis的缓存穿透 缓存穿透是指那些查询请求所要获取的数据既不在缓存(Redis)中,也不在数据库(例如:MySQL)中,因此每次请求都会直接访问数据库。这种情况通常由以下几种情形引起: 恶…

C++:类进阶之继承与派生

一、基本概念:继承、基类、派生类 继承:在定义一个新的类B时,如果该类与某个已有的类A相似 (指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类 (也称子类)。 派生类:通过对…

微前端技术预研 - bit初体验

1.关于什么是微前端以及微前端的发展, 当前主流框架以及实现技术等,可参考这篇总结(非常全面), 微前端总结:目录详见下图 本文内容主要针对bit框架的实时思路以及具体使用。 1.什么是Bit? Bit 是可组合软件的构建…

《C语言实现各种排序算法》

文章目录 一、排序1、排序的各种方式分类 二、插入排序1、直接插入排序2、希尔排序3、希尔排序时间复杂度分析 三、选择排序1、直接选择排序2、堆排序 四、交换排序1、冒泡排序2、快速排序3、快速排序hoare找基准值4、快排挖坑法找基准值5、前后指针法6、快速排序非递归实现 五…

甄选范文“论数据分片技术及其应用”软考高级论文,系统架构设计师论文

论文真题 数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。 请围绕“论数据分片技术及其应用”论题…

OCC BRepOffsetAPI_ThruSections使用

目录 一、BRepOffsetAPI_ThruSections简介 二、功能与特点 三、应用场景 四、示例 一、BRepOffsetAPI_ThruSections简介 在Open CASCADE Technology (OCCT) 中,BRepOffsetAPI_ThruSections 类是用来通过放样生成一个实体或者一个面壳(Shell)。当使用这个类时,isSolid 参…

具身智能,存内计算芯片应用新赛道

引言: 具身智能(Emboided Al)是指通过身体与环境的动态互动,实现对世界的感知、认知和行为控制的智能系统。具身智能强调的是智能体与环境的交互/学习/改变,而不仅仅是身体本身。具身智能的核心要素体现在智能体通过…

MySQL --- 数据类型

一、类型分类 数值类型bit(M)位类型,M指定位数,默认值1,范围1 - 64bool使用0和1表示真假tinyint [unsigned]带符号范围 -128~127,无符号范围 0~255,默认有符号smallint [unsigned]带符号范围 -2^15~2^15-1&#xff0c…

【网络世界】HTTPS协议

目录 🌈前言🌈 📁 HTTP缺陷 📁 HTTPS 📂 概念 📂 加密 📂 加密方式 📁 中间人攻击 📁 CA机构和证书 📂 数据摘要(数据指纹) &…

nginx反向代理和负载均衡+安装jdk-22.0.2

ps -aux|grep nginx //查看进程 nginx 代理 nginx代理是负载均衡的基础 主机:192.168.118.60 这台主机只发布了web服务,没有做代理的任何操作 修改一下index.html中的内容 echo "this is java web server" > /usr/local/nginx/htm…

【OpenCV-Python实战项目】26-实时手部跟踪

0 介绍 目的:使用mediapipe库做手部的实时跟踪 检测流程:(1)手掌检测;(2)手掌特征检测 手掌特征分布:mediapipe手掌特征分布如下: 1.环境要求 后续代码运行环境&…

力扣SQL50 换座位

Problem: 626. 换座位 👨‍🏫 参考题解 Code SELECT(CASEWHEN MOD(id, 2) ! 0 AND counts ! id THEN id 1WHEN MOD(id, 2) ! 0 AND counts id THEN idELSE id - 1END) AS id,student FROMseat,(SELECTCOUNT(*) AS countsFROMseat) AS seat_counts O…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(中)

2.综述 (续上篇) 上篇地址:http://t.csdnimg.cn/DBKrg 2.2DLMS/COSEM应用层主要特点 2.2.1DLMS/COSEM应用层结构 DLMS/COSEM AL的主要部件是应用服务对象(ASO)。它给其服务用户提供服务(COSEM应用进程),并使用支撑层提供的服务。客户机和服务器侧都包含三个必…

Image Caption评估指标深入理解

前言:刚开始做图像描述的任务就整理了这些评估指标,时间久远有点记不清怎么具体实现原理了,结果面试的时候就问了这个问题,没答上来,郁闷了很久,还是基础不扎实,浅浅记录一下 文章目录 BLEUROUG…