我们通过一个案例,来了解朴素贝叶斯如何实现垃圾邮件分类。步骤为:
- 文本转换为数值
- 朴素贝叶斯训练
- 朴素贝叶斯推理
我们使用到的训练数据如下:
样本 | 标签 |
您中奖了!点击链接领取您的百万大奖。 | 垃圾 |
免费试用我们的产品,不满意全额退款。 | 垃圾 |
您的银行账户需要紧急验证,请点击以下链接。 | 垃圾 |
会议通知:下周的会议安排。 | 正常 |
我在超市买了一些食物。 | 正常 |
明天我们将一起庆祝生日。 | 正常 |
待预测类别的数据如下:
样本 | 标签 |
您的百万大奖正在等待您的领取。 | ? |
1. 文本转换为数值
对所有的文本进行分词,去除停用词,得到每一邮件分词之后的结果:
样本 | 标签 |
[‘中奖’, ‘点击’, ‘链接’, ‘领取’, ‘百万’, ‘大奖’] | 垃圾 |
[‘免费’, ‘试用’, ‘产品’, ‘满意’, ‘全额’, ‘退款’] | 垃圾 |
[‘银行’, ‘账户’, ‘需要’, ‘紧急’, ‘验证’, ‘请’, ‘点击’, ‘以下’, ‘链接’] | 垃圾 |
[‘会议’, ‘通知’, ‘下周’, ‘会议’, ‘安排’] | 正常 |
[‘超市’, ‘买’, ‘食物’] | 正常 |
[‘明天’, ‘一起’, ‘庆祝’, ‘生日’] | 正常 |
什么是停用词?
停用词(Stop Words)是自然语言处理(NLP)中的一个概念,指的是在文本中经常出现的,但通常被忽略或删除的常见词语。这些词语通常对文本分析和处理任务没有特定的信息或含义,因此在文本处理过程中通常被过滤掉,提高处理效率。常见的停用词通常包括:连接词、冠词、代词、介词和其他高频词汇,例如 “的”、”是”、”在”、”我”、”你”、”他们”等。这些词在句子中频繁出现,但往往不提供有关文本主题或内容的有用信息。
我们把这些词去重,组合成一个词表(共30个词):
['中奖', '点击', '链接', '领取', '百万', '大奖', '免费', '试用', '产品', '满意', '全额', '退款', '银行', '账户', '需要', '紧急', '验证', '请', '以下', '会议', '通知', '下周', '安排', '超市', '买', '食物', '明天', '一起', '庆祝', '生日']
接下来,我们统计每个邮件中包含词表中的词的个数多少,从而将文本内容转换为数值表示:
[ [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1] ]
- 转换之后的向量中的每一个分量和词表中的词是一一对应的;
- 如果某个位置为 1、2 或者其他值则表示词表中对应位置的词在当前文档中出现的次数;
至此,我们就将所有的训练文档转换为数值表示。这里需要大家理解的是,将文档转换为数值向量并不是仅仅有上面这一种方法。
2. 朴素贝叶斯训练
训练过程就是统计先验概率和每个特征词条件概率的过程,例如:P(领取|垃圾) 表示所有垃圾邮件中领取出现的次数占所有的词的比重:
先验概率 | 特征词条件概率 |
P(垃圾) = 1/2 | P(领取|垃圾)=0.039215686 |
P(正常) = 1/2 | P(百万|垃圾)=0.039215686 |
P(大奖|垃圾)=0.039215686 | |
… | |
P(领取|正常)=0.0238095 | |
P(百万|正常)=0.0238095 | |
P(大奖|正常)=0.0238095 | |
… |
至此,我们就训练结束了。
3. 朴素贝叶斯推理
将待预测类别的文本数据转换为数值表示:
样本 | 标签 |
您的百万大奖正在等待您的领取。 | ? |
分词之后的结果:
样本 | 标签 |
[‘百万’, ‘大奖’, ‘正在’, ‘等待’, ‘领取’] | ? |
转换为数值表示:
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
P(领取|垃圾) * P(百万|垃圾) * P(大奖|垃圾) * P(垃圾) = 0.039215686**3 = 6.0308628144529635e-05
P(领取|正常) * P(百万|正常) * P(大奖|正常) * P(正常) = 0.023809500**3 = 1.3497421984707377e-05
很显然属于垃圾邮件的分数较高,最终:
样本 | 标签 |
您的百万大奖正在等待您的领取。 | 垃圾 |
至此,我们已经通过朴素贝叶斯得到了垃圾邮件分类的结果。