通俗易懂的机器学习——筛选垃圾邮件(贝叶斯分类)

NLP作业02:课程设计报告 通过课程设计的练习,加深对所学自然语言处理的理论知识与操作技能的理解和掌握,能综合运用所学理论知识和操作技能进行实际工程项目的设计开发,真正体会到自然语言处理算法在实际工程项目中的具体应用方法,为今后能够独立或协助工程师进行人工智能产品的开发设计工作奠定基础。总的来说,通过本次课程设计我对于垃圾邮件分类的基本概念和分类方法有了更深入的了解,感受到了实战项目对理论知识的应用,更加清晰了解了数据集的统计分析、数据预处理和模型训练的流程和方法。将划分好的测试集数据重新放入模型,检测模型在新的数据上的表现。 阅读详情

背景及应用

利用贝叶斯公式,我们可以在计算机上验证和测试垃圾邮件的字词统计,计算词语出现的概率。并根据的得出来的概率来判断一封新的邮件是垃圾邮件还是正常邮件。

贝叶斯公式

公式:
P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P (A|B)= \frac {P (B|A) \cdot P (A)}{P (B)} P(A∣B)=P(B)P(B∣A)⋅P(A)​
解释:在B情况出现的条件下A情况出现的概率等于在A情况出现的情况下B情况出现的概率乘以A情况出现的概率,除以B情况出现的概率。
应用:看起来公式很麻烦,但在本问题的解决中并不会直接试用,后续代码中的使用是P(A|B)=(A和B同时满足的个数)/B的个数。这样使用是同等效力的,但是会更加简单。

数据集

首先我们需要使用60000条Email的数据集,数据集连接如下:
60000条Email数据集
数据集的结构如下:
数据集结构
full文件夹下的index:包含每一条Email的标签和对应的文件位置。
data文件夹下的每个文件夹都有若干条Email数据。

idex中数据组织形式:
index数据组织形式
Email:
Email

引入依赖包

import re
import jieba
import numpy as np

re:正则表达式用于过滤非中文字符
jieba:用于做中文分词
numpy:用于划分训练集和测试集

数据预处理

在进行统计之前我们要先进行数据预处理以保证统计能够顺利进行。

全局变量

EmailsIndex = "./full/index"

过滤所有非中文词语

def filterEmail(email):
    email = re.sub("[a-zA-Z0-9_]+|\W","",email)
    return email

使用正则表达式过滤掉非中文词
原理:按照字母,数字和下划线划分email中的文本

读取邮件

def readEmail(filename):
    with  open(filename, "r",encoding='GB2312', errors='ignore') as fp:
        content=fp.read()
        content = filterEmail(content) #把一封邮件提取所有中文内容
        words = list(jieba.cut(content))
    return words

读取一封Email:首先按照传进来的filename(文件路径)打开txt文件,然后调用filterEmail函数过滤掉非中文字符,过滤后content中不含非中文字符。最后使用jieba.cut对中文进行分词,分词后words中为中文词组。
注:数据集的编码方式要按照GB2312打开

加载邮件

def loadAllEmails(IndexFile):
    Emails=[]
    with  open(IndexFile, "r") as fp:
        lines=fp.readlines()
        for line in lines:
            spam,filename = line.split()
            Emails.append((spam,readEmail(filename)))
    return Emails

传进来的IndexFile参数是index的路径
打开index文件后读取每一行数据,每一行数据包含邮件类别和邮件路径,使用split将他们分离开,调用readEmail获得邮件路径对应的邮件的中文分词。

获取概率表

划分训练集和测试集

def train_test_split(Emails,testSize):
    arrayEmails = np.array(Emails)
    test_size = int(len(Emails)*testSize)
    shuffle_indexes = np.random.permutation(len(arrayEmails))
    test_indexs,train_indexs= np.split(shuffle_indexes,[test_size])
    return arrayEmails[train_indexs],arrayEmails[test_indexs]

计算分词的概率表

