1.特征向量
每一个有效词汇在邮件中出现的次数(使用一维列表方法)
word 词汇出现的次数
一维列表.count(word)
2.将列表转换为数组形式 array(参数)
创建垃圾邮件,正常邮件训练集
array(列表对象 或 表达式)
3.使用 朴素贝叶斯算法
model = MultinomialNB()
4.进行训练模型 model.fit
model.fit(array数组,array数组)
5.对指定 topWords 数据使用函数
map(lambda x:words.count(x),topWords)
6.预测数据 model.predict ,返回值为 0 或 1
result = model.predict(array数组.reshape(1,-1))[0]
7.查看在不同区间的概率
model.predict_proba(array数组.reshape(1,-1))
8.条件语句,预测的结果便于区分 1 为垃圾邮件,0 为 正常邮件
return "垃圾邮件" if result == 1 else "正常邮件"
程序:
# 全部训练集中出现次数最多的前 600 个单词
topWords = getTopWords(600)
vectors = [ ]
for words in allWords:
temp = list(map(lambda x:words.count(x),topWords))
# 获取前600个单词的出现的个数
vectors.append(temp)
vectors = array(vectors)
# 对训练集中的数据给定一个标签
# 0.txt~99.txt 为垃圾邮件,0
# 100~140 为有效邮件,1
labels = array([1] * 100 + [0] * 41)
# 创建模型
model = MultinomialNB()
model.fit(vectors,labels)
# 训练样本数和标签
def predict(txtFile):
words = getWordsFromFile(txtFile)
# 获取有效字符
currentVector = array(tuple(
lambda x:words.count(x),topWords
))
# 查看有效词汇个数
result = model.predict(currentVector.reshape(1,-1))[0]
# 查看预测的概率
print(model.predict_proba(currentVector.reshape(1,-1)))
return "垃圾邮件" if result == 1 else "正常邮件"
2020-04-11