02-29 朴素贝叶斯(垃圾邮件分类)


更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

朴素贝叶斯(垃圾邮件分类)

一、邮箱训练集下载地址

邮件训练集下载地址https://pan.baidu.com/s/1uwDJJeJAr-DX82XlCRGR9Q

二、模块导入

import re
import os
from jieba import cut
from itertools import chain
from collections import Counter
import numpy as np
from sklearn.naive_bayes import MultinomialNB

三、文本预处理

def get_words(filename):
    """读取文本并过滤无效字符和长度为1的词"""
    words = []
    with open(filename, 'r', encoding='utf-8') as fr:
        for line in fr:
            line = line.strip()
            # 过滤无效字符
            line = re.sub(r'[.【】0-9、——。,!~\*]', '', line)
            # 使用jieba.cut()方法对文本切词处理
            line = cut(line)
            # 过滤长度为1的词
            line = filter(lambda word: len(word) > 1, line)
            words.extend(line)

<span class="hljs-keyword">return</span> words


<span class="hljs-keyword">return</span> words

四、遍历邮件

all_words = []


def get_top_words(top_num):

"""遍历邮件建立词库后返回出现次数最多的词"""

filename_list = ['邮件_files/{}.txt'.format(i) for i in range(151)]

# 遍历邮件建立词库

for filename in filename_list:

all_words.append(get_words(filename))



<span class="hljs-comment"># itertools.chain()把all_words内的所有列表组合成一个列表</span>
<span class="hljs-comment"># collections.Counter()统计词个数</span>
freq = Counter(chain(*all_words))

<span class="hljs-keyword">return</span> [i[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> freq.most_common(top_num)]




top_words = get_top_words(100)


<span class="hljs-comment"># itertools.chain()把all_words内的所有列表组合成一个列表</span>
<span class="hljs-comment"># collections.Counter()统计词个数</span>
freq = Counter(chain(*all_words))

<span class="hljs-keyword">return</span> [i[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> freq.most_common(top_num)]
# 构建词-个数映射表

vector = []

for words in all_words:

'''

words:

['国际', 'SCI', '期刊', '材料', '结构力学', '工程', '杂志', '国际', 'SCI', '期刊', '先进', '材料科学',

'材料', '工程', '杂志', '国际', 'SCI', '期刊', '图像处理', '模式识别', '人工智能', '工程', '杂志', '国际',

'SCI', '期刊', '数据', '信息', '科学杂志', '国际', 'SCI', '期刊', '机器', '学习', '神经网络', '人工智能',

'杂志', '国际', 'SCI', '期刊', '能源', '环境', '生态', '温度', '管理', '结合', '信息学', '杂志', '期刊',

'网址', '论文', '篇幅', '控制', '以上', '英文', '字数', '以上', '文章', '撰写', '语言', '英语', '论文',

'研究', '内容', '详实', '方法', '正确', '理论性', '实践性', '科学性', '前沿性', '投稿', '初稿', '需要',

'排版', '录用', '提供', '模版', '排版', '写作', '要求', '正规', '期刊', '正规', '操作', '大牛', '出版社',

'期刊', '期刊', '质量', '放心', '检索', '稳定', '邀请函', '推荐', '身边', '老师', '朋友', '打扰', '请谅解']

'''

word_map = list(map(lambda word: words.count(word), top_words))

'''

word_map:

[0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,

10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,

0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

'''

vector.append(word_map)

五、训练模型

vector = np.array(vector)
# 0-126.txt为垃圾邮件标记为1;127-151.txt为普通邮件标记为0
labels = np.array([1]*127 + [0]*24)
model = MultinomialNB()

model.fit(vector, labels)

MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)

六、测试模型

def predict(filename):
    """对未知邮件分类"""
    # 构建未知邮件的词向量
    words = get_words(filename)
    current_vector = np.array(
        tuple(map(lambda word: words.count(word), top_words)))

<span class="hljs-comment"># 预测结果</span>
result = model.predict(current_vector.reshape(<span class="hljs-number">1</span>, <span class="hljs-number">-1</span>))

<span class="hljs-keyword">return</span> <span class="hljs-string">'**垃圾邮件**'</span> <span class="hljs-keyword">if</span> result == <span class="hljs-number">1</span> <span class="hljs-keyword">else</span> <span class="hljs-string">'普通邮件'</span>


<span class="hljs-comment"># 预测结果</span>
result = model.predict(current_vector.reshape(<span class="hljs-number">1</span>, <span class="hljs-number">-1</span>))

<span class="hljs-keyword">return</span> <span class="hljs-string">'**垃圾邮件**'</span> <span class="hljs-keyword">if</span> result == <span class="hljs-number">1</span> <span class="hljs-keyword">else</span> <span class="hljs-string">'普通邮件'</span>
print('151.txt分类情况:{}'.format(predict('邮件_files/151.txt')))

print('152.txt分类情况:{}'.format(predict('邮件_files/152.txt')))

print('153.txt分类情况:{}'.format(predict('邮件_files/153.txt')))

print('154.txt分类情况:{}'.format(predict('邮件_files/154.txt')))

print('155.txt分类情况:{}'.format(predict('邮件_files/155.txt')))

151.txt分类情况:**垃圾邮件**
152.txt分类情况:**垃圾邮件**
153.txt分类情况:**垃圾邮件**
154.txt分类情况:**垃圾邮件**
155.txt分类情况:普通邮件
posted @   ABDM  阅读(452)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示