坠矜 发表于 2025-12-8 15:45:09

朴素贝叶斯算法预测中文钓鱼邮件

目录

[*]大致步骤

[*]第一步:准备工具(训练模型)
[*]第二步:分析目标邮件(实际判断)

[*]1. 提取这封邮件的特征
[*]2. 计算两种可能性得分
[*]3. 做出判断

[*]第三步:现实中的优化

[*]朴素贝叶斯算法定义
[*]Reference

下文以一个检测钓鱼邮件的案例来学习这个算法的原理。
需求:
收到一封新邮件,程序怎么自动判断它是否为钓鱼邮件?
大致步骤

第一步:准备工具(训练模型)

目的:先让计算机学会识别钓鱼邮件的特征。

[*]收集历史邮件数据:

[*]1000封已知类型的邮件
[*]其中:300封钓鱼邮件,700封正常邮件。
学校邮件中30%是钓鱼邮件(这是你的先验知识)。

[*]提取关键特征:
我们关注邮件中是否出现某些关键词:
["免费", "账号", "验证", "点击", "紧急", "赢取", "密码", "链接"]
[*]计算基础概率:
P(钓鱼) = 300/1000 = 0.3
P(正常) = 700/1000 = 0.7
[*]计算每个词的条件概率:
以"免费"这个词为例:

[*]在300封钓鱼邮件中,270封包含"免费" → P(免费|钓鱼) = 270/300 = 0.9
[*]在300封钓鱼邮件中,240封包含"账号" → P(账号|钓鱼) = 240/300 = 0.8
[*]在700封正常邮件中,70封包含"免费" → P(免费|正常) = 70/700 = 0.1
[*]......(用同样方法计算其他词的概率)

第二步:分析目标邮件(实际判断)

现在你要判断这封具体的邮件:
主题:账户安全通知
内容:尊敬的客户,您的账号存在异常登录,请立即点击下方链接验证身份,否则将被暂停使用。对邮件主题和内容进行中文分词的过程,这里忽略掉了。
判断过程如下:
1. 提取这封邮件的特征

检查邮件中是否包含我们的关键词:

[*]包含"账号":✓
[*]包含"验证":✓
[*]包含"点击":✓
[*]包含"链接":✓
[*]包含"免费":✗
[*]包含"赢取":✗
[*]包含"密码":✗
[*]包含"紧急":✓("立即"可视为紧急)
2. 计算两种可能性得分

我们需要计算:这封邮件是钓鱼的可能性 vs 这封邮件是正常的可能性
计算公式简化版:
得分(钓鱼) = P(钓鱼) × P(特征1|钓鱼) × P(特征2|钓鱼) × ...
得分(正常) = P(正常) × P(特征1|正常) × P(特征2|正常) × ...实际计算(使用训练阶段的数据):
A. 假设钓鱼可能性计算:
P(钓鱼) = 0.3
P(账号|钓鱼) = 0.8(假设值)
P(验证|钓鱼) = 0.7(假设值)
P(点击|钓鱼) = 0.85 (假设值)
P(链接|钓鱼) = 0.9(假设值)
P(免费|钓鱼) = 0.9,但邮件中没有"免费" → 用(1-0.9)=0.1
P(紧急|钓鱼) = 0.75 (假设值)

得分_钓鱼 = 0.3 × 0.8 × 0.7 × 0.85 × 0.9 × 0.1 × 0.75
          = 0.3 × 0.0003213 ≈ 0.0000964B. 假设正常可能性计算:
P(正常) = 0.7
P(账号|正常) = 0.1(假设值)
P(验证|正常) = 0.05 (假设值)
P(点击|正常) = 0.08 (假设值)
P(链接|正常) = 0.12 (假设值)
P(免费|正常) = 0.1,但邮件中没有"免费" → 用(1-0.1)=0.9
P(紧急|正常) = 0.15 (假设值)

得分_正常 = 0.7 × 0.1 × 0.05 × 0.08 × 0.12 × 0.9 × 0.15
          = 0.7 × 0.00000648 ≈ 0.000004543. 做出判断

比较两个得分:

