使用朴素贝叶斯模型对邮件进行分类

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

posted @ 2020-04-11 16:52  Hany47315  阅读(1010)  评论(0)    收藏  举报