当前位置:   article > 正文

文本分类 | 基于朴素贝叶斯的文本分类方法_朴素贝叶斯文本分类

朴素贝叶斯文本分类

Hi,大家好啊!本文主要了解文本分类的内容,以《基于朴素贝叶斯的文本分类方法》这一项目作为示例展示文本分类的意义。

目录

一、贝叶斯公式

1. 公式 

2. 用机器学习视角理解贝叶斯公式

二、朴素贝叶斯算法

1. 介绍

2. 步骤

三、基于朴素贝叶斯的文本分类方法

1. 导入相关库

2. 过滤字词

3. 遍历邮件建立词库

4. 邮件标记并训练模型

5. 预测模型

四、小结


基于统计模型的文本分类方法是文本分类的主要方法之一。该方法的一般步骤是:

  • 对原始数据进行预处理(包括分词、数据清洗和数据统计等)
  • 人工抽取特征
  • 选择具体的模型设计分类算法

朴素贝叶斯算法是常用的统计模型之一。本文主要对数据集中151到155号邮件进行预测,是垃圾邮件还是普通邮件

一、贝叶斯公式

1. 公式 

贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来。因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口。

$P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)} $

它其实是由以下的联合概率公式推导出来:

$P(Y,X) = P(Y|X)P(X)=P(X|Y)P(Y) $

其中,P(Y) 叫做先验概率,P(Y|X) 叫做后验概率,P(Y,X) 叫做联合概率。

2. 用机器学习视角理解贝叶斯公式

在机器学习的视角下,我们把 X 理解成“具有某特征”,把 Y 理解成“类别标签”(一般机器学习问题中都是 X=>特征, Y=>结果)。在最简单的二分类问题是与否判定)下,我们将 Y 理解成“属于某类”的标签。于是贝叶斯公式就变形成了下面的样子:

而我们二分类问题的最终目的就是要判断以下条件是否成立:

贝叶斯方法把计算“具有某特征的条件下属于某类”的概率转换成需要计算“属于某类的条件下具有某特征”**的概率,而后者获取方法就简单多了,我们只需要找到一些包含已知特征标签的样本,即可进行训练。而样本的类别标签都是明确的,所以贝叶斯方法在机器学习里属于有监督学习方法。

另外,一般先验概率、后验概率是相对出现的,比如 其中,P(Y) 和P(Y|X) 是关于 Y 的先验概率与后验概率,P(X) 和P(X|Y) 是关于 X 的先验概率与后验概率。

二、朴素贝叶斯算法

1. 介绍

朴素贝叶斯算法是一种基于概率统计的分类算法。它基于贝叶斯定理特征独立假设,将待分类的样本分配到最可能的类别中。

算法的基本思想是假设所有特征在给定类别的条件下是相互独立。基于这个假设,朴素贝叶斯算法计算每个类别在给定特征下的后验概率,并选择具有最高概率的类别作为最终的分类结果。

2. 步骤

朴素贝叶斯算法在文本分类中的步骤:

  • 数据准备:首先,需要准备带有标签的文本数据集,其中每个文本都被标注为所属的类别。例如,一个电子邮件可以被标记为"垃圾邮件"或"非垃圾邮件"。
  • 特征提取:将文本数据转换为机器学习算法可以理解的特征向量表示。常用的方法有词袋模型(Bag-of-Words)和TF-IDF(Term Frequency-Inverse Document Frequency)。
  • 数据预处理:对特征向量进行预处理操作,如去除停用词(如"the"、"and")和标点符号,进行词干化(将单词统一成其原始形式),以及进行大小写转换等。
  • 训练模型:使用准备好的训练集数据,通过计算每个类别下的条件概率,来训练朴素贝叶斯分类器。
  • 特征选择(可选):对于大规模的文本分类问题,可以考虑对特征进行选择,以减少特征的维度,提高分类器的效果和运行速度。常用的特征选择方法有互信息、卡方检验等。
  • 测试和评估:使用留出集、交叉验证等方法,将测试集数据输入训练好的模型进行分类,并计算分类准确率、精确率、召回率、F1值等指标来评估模型的性能。
  • 应用模型:训练完成并通过评估的模型可以用于新的未知文本的分类。通过计算每个类别的后验概率,并选择具有最高后验概率的类别作为最终的分类结果。

需要注意的是:朴素贝叶斯算法有一个特征独立假设,即将文本特征视为相互独立的,这在某些情况下可能并不成立。但朴素贝叶斯算法仍然在文本分类任务中得到广泛应用,并取得了不错的效果。在具体应用时,还可以根据实际情况选择合适的变体,如多项式朴素贝叶斯(用于多分类任务)、伯努利朴素贝叶斯(用于二分类任务)等。

