python3邮件小软件,发送接收以及朴素贝叶斯筛选垃圾邮件(二)

鉴于上一篇博客中不断提到的关键—贝叶斯算法,以及突增的访问量,主要还是访问量激发了我写第二篇博文的动力,这篇博客就让我们来聊一聊项目中的朴素贝叶斯算法。

二、朴素贝叶斯算法

1. 概述

对于朴素贝叶斯的概述网上有很多,我这里不做太多的深度描述,我将朴素贝叶斯算法在具体项目中的实现过程进行了提炼描述,我觉得应该会变得浅显易懂一些。从这篇开始会开始结合代码,博主其实也是机器学习的初学者,会有不完善的地方,希望能有指正交流,如果有大佬能给点学习的建议和经验那更是感激不尽。废话不多说了,开始正题:

首先是贝叶斯公式:P(B|A) = P(A|B)P(B) / P(A)
可以看出贝叶斯公式描述了在A的条件下B发生的可能性,那么我们也就可以说是在A的特征下,属于B类别的可能性

这里我们可以尝试写出对于我们项目来说的贝叶斯公式来,P(Class | Word1,Word2,Word3…) = P(Word1,Word2,Word3… | Class)P(Class) / P(Word1,Word2,Word3…)

现在我就上述公式等号左边作两点说明的:

  1. 算法是针对一段文本,这里可以说是一封邮件计算值(概率)的;
  2. 上述公式中Class即代表着类别,这里即是垃圾邮件正常邮件,而 Word1,Word2,Word3… 即是从待判别文本中提取出的所有所有词汇,也就是特征

想要计算概率,我们就需要等式右边各个参数的数据,这时候就会发现想要只通过贝叶斯公式来计算几乎是不可能的,因为你无法确保你每次都能拥有 P(Word1,Word2,Word3…)或者P(Word1,Word2,Word3… | Class)这样的 非独立特征 计算出的 参数数据,这里需要一些概率统计学的知识辅助理解。

  • 既然无法单纯的使用贝叶斯进行计算,那用啥呢?朴素贝叶斯的优势就体现了出来,说白了朴素贝叶斯就是把有关联的一些特征看作一个个独立特征
    打个比方,”我今天去了珠海,去看了航展。看到了歼20,心中非常的自豪!“,用贝叶斯的想法就是,这整句话就是一个特征,因为组成这句话的词之间是有逻辑联系的,具有语法逻辑的存在。但是朴素贝叶斯就是将问题简单化,不去关注句子中词汇组合逻辑和词汇间的关系联系,而仅仅是关注其中的词汇

下面我们将贝叶斯公式朴素化,即将包含整体特征Word1,Word2,Word3… 独立化,不难得出以下公式:

P(Class | Word1,Word2,Word3…Wordn) = P(Word1 | Class) * P(Word2 | Class) * P(Word3 | Class) * …*P(Wordn | Class) * P(Class) / P(Word1) * P(Word2) * P(Word3) * … * P(Wordn)

到此,项目所需要的朴素贝叶斯核心公式就得到了。

2. 朴素贝叶斯训练器和分类器

  • 首先,这里引入一个训练集的概念,训练集由多条训练数据组成,每一条训练数据都由特征值类别组成,在项目中一条训练数据即是一封邮件这封邮件对应的分类(垃圾邮件/正常邮件),这里训练集是提前收集到的。博主也有一封包含了65000封邮件的训练集,也会分享出来。
  • 其次,所谓训练器,就是提前把朴素贝叶斯公式计算时所需要的各个参数提前准备好(即计算好),这个准备计算的过程就叫做训练,这里各个参数就是朴素贝叶斯公式等号右边的各个参数的值。
  • 然后,在训练器训练成功后,即可以开始对待分类文本进行分类计算了,做分类计算的即是分类器了,分类器通过读取训练得出各个特征参数来直接带入计算即可。
  • 最后,我对整个朴素贝叶斯算法整个运用过程做一个直观的描述
    训练集—(提取到特征和类别)—>训练器—(获得算法计算参数)—>分类器—(计算得到结果)—>分类

现在我对朴素贝叶斯公式等号右边各个值作一下解释:

  1. P(Word1|Class) 是在“Class”类别的所有特征中,Word1特征出现的概率。
  2. P(Class) 是在训练集所有特征中,“Class”类别特征出现的概率。
  3. 前两点是对公式中分子所需参数的解释,分母中 P(Word1) 即是特征Word1在整个训练集中出现的概率。
  4. 注意以上描述中出现概率都是基于不同类别下各个特征出现的次数来计算的。还有一个要说明的,分母其实是可以忽略不进行计算的,你会发现P(垃圾邮件|w1,w2,w3…)和P(正常邮件|w1,w2,w3…)在计算时,分母都是一样的,都是P(w1)P(w2)P(w3)…,只需要比较分子计算结果即可。这里只是做一个笼统的介绍,下面会带入项目中描述。

3. 算法模型

在这里我会针对各个模型来描述训练所要得到的参数,同时我会忽略对分母参数计算的描述。

  • 多项式模型(Multinomial model)
    词汇作为统计单位,不忽略各个特征词汇出现次数
    一条待分类文档d=(W1,W2,…,Wn),Wn是该文档中出现过的单词,允许重复:

P( C ) = 类别C下单词总数/整个训练样本的单词总数 (重复出现的单词也进行计算)
P(Wn|C)=(类C下单词Wn在训练样本中出现过的次数之和+1)/(类c下单词总数+|V|)

模型平滑型处理:
V是训练样本的单词表(即抽取单词,单词出现多次,只算一个)
|V|则表示训练样本包含多少种单词。

P(Wn|C)可以看作是单词Wn在证明d属于类c上提供了多大的证据。
P( C )则可以认为是类别c在整体上占多大比例(有多大可能性)。

  • 伯努利模型
    以文档作为统计单位,忽略各个特征词汇频次,只统计特征词汇在文档中是否存在。
    P( c )= 类c下训练数据条数/整个训练样本的训练数据总数
    P(Wn|c)=(类c下包含单词Wn的文件数+1)/(类c下文件总数+2)
    注意:这里也做了相关平滑型处理!

当然还有一些平滑性的处理,但是博主没有去做这个工作(太懒了),有人会说上面描述中的单词怎么从文本中获得,其实在上一篇博客中已经提到了jieba模块,网上也有相关的使用文档,可以去学习。算法的项目具体实现在我的练习项目中也有体现,下面还是给出我的项目地址https://gitee.com/wolf_dpf/pye-mail

猜你喜欢

转载自blog.csdn.net/Wolf_pfD/article/details/85011060