BayesSpam-master

所属分类:其他
开发工具:Python
文件大小:17970KB
下载次数:2
上传日期:2018-10-14 14:25:40
上 传 者小小乖
说明:  基于朴素贝叶斯的垃圾邮件分类,包含算法代码,邮件数据集以及中文停用词文件
(Spam classification based on Naive Bayes, including algorithm code, mail dataset and Chinese stop word file)

文件列表:
.project (363, 2016-04-20)
.pydevproject (454, 2016-04-20)
.settings (0, 2016-04-20)
.settings\org.eclipse.core.resources.prefs (356, 2016-04-20)
data (0, 2016-04-20)
data\normal (0, 2016-04-20)
data\normal\1000 (1673, 2016-04-20)
data\normal\1001 (1922, 2016-04-20)
data\normal\1002 (3094, 2016-04-20)
data\normal\1003 (3057, 2016-04-20)
data\normal\1004 (2958, 2016-04-20)
data\normal\1006 (1504, 2016-04-20)
data\normal\1007 (3127, 2016-04-20)
data\normal\1008 (3296, 2016-04-20)
data\normal\1009 (1315, 2016-04-20)
data\normal\1010 (1418, 2016-04-20)
data\normal\1011 (1274, 2016-04-20)
data\normal\1012 (1576, 2016-04-20)
data\normal\1013 (1383, 2016-04-20)
data\normal\1014 (1267, 2016-04-20)
data\normal\1015 (1578, 2016-04-20)
data\normal\1016 (1465, 2016-04-20)
data\normal\1017 (1385, 2016-04-20)
data\normal\1018 (1723, 2016-04-20)
data\normal\1019 (1326, 2016-04-20)
data\normal\1020 (1859, 2016-04-20)
data\normal\1021 (1800, 2016-04-20)
data\normal\1022 (2925, 2016-04-20)
data\normal\1023 (2614, 2016-04-20)
data\normal\1024 (1301, 2016-04-20)
data\normal\1025 (1454, 2016-04-20)
data\normal\1026 (1637, 2016-04-20)
data\normal\1027 (1709, 2016-04-20)
data\normal\1028 (2310, 2016-04-20)
data\normal\1029 (3055, 2016-04-20)
data\normal\1030 (1344, 2016-04-20)
... ...

# BayesSpam python实现基于贝叶斯的简单垃圾邮件分类 在400封邮件(正常邮件与垃圾邮件各一半)的测试集中测试结果为分类准确率95.15%,在仅仅统计词频计算概率的情况下,分类结果还是相当不错的。 **1、准备工作** python3.4开发环境; 结巴分词工具:https://github.com/fxsjy/jieba **2、贝叶斯公式** 我们要做的是计算在已知词向量$w=(w_1,w_2,...,w_n)$的条件下求包含该词向量邮件是否为垃圾邮件的概率,即求:
$P(s|w),w=(w_1,w_2,...,w_n)$
其中,$s$表示分类为垃圾邮件 根据贝叶斯公式和全概率公式, $P(s|w_1,w_2,...,w_n)$ $=\frac {P(s,w_1,w_2,...,w_n)}{P(w_1,w_2,...,w_n)}$ $=\frac {P(w_1,w_2,...,w_n|s)P(s)}{P(w_1,w_2,...,w_n)}$ $=\frac {P(w_1,w_2,...,w_n|s)P(s)}{P(w_1,w_2,...,w_n|s)\cdot p(s)+P(w_1,w_2,...,w_n|s^{'})\cdot p(s^{'})}\qquad\qquad...式1$ 根据朴素贝叶斯的条件独立假设,并设先验概率$P(s)=P(s^{'})=0.5$,上式可化为: $=\frac {\prod\limits_{j=1}^nP(w_j|s)}{\prod\limits_{j=1}^nP(w_j|s)+\prod\limits_{j=1}^nP(w_j|s^{'})}$ 再利用贝叶斯$P(w_j|s)=\frac{P(s|w_j)\cdot P(w_j)}{P(s)}$,式子化为 $=\frac {\prod\limits_{j=1}^nP(s|w_j)}{\prod\limits_{j=1}^nP(s|w_j)+\prod\limits_{j=1}^nP(s^{'}|w_j)}$ $=\frac {\prod\limits_{j=1}^nP(s|w_j)}{\prod\limits_{j=1}^nP(s|w_j)+\prod\limits_{j=1}^n\left(1-P(s|w_j)\right)}\qquad\qquad...式2$ 至此,我们接下来会用式2来计算概率$P(s|w)$,为什么不用式1而用式2来计算概率,是因为通过式2可以将关于$s^{'}$的部分用$s$表示,方便计算。 **3、实现步骤** 具体实现的源码已经给出,这里简单说下思路,就是一个分词并记录词频的过程: (1)对训练集用结巴分词,并用停用表进行简单过滤,然后使用正则表达式过滤掉邮件中的非中文字符; (2)分别保存正常邮件与垃圾邮件中出现的词有多少邮件出现该词,得到两个词典。例如词"疯狂"在8000封正常邮件中出现了20次,在8000封垃圾邮件中出现了200次; (3)对测试集中的每一封邮件做同样的处理,并计算得到$P(s|w)$最高的15个词,在计算过程中,若该词只出现在垃圾邮件的词典中,则令$P(w|s^{'})=0.01$,反之亦然;若都未出现,则令$P(s|w)=0.4$。PS.这里做的几个假设基于前人做的一些研究工作得出的。 (4)对得到的每封邮件中重要的15个词利用式2计算概率,若概率$>$阈值$\alpha(一般设为0.9)$,则判为垃圾邮件,否则判为正常邮件。

近期下载者

相关文件


收藏者