def calWordsFreqTable(Emails):
    wordsSet = []
    spamWords = dict()
    hamWords = dict()
    spamlength = 0
    hamlength = 0
    for elem in Emails:
        if elem[0] == "spam":
            spamlength += 1
            tempset = set()
            for word in elem[1]:
                if word not in tempset:
                    tempset.add(word)
                    if word in wordsSet:
                        spamWords[word] += 1
                    else:
                        wordsSet.append(word)
                        spamWords[word] = 1
                        hamWords[word] = 0
        elif elem[0] == "ham":
            hamlength += 1
            tempset = set()
            for word in elem[1]:
                if word not in tempset:
                    tempset.add(word)
                    if word in wordsSet:
                        hamWords[word] += 1
                    else:
                        wordsSet.append(word)
                        hamWords[word] = 1
                        spamWords[word] = 0

    wordsProbs = []  # 格式(word, spamprob, hamprob)

    for word in wordsSet:
        wordsProbs.append((word, spamWords[word] * 1.0 / (spamWords[word] + hamWords[word]), hamWords[word] * 1.0 / (spamWords[word] + hamWords[word])))

    return wordsProbs

变量含义:
wordsSet:词典,在遍历Email时逐渐将词典中没有的词添加到词典
spamWords:分词与其在垃圾邮件中出现的次数组成的字典
hamWords:分词与其在正常邮件中出现的次数组成的字典
spamlength:总垃圾邮件数
hamlength:总正常邮件数
tempset:用来判断在一封Email内某词是否已经出现过,如果已经出现,则不予统计。

保存概率表

def saveWordsTable(wordsProbs, filepath):
    import os
    with open(os.path.join(filepath, "probs.txt"), "w", encoding="utf-8") as f:
        for prob in wordsProbs:
            f.write(prob[0])
            f.write("\t")
            f.write(str(prob[1]))
            f.write("\t")
            f.write(str(prob[2]))
            f.write('\n')

检查邮件是否为垃圾文件

获取分词对应的概率字典和字典

def getProbDict_WordsSet(filepath):
    ProbsDict = dict()
    wordsSet = list()
    import os
    with open(os.path.join(filepath, "probs.txt"), "r", encoding="utf-8") as f:
        lines = f.readlines()
        for line in lines:
            word, spamprob, hamprob = line.split()
            wordsSet.append(word)
            ProbsDict[word] = (float(spamprob), float(hamprob))

    return ProbsDict, wordsSet

初步检查一封邮件

def checkOneEmail(ProbsDict, wordsSet, email):
    spamprob = 1
    hamprob = 1
    for word in email:
        if word in wordsSet:
            hamprob *= max((1 - ProbsDict[word][0]), 0.01)
            spamprob *= max((1 - ProbsDict[word][1]), 0.01)
        if hamprob == 0 or spamprob == 0:
            break
    if spamprob > hamprob:
        return spamprob, 1
    elif spamprob < hamprob:
        return hamprob, -1
    else:
        return 0, 0

hamprob *= max((1 - ProbsDict[word][0]), 0.01)中1 - ProbsDict[word][0]的含义是该词不是来着垃圾邮件的概率,使用max是为了防止获得的概率过低,同时用1来表示垃圾邮件,-1表示正常邮件。当垃圾邮件和正常邮件的概率相等时用0表示未能判断出是否为垃圾邮件。

检查多封邮件

def checkEmails(ProbsDict, wordsSet, emails):
    rates = []
    predict_flags = []
    for email in emails:
        rate, ans = checkOneEmail(ProbsDict, wordsSet, email)
        rates.append(rate)
        predict_flags.append(ans)
    return rates, predict_flags  # 返回准确率和每一封邮件的预测值

主程序

if __name__ == "__main__":
    opt = int(input("1.通过训练集获取概率并在测试集测试 2.单个邮件预测"))
    if opt == 1:
        Emails = loadAllEmails(EmailsIndex)
        trainEmails, testEmails = train_test_split(Emails, 0.2)
        wordsProbs = calWordsFreqTable(trainEmails)
        saveWordsTable(wordsProbs, filepath='')
        ProbsDict, wordsSet = getProbDict_WordsSet(filepath='')
        rate, ans = checkEmails(ProbsDict, wordsSet, testEmails[:,1])
        t = 0
        for i in range(len(ans)):
            if ans[i] == 1 and testEmails[i][0] == 'spam':
                t += 1
            elif ans[i] == -1 and testEmails[i][0] == 'ham':
                t += 1
        print("精度:", t / len(ans))
    else:
        opt = int(input("1.手动输入 2.打开"))
        if opt == 1:
            text = input("输入邮件:")
            Email = filterEmail(text)
            ProbsDict, wordsSet = getProbDict_WordsSet(filepath='')
            rate, ans = checkOneEmail(ProbsDict, wordsSet, Email)
            if ans == 1:
                print("垃圾邮件")
            elif ans == -1:
                print("有效邮件")
            else:
                print("未知邮件")
        else:
            path = input("请输入邮件的路径:")  # 路径用”/“而不是”\’“
            text = ""
            with open(path, encoding="utf-8") as f:
                for line in f:
                    text += line
            Email = filterEmail(text)
            ProbsDict, wordsSet = getProbDict_WordsSet(filepath='')
            rate, ans = checkOneEmail(ProbsDict, wordsSet, Email)
            if ans == 1:
                print("垃圾邮件")
            elif ans == -1:
                print("有效邮件")
            else:
                print("未知邮件")