三、基于朴素贝叶斯的文本分类方法

这个小项目其实是一个有关于垃圾邮件识别的项目。

1. 导入相关库

  1. import re
  2. import os
  3. from jieba import cut
  4. from itertools import chain
  5. from collections import Counter
  6. import numpy as np
  7. from sklearn.naive_bayes import MultinomialNB

2. 过滤字词

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

3. 遍历邮件建立词库

  1. all_words = []
  2. def get_top_words(top_num):
  3. filename_list = ['邮件_files/{}.txt'.format(i) for i in range(151)]
  4. # 遍历邮件建立词库
  5. for filename in filename_list:
  6. all_words.append(get_words(filename))
  7. # itertools.chain()把all_words内的所有列表组合成一个列表
  8. # collections.Counter()统计词个数
  9. freq = Counter(chain(*all_words))
  10. return [i[0] for i in freq.most_common(top_num)]

4. 邮件标记并训练模型

  1. top_words = get_top_words(100)
  2. # 构建词-个数映射表
  3. vector = []
  4. for words in all_words:
  5. '''
  6. words:
  7. ['国际', 'SCI', '期刊', '材料', '结构力学', '工程', '杂志', '国际', 'SCI', '期刊', '先进', '材料科学',
  8. '材料', '工程', '杂志', '国际', 'SCI', '期刊', '图像处理', '模式识别', '人工智能', '工程', '杂志', '国际',
  9. 'SCI', '期刊', '数据', '信息', '科学杂志', '国际', 'SCI', '期刊', '机器', '学习', '神经网络', '人工智能',
  10. '杂志', '国际', 'SCI', '期刊', '能源', '环境', '生态', '温度', '管理', '结合', '信息学', '杂志', '期刊',
  11. '网址', '论文', '篇幅', '控制', '以上', '英文', '字数', '以上', '文章', '撰写', '语言', '英语', '论文',
  12. '研究', '内容', '详实', '方法', '正确', '理论性', '实践性', '科学性', '前沿性', '投稿', '初稿', '需要',
  13. '排版', '录用', '提供', '模版', '排版', '写作', '要求', '正规', '期刊', '正规', '操作', '大牛', '出版社',
  14. '期刊', '期刊', '质量', '放心', '检索', '稳定', '邀请函', '推荐', '身边', '老师', '朋友', '打扰', '请谅解']
  15. '''
  16. word_map = list(map(lambda word: words.count(word), top_words))
  17. '''
  18. word_map:
  19. [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,
  20. 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,
  21. 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,
  22. 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
  23. '''
  24. vector.append(word_map)
  25. vector = np.array(vector)
  26. # 0-126.txt为垃圾邮件标记为1;127-151.txt为普通邮件标记为0
  27. labels = np.array([1]*127 + [0]*24)

5. 预测模型

  1. model = MultinomialNB()
  2. model.fit(vector, labels)
  3. def predict(filename):
  4. """对未知邮件分类"""
  5. # 构建未知邮件的词向量
  6. words = get_words(filename)
  7. current_vector = np.array(
  8. tuple(map(lambda word: words.count(word), top_words)))
  9. # 预测结果
  10. result = model.predict(current_vector.reshape(1, -1))
  11. return '垃圾邮件' if result == 1 else '普通邮件'
  12. # 对151到155号邮件的性质预测并输出结果
  13. print('151.txt分类情况:{}'.format(predict('邮件_files/151.txt')))
  14. print('152.txt分类情况:{}'.format(predict('邮件_files/152.txt')))
  15. print('153.txt分类情况:{}'.format(predict('邮件_files/153.txt')))
  16. print('154.txt分类情况:{}'.format(predict('邮件_files/154.txt')))
  17. print('155.txt分类情况:{}'.format(predict('邮件_files/155.txt')))

四、小结

我们找了个最简单常见的例子:垃圾邮件识别,说明了一下朴素贝叶斯进行文本分类的思路过程。基本思路是先区分好训练集与测试集,对文本集合进行分词、去除标点符号等特征预处理的操作,然后使用条件独立假设,将原概率转换成词概率乘积,再进行后续的处理。

贝叶斯公式 + 条件独立假设 = 朴素贝叶斯方法

基于对重复词语在训练阶段与判断(测试)阶段的三种不同处理方式,我们相应的有伯努利模型、多项式模型和混合模型。在训练阶段,如果样本集合太小导致某些词语并未出现,我们可以采用平滑技术对其概率给一个估计值。而且并不是所有的词语都需要统计,我们可以按相应的“停用词”和“关键词”对模型进行进一步简化,提高训练和判断速度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/579990
推荐阅读
相关标签
  

闽ICP备14008679号