1.朴素贝叶斯算法
朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,通常用于文本分类或垃圾邮件过滤。该算法假定输入的数据之间独立,根据这个假设来计算概率。
朴素贝叶斯算法的基本步骤:
数据预处理:通常包括数据清洗,如去除特殊字符、停用词等,以减少对模型的影响
特征提取:从邮件文本中提取特征
模型训练:使用朴素贝叶斯算法训练模型
模型评估:使用未参与训练的数据来测试模型的性能
贝叶斯定理
贝叶斯定理是用来描述两个条件概率之间的关系
P(A|B)=P(A,B)/P(B)
=P(B|A)*P(A)/P(B)
2.实现过程
2.1.数据构建
建立良好邮件与垃圾邮件的数据集
建立test数据集进行模型评估
2.2.部分代码
folder_path = './email/ham'
# 获取文件夹下的所有 txt 文件
files = [f for f in os.listdir(folder_path) if f.endswith('.txt')]
# 初始化单词库
word_ham = set()
# 遍历所有 txt 文件
for file in files:
with open(os.path.join(folder_path, file), 'r') as f:
# 读取文件内容,去掉标点符号
content = f.read().replace('-',' ').replace(':',' ').replace(',', '').replace('.', '').replace('?', '').replace('!', '').replace('&',' ').replace('=',' ').replace('(',' ').replace(')',' ').replace('\\',' ')
# 对内容进行分词
words = jieba.cut(content)
# 将分词结果添加到单词库
word_all_ham.update(words)
# 将单词库保存为 txt 文件
with open('./email/word_all_ham.txt', 'w') as f:
for word in word_all_ham:
f.write(word + '\n')
# 读取文本文件
with open(txt_path, 'r') as f:
matter = f.read()
# 将内容转换为小写并去除标点符号
matter = re.sub(r'[^\w\s]', '', matter.lower())
# 使用 jieba 进行分词
words = jieba.cut(matter)
# 统计单词频率
for word in words:
if word in word_dict:
word_dict[word] += 1
2.3运行结果
3.小结
朴素贝叶斯算法的优点包括其简单性、可解释性和高效性。对于文本分类和垃圾邮件过滤等任务表现良好,这些任务具有大量的文本特征和较小的数据集。
朴素贝叶斯算法也有一些局限性,朴素贝叶斯算法假设数据之间是独立的,这个假设在现实中可能不成立。对于大规模的数据集,朴素贝叶斯算法可能会消耗大量的内存和计算时间。