注:在首次使用时必须先选择1来获取概率,生成时间比较长,可以在下方下载,下载后可以直接使用。
分词概率下载

垃圾邮件分类-朴素贝叶斯算法 基于朴素贝叶斯的垃圾邮件分类 阅读详情

相关推荐

NLP-基于机器学习的文本分类-垃圾邮件分类

目录一、文本分类的步骤二、提取特征的经典方法三、分类器方法1.朴素贝叶斯(Naive Bayesian, NB)2.逻辑回归(Logistic Regression, lR)3.支持向量机(Support Vector Machine, SVM)四、垃圾邮件分类实战代码 一、文本分类的步骤 定义阶段:定义数据以及分类体系,具体分为哪些类别,需要哪些数据。 数据预处理:对文档做分词、去停用词等准备工作。 数据提取特征:对文档矩阵进行降维,提取训练集中最有用的特征。 模型训练阶段:选择具体的分类模型以及算法,

djx1085213329的博客 4116

机器学习--使用朴素贝叶斯进行垃圾邮件分类

朴素贝叶斯

jimei2011的博客 6507

使用Python实现一个简单的垃圾邮件分类器

随着电子邮件的广泛使用,垃圾邮件也日益增多,对用户造成了很大的困扰。因此,开发一个能够自动分类和过滤垃圾邮件的程序就显得非常重要。本篇文章将介绍如何使用Python实现一个简单的垃圾邮件分类器,帮助您更好地管理自己的电子邮件。

努力是为了站在万人之中,成为别人的光 6154

机器学习-朴素贝叶斯过滤垃圾邮件

什么是朴素贝叶斯算法:用贝叶斯定理来预测一个未知类别的样本属于各个类别的可能性,选择可能性最大的一个类别作为该样本的最终类别。用这个算法处理垃圾邮件就可以理解为:用贝叶斯定理来预测一封由若干个单词组成的不知道是否为垃圾邮件的邮件,它是垃圾邮件或是正常邮件的可能性,如果算法预测出垃圾邮件的可能性更高,那这封邮件就是垃圾邮件,反之为正常邮件。

weixin_55747326的博客 6459

R语言之朴素贝叶斯方法实现对垃圾邮件的分类

R语言朴素贝叶斯方法实现对6000多垃圾邮件的分类,开发了大规模文本数据处理的函数,R语言调优,可视化图鉴等等,共计1000多行代码,适合R语言初学者食用。

weixin_43217641的博客 1241

基于贝叶斯分类器的Python垃圾邮件过滤器实现

贝叶斯分类器是一类基于贝叶斯定理的统计分类器。它通过给定观测数据来预测分类标签,其核心思想是利用先验知识和数据信息来计算条件概率,进而实现对数据的分类。贝叶斯分类器因其简单高效,在许多领域,如垃圾邮件过滤、医疗诊断、文本分类等都有广泛应用。N-gram模型是自然语言处理中用于表示文本序列的一种方法,它将文本划分为n个连续的项(可以是字母、单词或字符)的序列。在垃圾邮件过滤中,我们通常使用单词级别的N-gram模型来捕捉邮件内容的局部特征。

weixin_42668301的博客 973

毕业设计 - 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后-毕设帮助 1 前言 Hi,大家好,这里是丹成学长,今天做一个电商销售预测分析,这只是一个demo,尝试对电影数据进行分析,并可视化系统 毕设帮助,开题指导,技术解答 ????746876041 2 垃圾短信/邮件 分类算法 原理 垃圾邮件内容往往是广告或者虚假信息,甚至是电脑病毒、情色、反动等不良信息,大量垃圾邮件的存在不仅

HUXINY的博客 1万+

中文Email数据集.rar

测试垃圾邮件的数据集

毕设 垃圾邮件(短信)分类算法实现 机器学习 深度学习

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是🚩垃圾邮件(短信)分类算法实现 机器学习 深度学习🥇学长这里给一个题目综合评分(每项满分5分)难度系数:3分工作量:3分创新点:4分🧿使用中文邮件数据集:丹成学长自己采集,通过爬虫以及人工筛选。

HUXINY的博客 3473

告别‘小目标’丢失!手把手复现DNANet红外检测网络(PyTorch版)

本文详细介绍了如何使用PyTorch从零实现DNANet红外小目标检测网络,重点解析了DNIM模块和CSAM注意力机制的设计与实现。通过实战教程,帮助开发者解决红外小目标检测中的特征提取和训练调参难题,适用于军事侦察、安防监控等场景。

weixin_28701593的博客 252

零中频接收机实战:DC Offset的5种常见解决方案与调试技巧

本文针对零中频接收机中DC Offset这一核心挑战,深入剖析了其产生机理与对信号解调的严重影响。文章从实战角度出发,系统性地介绍了五种解决方案,包括硬件预防、数字域校正、I/Q不平衡联合校正等,并分享了关键的实验室调试与产线测试技巧,旨在帮助射频工程师有效提升接收机性能。

weixin_29234509的博客 399

基于贝叶斯分类算法的垃圾邮件筛选器开发

本文介绍了一个基于贝叶斯分类算法的垃圾邮件筛选系统。系统采用Python、Django和MySQL技术栈,通过分析邮件内容自动分类垃圾邮件,并提供手动标记功能优化分类准确性。核心功能包括数据预处理、贝叶斯分类器实现、Django前端展示和模型持续优化。系统解决了大规模数据处理和算法优化等难点,通过用户反馈数据不断训练提升分类精度。该系统实现了高效的垃圾邮件自动过滤,具有友好的用户界面和良好的交互体验。

jsjcxsj_xltx的博客 655

STM32F4用FSMC驱动AX58100 EtherCAT从站芯片,保姆级配置流程与避坑指南

本文详细介绍了STM32F4通过FSMC接口驱动AX58100 EtherCAT从站芯片的完整配置流程,包括硬件连接、时序优化、协议栈移植及TwinCAT主站集成。针对工业自动化场景,提供高性价比的实时控制解决方案,特别适合机械臂、CNC机床等精确同步应用,并分享关键调试技巧与性能优化方法。

weixin_27869497的博客 306

贝叶斯分类器的matlab实现_实例讲解:基于贝叶斯分类的垃圾邮件识别

采用贝叶斯理论进行垃圾邮件过滤是一种应用于电子邮件过滤的统计学技术。它实质是使用贝叶斯分类来对邮件的属性进行判别,这个属性包括:垃圾邮件和非垃圾邮件。贝叶斯分类的运作是借着使用标记(一般是字词,有时候是其他)与垃圾邮件、非垃圾邮件的关联,然后搭配贝叶斯推断来计算一封邮件属于垃圾邮件的可能性。基于贝叶斯的垃圾邮件过滤是非常有效的技术,可以修改模型以符合特殊使用者的需要,并且给予较低的垃圾邮件侦测率,...

weixin_39549899的博客 907

用Isaac Sim复现经典案例:手把手教你写Python脚本控制机械臂抓取(附避障算法调试心得)

本文详细介绍了如何使用NVIDIA Isaac Sim仿真系统复现机械臂抓取经典案例,包括Python脚本编写、避障算法调试等关键步骤。通过URDF模型导入、关节控制逻辑实现和RMPFlow避障配置等实战演示,帮助开发者快速掌握机器人仿真技术,特别分享了官方文档未提及的实用调试技巧和性能优化策略。

weixin_30632089的博客 407

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.youkuaiyun.com/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.youkuaiyun.com/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4876

【毕业设计】垃圾邮件(短信)分类算法研究与实现 - 机器学习

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!🔥 对毕设有任何疑问都可以问学长哦!这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是🚩垃圾邮件(短信)分类 算法实现🥇学长这里给一个题目综合评分(每项满分5分)难度系数:4分工作量:4分创新点:3分。

caxiou的博客 3545

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 添加getchar();代码块解决无法查找或打开PDB文件。 错误提示: “Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。 “Pro...

m0_46523403的博客 6419

毕设 垃圾邮件(短信)分类 算法实现

