垃圾邮件识别任务中朴素贝叶斯分类算法的使用思路

垃圾邮件识别任务中朴素贝叶斯分类算法的使用思路

判断一个邮件是否是垃圾邮件:

step1. 训练模型过程:

1.计算先验概率:
如现有200封正常邮件,100封垃圾邮件可得到:

P ( 正 常 邮 件 ) = 200 200 + 100 = 2 3 P(正常邮件)=\frac{200}{200+100}=\frac{2}{3} P()=200+100200=32

P ( 垃 圾 邮 件 ) = 100 200 + 100 = 1 3 P(垃圾邮件)=\frac{100}{200+100}=\frac{1}{3} P()=200+100100=31
2.生成词库:

把总共300封邮件中出现的所有文本分词后,填入词库,得到包含所有出现过的词的词库 V V V
假设词库 V V V中有3000个词则 L e n ( V ) = 3000 Len(V)=3000 Len(V)=3000

3.计算词库中每一个词在正常邮件和垃圾邮件中出现的概率:
如“点击”这个词在20个正常邮件中出现过,在60个垃圾邮件中出现过,假设一个邮件中有20个词则:

“点击”在正常邮件中出现的概率为:
P ( 点 击 ∣ 正 常 邮 件 ) = 20 200 ∗ 20 = 1 200 P(点击|正常邮件)=\frac{20}{200*20}=\frac{1}{200} P()=2002020=2001

“点击”在垃圾邮件中出现的概率为:
P ( 点 击 ∣ 垃 圾 邮 件 ) = 20 100 ∗ 20 = 1 100 P(点击|垃圾邮件)=\frac{20}{100*20}=\frac{1}{100} P()=1002020=1001

但是由于一些情况如“特惠”这个词在垃圾邮件中出现过,但是在正常邮件中没有出现导致:
P ( 特 惠 ∣ 正 常 邮 件 ) = 0 200 ∗ 20 = 0 P(特惠|正常邮件)=\frac{0}{200*20}=0 P()=200200=0

所以这里要采用一个平滑技术 ,朴素贝叶斯中一般使用Add-one Smoothing
即如果出现次数为零,为了让值不为零,分子需要+1,分母需要加上词库的大小 L e n ( V ) = 3000 Len(V)=3000 Len(V)=3000,因此:

“点击”在正常邮件中出现的概率为:
P ( 点 击 ∣ 正 常 邮 件 ) = 20 + 1 200 ∗ 20 + 3000 = 3 1000 P(点击|正常邮件)=\frac{20+1}{200*20+3000}=\frac{3}{1000} P()=20020+300020+1=10003

“点击”在垃圾邮件中出现的概率为:
P ( 点 击 ∣ 垃 圾 邮 件 ) = 20 + 1 100 ∗ 20 + 3000 = 1 250 P(点击|垃圾邮件)=\frac{20+1}{100*20+3000}=\frac{1}{250} P()=10020+300020+1=2501

……
以此推类,分别计算出词库 V V V中每一个词在正常邮件及垃圾邮件中出现的概率

假设这里得到了:
P ( 点 击 ∣ 正 常 邮 件 ) = 3 1000 P(点击|正常邮件)=\frac{3}{1000} P()=10003
P ( 点 击 ∣ 垃 圾 邮 件 ) = 1 250 P(点击|垃圾邮件)=\frac{1}{250} P()=2501

P ( 链 接 ∣ 正 常 邮 件 ) = 1 5000 P(链接|正常邮件)=\frac{1}{5000} P()=50001
P ( 链 接 ∣ 垃 圾 邮 件 ) = 1 230 P(链接|垃圾邮件)=\frac{1}{230} P()=2301

P ( 购 买 ∣ 正 常 邮 件 ) = 7 2200 P(购买|正常邮件)=\frac{7}{2200} P()=22007
P ( 购 买 ∣ 垃 圾 邮 件 ) = 1 310 P(购买|垃圾邮件)=\frac{1}{310} P()=3101

P ( 工 作 ∣ 正 常 邮 件 ) = 1 210 P(工作|正常邮件)=\frac{1}{210} P()=2101
P ( 工 作 ∣ 垃 圾 邮 件 ) = 1 5000 P(工作|垃圾邮件)=\frac{1}{5000} P()=50001
……

当所有单词的概率计算完成后朴素贝叶斯模型就训练完毕。




step2.预测过程:

预测的最终目标是判断:
比较 P ( 正 常 邮 件 ∣ 内 容 ) P(正常邮件|内容) P() P ( 垃 圾 邮 件 ∣ 内 容 ) P(垃圾邮件|内容) P()

根据贝叶斯公式

对比 P ( 正 常 邮 件 ∣ 内 容 ) P(正常邮件|内容) P() P ( 垃 圾 邮 件 ∣ 内 容 ) P(垃圾邮件|内容) P()

相当于对比 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) P ( 内 容 ) \frac{P(内容|正常邮件)P(正常邮件)}{P(内容)} P()P()P() P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P ( 内 容 ) \frac{P(内容|垃圾邮件)P(垃圾邮件)}{P(内容)} P()P()P()

由于分母相同,所以

相当于对比 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) P(内容|正常邮件)P(正常邮件) P()P() P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|垃圾邮件)P(垃圾邮件) P()P()的大小

假如此时收到了一封新邮件,邮件中包含很多词,其中有“工作”、“购买”,“链接”,“点击” ……等等

1.计算: P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) P(内容|正常邮件)P(正常邮件) P()P()

P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) = ( P ( 工 作 ∣ 正 常 邮 件 ) × P ( 购 买 ∣ 正 常 邮 件 ) × P ( 链 接 ∣ 正 常 邮 件 ) × . . . . × P ( 点 击 ∣ 正 常 邮 件 ) ) × P ( 正 常 邮 件 ) = ( 1 210 × 7 2200 × 1 5000 × . . . . × 3 1000 ) × 2 3 P(内容|正常邮件)P(正常邮件)=(P(工作|正常邮件)\times P(购买|正常邮件)\times P(链接|正常邮件)\times ....\times P(点击|正常邮件))\times P(正常邮件)=(\frac{1}{210}\times\frac{7}{2200}\times\frac{1}{5000}\times ....\times\frac{3}{1000})\times \frac{2}{3} P()P()=(P()×P()×P()×....×P())×P()=(2101×22007×50001×....×10003)×32

2.计算: P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|垃圾邮件)P(垃圾邮件) P()P()

P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) = ( P ( 工 作 ∣ 垃 圾 邮 件 ) × P ( 购 买 ∣ 垃 圾 邮 件 ) × P ( 链 接 ∣ 垃 圾 邮 件 ) × . . . . × P ( 点 击 ∣ 垃 圾 邮 件 ) ) × P ( 垃 圾 邮 件 ) = ( 1 5000 × 1 310 × 1 230 × . . . . × 1 250 ) × 1 3 P(内容|垃圾邮件)P(垃圾邮件)=(P(工作|垃圾邮件)\times P(购买|垃圾邮件)\times P(链接|垃圾邮件)\times ....\times P(点击|垃圾邮件))\times P(垃圾邮件)=(\frac{1}{5000}\times\frac{1}{310}\times\frac{1}{230}\times ....\times\frac{1}{250})\times \frac{1}{3} P()P()=(P()×P()×P()×....×P())×P()=(50001×3101×2301×....×2501)×31

这里也可以看到有非常多类似 P ( 工 作 ∣ 垃 圾 邮 件 ) P(工作∣垃圾邮件) P()的值在相乘,如果其中有任何一个值等于0的话,会导致整个式子等于0。这也是为什么要做Smoothing平滑处理

3.对比第一步和第二步计算出的值

如果 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) > = P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|正常邮件)P(正常邮件)>=P(内容|垃圾邮件)P(垃圾邮件) P()P()>=P()P()则预测此邮件为正常邮件
如果 P ( 内 容 ∣ 正 常 邮 件 ) P ( 正 常 邮 件 ) < P ( 内 容 ∣ 垃 圾 邮 件 ) P ( 垃 圾 邮 件 ) P(内容|正常邮件)P(正常邮件)P()P()<P()P()则预测此邮件为垃圾邮件

需要注意的点:

当词库数量非常大时,每一个类似 P ( 工 作 ∣ 垃 圾 邮 件 ) P(工作∣垃圾邮件) P()的值会非常非常小,小数位过多时导致计算机不能存储。会报underflow错误
都知道 L o g Log Log是个严格递增函数所以step2.预测过程中第一步和第二步的式子也可以转化成:

L o g ( P ( 内 容 ∣ 正 常 邮 件 ) ) P ( 正 常 邮 件 ) = L o g ( ( P ( 工 作 ∣ 正 常 邮 件 ) × P ( 购 买 ∣ 正 常 邮 件 ) × P ( 链 接 ∣ 正 常 邮 件 ) × . . . . × P ( 点 击 ∣ 正 常 邮 件 ) ) × P ( 正 常 邮 件 ) = ( log ⁡ 1 210 + log ⁡ 7 2200 + log ⁡ 1 5000 + . . . . + log ⁡ 3 1000 ) × 2 3 Log(P(内容|正常邮件))P(正常邮件)=Log((P(工作|正常邮件)\times P(购买|正常邮件)\times P(链接|正常邮件)\times ....\times P(点击|正常邮件))\times P(正常邮件)=(\log{\frac{1}{210}}+\log{\frac{7}{2200}}+\log{\frac{1}{5000}}+....+\log{\frac{3}{1000}})\times \frac{2}{3} Log(P())P()=Log((P()×P()×P()×....×P())×P()=(log2101+log22007+log50001+....+log10003)×32(以正常邮件举例,如果正常邮件做了这个处理那么垃圾邮件也要做这个处理)

PS

以上为学习过程中的对网络上资料的内容整理及理解

你可能感兴趣的:(nlp学习,机器学习,算法,python,人工智能)