[*]钓鱼得分:0.0000964
[*]正常得分:0.00000454
因为 0.0000964 > 0.00000454,所以判断这封邮件很可能是钓鱼邮件。
第三步:现实中的优化

实际应用中,为了避免数值太小和未出现词的问题,会做以下调整:

[*]使用对数计算(避免小数点太多):
log(得分_钓鱼) = log(0.3) + log(0.8) + log(0.7) + ...
log(得分_正常) = log(0.7) + log(0.1) + log(0.05) + ...比较对数分数,结果相同但更稳定。
[*]拉普拉斯平滑:
如果某个词在训练数据中从未在钓鱼邮件中出现过(概率为0),我们会给它一个很小的概率(如0.001),避免整个乘积为0。
朴素贝叶斯算法定义

朴素贝叶斯是一种基于概率论的分类算法,其核心思想是利用贝叶斯定理来预测一个样本属于哪个类别。 它的“朴素”之处在于假设样本的各个特征之间是相互独立、互不影响的,尽管这一假设在现实中往往不成立,但它极大地简化了计算,使得算法在很多复杂场景下仍然表现出色。
虽然独立事件往往并不能反映现实生活,但计算独立事件的概率要比计算非独立事件的概率容易得多。这种算法广泛应用于文本分类、垃圾邮件过滤和情感分析等领域。
假设有一个数据集,由两类组成(简化问题),对于每个样本的分类,我们都已经知晓。数据分布如下图:

现在出现一个新的点new_point (x,y),其分类未知。我们可以用p1(x,y)表示数据点(x,y)属于红色一类的概率,同时也可以用p2(x,y)表示数据点(x,y)属于蓝色一类的概率。那要把new_point归在红、蓝哪一类呢?
我们提出这样的规则:
如果p1(x,y) > p2(x,y),则(x,y)为红色一类。
如果p1(x,y) <p2(x,y),则(x,y)为蓝色一类。也就是说,在出现一个需要分类的新点时,我们只需要计算这个点的:
如果p(red|x,y) > p(blue|x,y), 则(x,y)属于红色一类。
如果p(red|x,y) < p(blue|x,y), 则(x,y)属于蓝色一类。Reference

朴素贝叶斯算法 & 应用实例
http://www.cnblogs.com/marc01in/p/4775440.html

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

甄婉丽 发表于 2025-12-22 23:47:38

感谢分享

班嘉淑 发表于 2025-12-27 09:00:32

感谢分享

懵诬哇 发表于 2026-1-17 23:58:35

谢谢分享,试用一下

更成痒 发表于 2026-1-18 00:56:40

感谢分享

国语诗 发表于 2026-1-21 00:11:08

谢谢分享,辛苦了

岳娅纯 发表于 2026-1-24 08:05:44

谢谢分享,辛苦了

笙芝 发表于 2026-1-28 02:44:17

感谢,下载保存了

萨瑞饨 发表于 2026-1-30 03:03:38

不错,里面软件多更新就更好了

骆贵 发表于 2026-2-1 19:12:29

热心回复!

撒阗奕 发表于 2026-2-5 07:44:08

感谢分享,下载保存了,貌似很强大

崔竹 发表于 2026-2-8 05:01:04

东西不错很实用谢谢分享

姨番单 发表于 2026-2-8 05:58:28

感谢发布原创作品,程序园因你更精彩

济曝喊 发表于 2026-2-9 09:42:41

感谢分享,学习下。

辖瑁地 发表于 2026-2-9 20:39:19

这个有用。

匡菲 发表于 2026-2-10 18:25:45

yyds。多谢分享

杆树 发表于 2026-2-10 18:55:36

喜欢鼓捣这些软件,现在用得少,谢谢分享!

数察啜 发表于 2026-2-11 09:42:44

收藏一下   不知道什么时候能用到

韦逸思 发表于 2026-2-12 16:55:54

谢谢分享,试用一下

孟茹云 发表于 2026-2-12 17:29:36

分享、互助 让互联网精神温暖你我
页: [1] 2
查看完整版本: 朴素贝叶斯算法预测中文钓鱼邮件