原理:
1.使用足够多的垃圾邮件和非垃圾邮件的内容作为训练集
2.读取全部训练集
删除其中的干扰字符
【 】 ,* 。
进行分词
删除长度为 1 的单个字符
3.统计全部训练集中每个有效词汇的出现次数,截取出现次数最多的前 N 个
注:N 可以自己指定
4.根据每个经过第 2 步预处理后的垃圾邮件和非垃圾邮件内容生成特征向量
统计第 3 步中得到的 N 个词语分别在该邮件中的出现频率
每一个邮件对应一个特征向量,特征向量长度为 N
每个分量的值 表示对应的词语 在本邮件中出现的次数
[3,0,0,5] 第一个词语出现 3 次,第四个词出现了 5 次
5.根据第 4 步中得到的特征向量和已知邮件分类创建并训练朴素贝叶斯模型
注:明确哪些是垃圾邮件,哪些不是垃圾邮件
6.读取测试邮件,参考第 2 步,对邮件文本进行预处理,提取特征向量
7.使用第 5 步中训练好的模型,根据第 6 步提取的特征向量对邮件进行分类
程序要点:
1.使用 re 模块下的 sub 替换干扰的符号
from re import sub
2.使用 os 模块下的 listdir 列出所有的记事本文件 .txt
from os import listdir
3.使用 collections 模块下的 Counter 对邮件中字符出现的次数进行统计
from collections import Counter
4.使用 itertools 模块下的 chain 对邮件中字符出现的次数进行统计
from itertools import chain
5.使用 numpy 模块下的 array 将数据输入到模型中,使用数组
from numpy import array
6.使用 jieba 模块下的 cut 对内容进行分词
from jieba import cut
7.使用 sklearn.naive_bayes 模块下的 MultinomialNB 导入朴素贝叶斯
from sklearn.naive_bayes import MultinomialNB
8.删除字符串两边的空白字符(空格,制表符,换行符)
line = line.strip()
9.将其他字符替换为空白字符
line = sub(r'[.【】 0-9、-。,!~*]','',line)
10.对文本进行分词
line = cut(line)
11.过滤长度为 1 的单个字
line = filter(lambda word:len(word) > 1,line)
filter 函数将大于 1 的保存下来
12.列表添加元素使用 extends
words.extends(line)
程序:
from re import sub
from os import listdir
from collections import Counter
from iteratools import chain
from numpy import cut
from sklearn.naive_bayes import MultinomialNB
def getWordsFromFile(txtFile):
# 获取每一封邮件中的所有词语
words = []
# 将所有存储邮件文本内容的记事本文件都使用 UTF8 编码
with open(txtFile,encoding = "utf8") as fp:
for line in fp:
# 遍历每一行,删除两端的空白字符
line = line.strip()
# 过滤掉干扰字符
line = sub(r'[.【】 0-9、-。,!~*]','',line)
# 对 line 进行分词
line = cut(line)
# 过滤长度为 1 的词
line = filter(lambda word:len(word) > 1 ,line)
# 将文本预处理得到的词语添加到 words 列表中
words.extend(line)
return words
2020-04-11