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/

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

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

github最热门的Python项目:深度学习占半壁江山

本篇文章为大家盘点了1月份最热门的Python 项目,本月最热门的开源项目中,深度学习相关的开源项目占据了半壁江山,让我们一起来看下吧! 1 FastPhoto...

31310
来自专栏AI研习社

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

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

1532
来自专栏数据科学与人工智能

【应用】信用评分:第9部分 - 计分卡实施:部署,生产和监测

“知识不是力量,知识的实施就是力量。” - 评分卡或信贷策略的真正好处仅在实施时明显。 CRISP-DM框架的最后阶段 - 实施 - 代表从数据科学领域向信息技...

1285
来自专栏大数据文摘

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

1625
来自专栏IT派

2018年2月份GitHub上最热门的Python项目:深度学习占半壁江山

本篇文章为大家盘点了2月份最热门的Python 项目,本月最热门的开源项目中,深度学习相关的开源项目占据了半壁江山,让我们一起来看下吧!

1200
来自专栏wym

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

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

712
来自专栏AI-vell

音频加白噪-Python+librosa实现

换句话说就是,白噪的每一帧都是随机的值,如果要给一段音频加上白噪的话,给每一帧叠加一个随机大小的值就ok啦

90711
来自专栏机器之心

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

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

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

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

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

3702
来自专栏AI科技大本营的专栏

重磅 | TensorFlow 2.0即将发布,所有tf.contrib将被弃用

上周,谷歌刚刚发布了 TensorFlow 1.10.0 版本(详见《TensorFlow 版本 1.10.0 发布》),如今,TensorFlow 的 2.0...

833

扫码关注云+社区

领取腾讯云代金券