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)$,则判为垃圾邮件,否则判为正常邮件。
近期下载者:
相关文件:
收藏者: