1.1 题目的主要研究内容
(1)工作的主要描述
利用贝叶斯模型实现简单的垃圾邮件分类,将正常邮件和垃圾邮件分别识别出来并分类。
- 系统流程图
1.2 题目研究的工作基础或实验条件
软件环境:Windows10
Python版本:3.7
相关模块:scikit-learn模块;jieba模块;numpy模块;以及⼀些Python⾃带的模块。
1.3 数据集描述
使用的中文邮件数据集和中文停用词表,其中spam文件夹中有7775封垃圾邮件,normal文件夹中有7063封正常邮件,test文件夹中有392封测试邮件,test文件夹中,文件名在1至200的为正常邮件,文件名7801~8000的为垃圾邮件。
1.4 特征提取过程描述
由于词典里的词数量太多,只保留了词频最高的4000个词作为最终创建的词典。词典准备好之后,把每封信的内容转换为词向量,其维度为4000,每一维代表一个高频词在该邮件中出现的频率,最后将这些词向量合并为一个大的特征向量矩阵,其大小为:(7063+7775)×4000,即前7063行为正常邮件的特征向量,其余为垃圾邮件的特征向量。
1.5 分类过程描述
对测试集中的每一封邮件用结巴分词,并用停用表进行简单过滤,然后使用正则表达式过滤掉邮件中的非中文字符,并计算得到P(s|w)(在已知词向量w的条件下求包含该词向量邮件是否为垃圾邮件的概率,s表示分类为垃圾邮件)最高的15个词,在计算过程中,若该词只出现在垃圾邮件的词典中,则令P(w|s')=0.01,反之亦然;若都未出现,则令P(s|w)=0.4(这里做的几个假设基于前人做的一些研究工作得出的)。然后计算得到的每封邮件中重要的15个词的贝叶斯概率,若概率>阈值α,则判为垃圾邮件,否则判为正常邮件。
1.6 主要程序代码
功能函数:
import jieba;
import os;
class spamEmailBayes:
# 获得中文停用词表
def getStopWords(self):
stopList=[]
for line in open("../data/中文停用词表.txt"):
stopList.append(line[:len(line)-1])
return stopList;
# 分别保存正常邮件与垃圾邮件中出现的词有多少邮件出现该词,得到两个词典
def get_word_list(self,content,wordsList,stopList):
#分词结果放入res_list
res_list = list(jieba.cut(content))
for i in res_list:
if i not in stopList and i.strip()!='' and i!=None:
if i not in wordsList:
wordsList.append(i)
# 若列表中的词已在词典中,则加1,否则添加进去
def addToDict(self,wordsList,wordsDict):
for item in wordsList:
if item in wordsDict.keys():
wordsDict[item]+=1
else:
wordsDict.setdefault(item,1)