Python-贝叶斯实战垃圾邮件过滤(大量数据)

环境

Python 3.6.2

jieba 0.39

数据

8000封邮件数据

  • 正常邮件: 7063封
  • 垃圾邮件: 7775封
  • 测试邮件:392封(其中文件名低于1000的均为正常邮件)

流程图

此处将结果输出到result.txt文件中

各词概率保存到wordsProb.txt中

Code:

def getProbWord(self, testDict, normalDict, spamDict, numNormal, numSpam):
        """
        计算对分类结果影响最大的15个词
        :param testDict: 测试数据字典
        :param normalDict: 正常邮件字典
        :param spamDict: 垃圾邮件字典
        :param numNormal: 正常邮件的数量
        :param numSpam: 垃圾邮件的数量
        :return wordProbList: 对分类结果影响最大的15个词
        """
        wordProbList = {}
        for word, num in testDict.items():
            # 当词不在垃圾邮件词表中,在正常邮件词表中,计算概率
            if word in spamDict.keys() and word in normalDict.keys():
                # 求类先验概率
                # 正常邮件
                pw_n = normalDict[word] / numNormal
                # 垃圾邮件
                pw_s = spamDict[word] / numSpam
                ps_w = pw_s / (pw_s + pw_n)
                wordProbList[word] = ps_w
            # 当词在垃圾邮件词表中,不在正常邮件词表中,计算概率
            if word in spamDict.keys() and word not in normalDict.keys():
                pw_s = spamDict[word] / numSpam
                pw_n = 0.01
                ps_w = pw_s / (pw_s + pw_n)
                wordProbList[word] = ps_w
            # 当词在垃圾邮件词表中,而且在正常邮件词表中,计算概率
            if word not in spamDict.keys() and word in normalDict.keys():
                pw_s = 0.01
                pw_n = normalDict[word] / numNormal
                ps_w = pw_s / (pw_s + pw_n)
                wordProbList[word] = ps_w
            # 当词不在垃圾邮件词表中,也不在正常邮件词表中,计算概率
            if word not in spamDict.keys() and word not in normalDict.keys():
                wordProbList[word] = 0.5  # 0.4
        sorted(wordProbList.items(), key=lambda d: d[1], reverse=True)[0:15]
        return wordProbList

    def calBayes(self, wordList, spamDict, normalDict):
        """
        计算贝叶斯概率
        :param wordList: 词表
        :param spamDict: 垃圾邮件词语字典
        :param normalDict: 正常邮件词语字典
        :return: 概率
        """
        ps_w = 1
        ps_n = 1

        with open('wordsProb.txt', 'a', encoding='utf-8') as f:
            for word, prob in wordList.items():
                f.write(word + ":" + str(prob) + "\n")
                ps_w *= prob
                ps_n *= 1 - prob
            p = ps_w / (ps_w + ps_n)
        return p

    def calAccuracy(self, testResult):
        """
        计算精度
        :return:
        """
        rightCount = 0
        errorCount = 0
        for name, catagory in testResult.items():
            if (int(name) < 1000 and catagory == 0) or (int(name) > 1000 and catagory == 1):
                rightCount += 1
            else:
                errorCount += 1
        return rightCount / (rightCount + errorCount)

Github: https://github.com/yingzk/MyML/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏应兆康的专栏

Python-贝叶斯实战垃圾邮件过滤(大量数据)

Github: https://github.com/yingzk/MyML 博 客: https://www.yingjoy.cn/ 环境 Python 3....

56411
来自专栏灯塔大数据

洞察|大数据显示越来越多的人想关闭朋友圈

? 近日,中国青年报社会调查中心联合问卷网,对2000名受访者进行的调查显示,35.8%的受访者想关闭朋友圈,其中19.7%的受访者正打算关闭朋 友圈,13....

36313
来自专栏新智元

【TensorFlow开源2年官方回顾】下一个重要方向是分布式模型服务

【新智元导读】 TensorFlow Serving 开源的一年半时间里取得了许多进展和性能提升,包括开箱即用的优化服务和可定制性,多模型服务,标准化模型格式,...

2897
来自专栏机器之心

资源 | 一文盘点10大移动端机器学习框架

选自hopinfirst.com 作者:James Tredwell 机器之心编译 参与:路雪、黄小天 本文介绍了适用于移动端的 10 个机器学习框架,包括针对...

3694
来自专栏机器之心

业界 | 英伟达开源硬件加速项目NVDLA:一种标准化的推断加速框架

3519
来自专栏Jerry的SAP技术分享

机器学习在SAP Cloud for Customer中的应用

关于机器学习这个话题,我相信我这个公众号1500多位关注者里,一定有很多朋友的水平比Jerry高得多。如果您看过我以前两篇文章,您就会发现,我对机器学习仅仅停留...

1512
来自专栏目标检测和深度学习

SCI论文快速翻译,免费无限制!OCR识别,阅读文献必备!

科研人员在阅读外文文献时,经常会碰到看不懂的专业词汇或语句,需要将其复制到在线词典翻译。

3772
来自专栏大数据文摘

从人脸识别到情感分析,这有50个机器学习实用API!

1635
来自专栏wym

南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 水题

链接:https://www.nowcoder.com/acm/contest/122/C 来源:牛客网

712
来自专栏AI研习社

呵,我复现一篇深度强化学习论文容易吗

去年,OpenAI和DeepMind联手做了当时最酷的实验,不用经典的奖励信号来训练智能体,而是根据人类反馈进行强化学习的新方法。有篇博客专门讲了这个实验 Le...

1542

扫码关注云+社区

领取腾讯云代金券