Hi,大家好,这里是丹成学长,今天做一个nlp项目,基于机器学习的垃圾邮件分类🧿选题指导, 项目分享:见文末使用中文邮件数据集:丹成学长自己采集,通过爬虫以及人工筛选。数据集“data” 文件夹中,包含,“full” 文件夹和 “delay” 文件夹。“data” 文件夹里面包含多个二级文件夹,二级文件夹里面才是垃圾邮件文本,一个文本代表一份邮件。“full” 文件夹里有一个 index 文件,该文件记录的是各邮件文本的标签。

fawubio的博客 1006

RK3568平台开发系列讲解(外设篇)CAN的使用

📢 本篇章带大家快速了解CAN的使用。

内核笔记 2352

Dify 第 13 篇 Dify 工作流 详解

工作流通过将复杂任务分解为节点降低复杂度,提升LLM应用的性能和稳定性。Dify工作流分为两类:Chatflow面向对话场景(如客服),支持多轮对话;Workflow面向批处理场景(如翻译),提供逻辑节点实现自动化。核心概念包括节点、变量(系统/会话/环境变量)及应用类型差异:Chatflow支持中间输出和对话历史,Workflow仅支持结束节点输出。系统变量以"sys"开头,用于全局数据传递,不同应用类型变量不同,如Chatflow的sys.query存储用户输入,Workflow的s

甘蓝的专栏 3248

毕设项目分享 垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

Hi,大家好,今天做一个nlp项目,基于机器学习的垃圾邮件分类使用中文邮件数据集:丹成学长自己采集,通过爬虫以及人工筛选。数据集“data” 文件夹中,包含,“full” 文件夹和 “delay” 文件夹。“data” 文件夹里面包含多个二级文件夹,二级文件夹里面才是垃圾邮件文本,一个文本代表一份邮件。“full” 文件夹里有一个 index 文件,该文件记录的是各邮件文本的标签。🧿。

kooerr的博客 1177

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

毕设分享 垃圾邮件(短信)分类 算法实现

摘要:本文介绍了一个基于机器学习的垃圾邮件分类项目,使用中文邮件数据集进行处理。项目采用贝叶斯分类器作为核心算法,通过TF-IDF方法进行特征提取。数据集包含"full"和"delay"两个文件夹,通过爬虫和人工筛选获得。数据预处理阶段包括中文分词、去除非中文字符等操作,最终将邮件文本和标签分别存储在单独文件中。特征提取使用TF-IDF方法将文本转化为数值数据,为后续分类模型训练做准备。该项目实现了从原始数据处理到特征工程的全流程,为垃圾邮件分类提供了完整的解决方案。

HUXINY的博客 1110

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

毕设成品 垃圾邮件(短信)分类 算法实现

Hi,大家好,这里是丹成学长,今天做一个nlp项目,基于机器学习的垃圾邮件分类🧿选题指导, 项目分享:见文末使用中文邮件数据集:丹成学长自己采集,通过爬虫以及人工筛选。数据集“data” 文件夹中,包含,“full” 文件夹和 “delay” 文件夹。“data” 文件夹里面包含多个二级文件夹,二级文件夹里面才是垃圾邮件文本,一个文本代表一份邮件。“full” 文件夹里有一个 index 文件,该文件记录的是各邮件文本的标签。

caxiou的博客 1129

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

机器学习垃圾邮件短信分类算法研究与实现

机器学习垃圾邮件短信分类算法研究与实现

8815

软件工程毕设 垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

Hi,大家好,今天做一个nlp项目,基于机器学习的垃圾邮件分类使用中文邮件数据集:丹成学长自己采集,通过爬虫以及人工筛选。数据集“data” 文件夹中,包含,“full” 文件夹和 “delay” 文件夹。“data” 文件夹里面包含多个二级文件夹,二级文件夹里面才是垃圾邮件文本,一个文本代表一份邮件。“full” 文件夹里有一个 index 文件,该文件记录的是各邮件文本的标签。🧿。

m0_76217654的博客 1378
上一篇: MATLAB学习笔记——多项式与字符串
下一篇: 通俗易懂的机器学习——不依靠现有机器学习框架手动实现简易决策树
艾醒(AiXing-w)
艾醒(AiXing-w) 2021年度博客之星AI领域top5 2021年度博客之星AI领域top5
博客等级 码龄7年 1万+粉丝 320原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾醒(AiXing-w)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值