分享
分享赚钱 收藏 举报 版权申诉 / 31

类型贝叶斯过滤垃圾邮件算法的基本步骤.docx

  • 上传人:gnk289057
  • 文档编号:6545995
  • 上传时间:2019-04-16
  • 格式:DOCX
  • 页数:31
  • 大小:497.18KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    贝叶斯过滤垃圾邮件算法的基本步骤.docx
    资源描述:

    1、一、贝叶斯过滤算法的基本步骤1)、收集大量的垃圾邮件和非垃圾邮件,建立垃圾邮件集和非垃圾邮件集;2)、提取邮件主题和邮件体中的独立字串例如 ABC32,¥234 等作为 TOKEN串并统计提取出的 TOKEN串出现的次数即字频。按照上述的方法分别处理垃圾邮件集和非垃圾邮件集中的所有邮件;3)、每一个邮件集对应一个哈希表,Hashtable_Good 对应非垃圾邮件集而Hashtable_Bad对应垃圾邮件集。表中存储 TOKEN串到字频的映射关系;4)、计算每个哈希表中 TOKEN串出现的概率 P=(某 TOKEN串的字频)/(对应哈希表的长度) ;5)、综合考虑 hashtable_good

    2、和 hashtable_bad,推断出当新来的邮件中出现某个 TOKEN串时,该新邮件为垃圾邮件的概率。数学表达式为:A事件邮件为垃圾邮件;t1,t2 ,.,tn代表 TOKEN串则 P(A|ti)表示在邮件中出现 TOKEN串 ti时,该邮件为垃圾邮件的概率。设P1(ti)=(ti 在 hashtable_good中的值)P2(ti)=(ti 在 hashtable_ bad中的值)则 P(A|ti)= P1(ti)/(P1(ti)+ P2(ti);6)、建立新的哈希表 hashtable_probability存储 TOKEN串 ti到 P(A|ti)的映射;7)、至此,垃圾邮件集和非垃圾

    3、邮件集的学习过程结束。根据建立的哈希表 Hashtable_Probability可以估计一封新到的邮件为垃圾邮件的可能性。当新到一封邮件时,按照步骤 2)生成 TOKEN串。查询hashtable_probability得到该 TOKEN 串的键值。假设由该邮件共得到 N个 TOKEN串,t1,t2.tn, hashtable_probability中对应的值为 P1,P2, 。 。 。 。 。 。PN,P(A|t1 ,t2, t3tn)表示在邮件中同时出现多个 TOKEN串 t1,t2.tn时,该邮件为垃圾邮件的概率。由复合概率公式可得P(A|t1 ,t2, t3tn)=(P1*P2*。

    4、。 。 。PN)/P1*P2*。 。 。 。 。PN+(1-P1)*(1-P2)*。 。 。 (1-PN)当 P(A|t1 ,t2, t3tn)超过预定阈值时,就可以判断邮件为垃圾邮件。二、贝叶斯过滤算法举例例如:一封含有“法 轮 功”字样的垃圾邮件 A和 一封含有“法律”字样的非垃圾邮件 B根据邮件 A生成 hashtable_ bad,该哈希表中的记录为法:1 次轮:1 次功:1 次计算得在本表中:法出现的概率为 0.3轮出现的概率为 0.3功出现的概率为 0.3根据邮件 B生成 hashtable_good,该哈希表中的记录为:法:1律:1计算得在本表中:法出现的概率为 0.5律出现的概

    5、率为 0.5综合考虑两个哈希表,共有四个 TOKEN串: 法 轮 功 律当邮件中出现“法”时,该邮件为垃圾邮件的概率为:P=0.3/(0.3+0.5)= 0.375出现“轮”时:P=0.3/(0.3+0)= 1出现“功“时:P=0.3/(0.3+0)= 1出现“律”时P=0/(0+0.5)= 0;由此可得第三个哈希表:hashtable_probability 其数据为:法:0.375轮:1功:1律:0当新到一封含有“功律”的邮件时,我们可得到两个 TOKEN串,功 律查询哈希表 hashtable_probability可得P(垃圾邮件| 功)= 1P (垃圾邮件|律)= 0此时该邮件为垃圾

    6、邮件的可能性为:P=(0 * 1)/ 0 * 1 +(1-0)*(1-1) = 0由此可推出该邮件为非垃圾邮件基于朴素贝叶斯分类器的文本分类算法(上)本文缘起于最近在读的一本书- Tom M.Mitchell 的 机器学习,书中第6章详细讲解了贝叶斯学习的理论知识,为了将其应用到实际中来,参考了网上许多资料,从而得此文。文章将分为两个部分,第一部分将介绍贝叶斯学习的相关理论(如果你对理论不感兴趣,请直接跳至第二部分)。第二部分讲如何将贝叶斯分类器应用到中文文本分类,随文附上示例代码。Introduction我们在概率论和数理统计这门课的第一章都学过贝叶斯公式和全概率公式,先来简单复习下:条件概

    7、率 定义 设 A, B是两个事件,且 P(A)0 称 P(BA)=P(AB)/P(A)为在条件 A下发生的条件事件 B发生的条件概率。乘法公式 设 P(A)0 则有 P(AB)=P(BA)P(A) 全概率公式和贝叶斯公式定义 设 S为试验 E的样本空间,B1, B2, Bn 为 E的一组事件,若 BiBj=, ij, i, j=1, 2, ,n; B1B2Bn=S 则称 B1, B2, , Bn为样本空间的一个划分。定理 设试验 E的样本空间为,A 为 E的事件,B1, B2, ,Bn 为的一个划分,且 P(Bi)0 (i=1, 2, n),则 P(A)=P(AB1)P(B1)+P(AB2)+

    8、 +P(ABn)P(Bn)称为全概率公式。定理 设试验俄 E的样本空间为 S,A 为 E的事件,B1, B2, ,Bn 为的一个划分,则P(BiA)=P(ABi)P(Bi)/P(BAj)P(Aj)=P(BAi)P(Ai)/P(B) 称为贝叶斯公式。说明:i,j 均为下标,求和均是 1到 n 下面我再举个简单的例子来说明下。示例 1考 虑一个医疗诊断问题,有两种可能的假设:(1)病人有癌症。(2)病人无癌症。样本数据来自某化验测试,它也有两种可能的结果:阳性和阴性。假设我们已经 有先验知识:在所有人口中只有 0.008的人患病。此外,化验测试对有病的患者有 98%的可能返回阳性结果,对无病患者有

    9、 97%的可能返回阴性结果。上面的数据可以用以下概率式子表示: P(cancer)=0.008,P(无 cancer)=0.992P(阳性|cancer)=0.98,P(阴性|cancer)=0.02P(阳性|无 cancer)=0.03,P(阴性|无 cancer)=0.97假设现在有一个新病人,化验测试返回阳性,是否将病人断定为有癌症呢?我们可以来计算极大后验假设:P(阳性|cancer)p(cancer)=0.98*0.008 = 0.0078P(阳性|无 cancer)*p(无 cancer)=0.03*0.992 = 0.0298因此,应该判断为无癌症。贝叶斯学习理论贝叶斯是一种基于

    10、概率的学习算法,能够用来计算显式的假设概率,它基于假设的先验概率,给定假设下观察到不同数据的概率以及观察到的数据本身(后面我们可以看到,其实就这么三点东西,呵呵)。我们用 P(h)表示没有训练样本数据前假设 h拥有的初始概率,也就称为 h的先验概率,它反映了我们所拥有的关于 h是一个正确假设的机会的背景知识。当然如 果没有这个先验知识的话,在实际处理中,我们可以简单地将每一种假设都赋给一个相同的概率。类似,P(D)代表将要观察的训练样本数据 D的先验概率(也就 是说,在没有确定某一个假设成立时 D的概率)。然后是 P(D/h),它表示假设 h成立时观察到数据 D的概率。在机器学习中,我们感兴趣

    11、的是 P(h/D), 也就是给定了一个训练样本数据 D,判断假设 h成立的概率,这也称之为后验概率,它反映了在看到训练样本数据 D后假设 h成立的置信度。(注:后验概率 p(h/D)反映了训练数据 D的影响,而先验概率 p(h)是独立于 D的)。P(h|D) = P(D|h)P(h)/p(D),从贝叶斯公式可以看出,后验概率 p(h/D)取决于 P(D|h)P(h)这个乘积,呵呵,这就是贝叶斯分类算法的核心思 想。我们要做的就是要考虑候选假设集合 H,并在其中寻找当给定训练数据 D时可能性最大的假设 h(h 属于 H)。简单点说,就是给定了一个训练样本数据(样本数据已经人工分类好了),我们应该

    12、如何从这个样本数据集去学习,从而当我们碰到新的数据时,可以将新数据分类到某一个类别中去。那可以看到,上面的贝叶斯理论和这个任务是吻合的。朴素贝叶斯分类也许你觉得这理论还不是很懂,那我再举个简单的例子,让大家对这个算法的原理有个快速的认识。(注:这个示例摘抄自机器学习这本书的第三章的表 3-2.)假设给定了如下训练样本数据,我们学习的目标是根据给定的天气状况判断你对 PlayTennis这个请求的回答是 Yes还是 No。Day Outlook Temperature Humidity Wind PlayTennisD1 Sunny Hot High Weak NoD2 Sunny Hot Hi

    13、gh Strong NoD3 Overcast Hot High Weak YesD4 Rain Mild High Weak YesD5 Rain Cool Normal Weak YesD6 Rain Cool Normal Strong NoD7 Overcast Cool Normal Strong YesD8 Sunny Mild High Weak NoD9 Sunny Cool Normal Weak YesD10 Rain Mild Normal Weak YesD11 Sunny Mild Normal Strong YesD12 Overcast Mild High Str

    14、ong YesD13 Overcast Hot Normal Weak YesD14 Rain Mild High Strong No可以看到这里样本数据集提供了 14个训练样本,我们将使用此表的数据,并结合朴素贝叶斯分类器来分类下面的新实例:(Outlook = sunny,Temprature = cool,Humidity = high,Wind = strong)我们的任务就是对此新实例预测目标概念 PlayTennis的目标值(yes 或 no).由上面的公式可以得到:可以得到:P(PlayTennis =yes) = 9/14 = 0.64,P(PlayTennis=no)=5/1

    15、4 = 0.36P(Wind=Stong| PlayTennis =yes)=3/9=0.33,p(Wind=Stong| PlayTennis =no)=3/5 = 0.6其他数据类似可得,代入后得到:P(yes)P(Sunny|yes)P(Cool|yes)P(high|yes)P(Strong|yes) = 0.0053P(no)P(Sunny|no)P(Cool|no)P(high|no)P(Strong|no)=0.0206因此应该分类到 no这一类中。贝叶斯文本分类算法好了,现在开始进入本文的主旨部分:如何将贝叶斯分类器应用到中文文本的分类上来?根据联合概率公式(全概率公式)M训练

    16、文本集合中经过踢出无用词去除文本预处理之后关键字的数量。基于朴素贝叶斯分类器的文本分类算法(下)文本的分类和聚类是一个比较有意思的话题,我以前也写过一篇 blog 基于 K-Means 的文本聚类算法,加上最近读了几本数据挖掘和机器学习的书籍,因此很想写点东西来记录下学习的所得。在本文的上半部分 基于朴素贝叶斯分类器的文本分类算法(上)一文中简单介绍了贝叶斯学习的基本理论,这一篇将展示如何将该理论运用到中文文本分类中来,具体的文本分类原理就不再介绍了,在上半部分有,也可以参见代码的注释。文本特征向量文本特征向量可以描述为文本中的字词构成的属性。例如给出文本:Good good study,Da

    17、y day up.可以获得该文本的特征向量集: Good, good, study, Day, day , up.朴素贝叶斯模型是文本分类模型中的一种简单但性能优越的的分类模型。为了简化计算过程,假定各待分类文本特征变量是相互独立的,即“朴素贝叶斯模型的假设”。相互独立表明了所有特征变量之间的表述是没有关联的。如上例中,good和study这两个特征变量就是没有任何关联的。在上例中,文本是英文,但由于中文本身是没有自然分割符(如空格之类符号),所以要获得中文文本的特征变量向量首先需要对文本进行中文分词中文分词这里采用极易中文分词组件,这个中文分词组件可以免费使用,提供 Lucene 接口,跨平

    18、台,性能可靠。package com.vista;import java.io.IOException; import jeasy.analysis.MMAnalyzer;/* 中文分词器*/public class ChineseSpliter /* 对给定的文本进行中文分词* param text 给定的文本* param splitToken 用于分割的标记, 如“|“* return 分词完毕的文本*/public static String split(String text,String splitToken)String result = null;MMAnalyzer anal

    19、yzer = new MMAnalyzer(); try result = analyzer.segment(text, splitToken); catch (IOException e) e.printStackTrace(); return result;停用词处理去掉文档中无意思的词语也是必须的一项工作,这里简单的定义了一些常见的停用词,并根据这些常用停用词在分词时进行判断。package com.vista;/* 停用词处理器* author phinecos * */public class StopWordsHandler private static String stopWo

    20、rdsList =“的“ , “我们“ ,“要“, “自己“,“之“, “将“ ,“,“”“,“,“,“(“, “)“ ,“后“, “应“ ,“到“,“某“ ,“后“, “个“,“ 是“,“位“, “新“, “一“ ,“两“ ,“在“,“中“,“ 或“, “有“ ,“更“, “好“ ,“;/常用停用词public static boolean IsStopWord(String word)for(int i=0;i先验概率计算* P(cj)=N(C=cj)/N * 其中,N(C=cj) 表示类别 cj中的训练文本数量;* N表示训练文本集总数量。*/public class PriorProb

    21、ability private static TrainingDataManager tdm =new TrainingDataManager();/* 先验概率* param c 给定的分类* return 给定条件下的先验概率*/public static float calculatePc(String c)float ret = 0F;float Nc = tdm.getTrainingFileCountOfClassification(c);float N = tdm.getTrainingFileCount();ret = Nc / N;return ret;分类条件概率这是另一个

    22、影响因子,和先验概率一起来决定最终结果package com.vista;/* 类 条件概率计算* 类条件概率* P(xj|cj)=( N(X=xi, C=cj* )+1 ) / ( N(C=cj)+M+V ) * 其中,N(X=xi, C=cj)表示类别 cj中包含属性 x* i的训练文本数量;N(C=cj) 表示类别 cj中的训练文本数量;M 值用于避免* N(X=xi, C=cj)过小所引发的问题;V 表示类别的总数。* 条件概率* 定义 设 A, B是两个事件,且 P(A)0 称* P(BA)=P(AB)/P(A)* 为在条件 A下发生的条件事件 B发生的条件概率。*/public c

    23、lass ClassConditionalProbability private static TrainingDataManager tdm = new TrainingDataManager();private static final float M = 0F;/* 计算类条件概率* param x 给定的文本属性* param c 给定的分类* return 给定条件下的类条件概率*/public static float calculatePxc(String x, String c) float ret = 0F;float Nxc = tdm.getCountContainKey

    24、OfClassification(c, x);float Nc = tdm.getTrainingFileCountOfClassification(c);float V = tdm.getTraningClassifications().length;ret = (Nxc + 1) / (Nc + M + V); /为了避免出现 0这样极端情况,进行加权处理return ret;分类结果用来保存各个分类及其计算出的概率值,package com.vista;/* 分类结果*/public class ClassifyResult public double probility;/分类的概率p

    25、ublic String classification;/分类public ClassifyResult()this.probility = 0;this.classification = null;朴素贝叶斯分类器利用样本数据集计算先验概率和各个文本向量属性在分类中的条件概率,从而计算出各个概率值,最后对各个概率值进行排序,选出最大的概率值,即为所属的分类。package com.vista;import com.vista.ChineseSpliter;import com.vista.ClassConditionalProbability;import com.vista.PriorPr

    26、obability;import com.vista.TrainingDataManager;import com.vista.StopWordsHandler;import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.Vector;/* 朴素贝叶斯分类器*/public class BayesClassifier private TrainingDataManager tdm;/训练集管理器private String trainnigDataPath;/训练集路

    27、径private static double zoomFactor = 10.0f;/* 默认的构造器,初始化训练集*/public BayesClassifier() tdm =new TrainingDataManager();/* 计算给定的文本属性向量 X在给定的分类 Cj中的类条件概率* ClassConditionalProbability连乘值* param X 给定的文本属性向量* param Cj 给定的类别* return 分类条件概率连乘值,即*/float calcProd(String X, String Cj) float ret = 1.0F;/ 类条件概率连乘f

    28、or (int i = 0; i v1 = new Vector();for(int i=0;i crs = new ArrayList();/分类结果for (int i = 0; i 作为训练样本, XC。例如:=Beijing joins the World Trade Organization, China对于这个只有一句话的文档,我们把它归类到 China,即打上 china 标签。朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)即为词频型和伯努利模型(Bernoulli model) 即文档型。二者的计算粒度不一样,多项式模型以单词

    29、为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。计算后验概率时,对于一个文档d,多项式模型中,只有在 d 中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在 d 中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的。这里暂不考虑特征抽取、为避免消除测试文档时类条件概率中有为 0 现象而做的取对数等问题。2.1 多项式模型1)基本原理在多项式模型中, 设某文档 d=(t1,t2,tk),tk 是该文档中出现过的单词,允许重复,则先验概率 P(c)= 类 c 下单词总数/整个训练样本的单词总数类条件概率 P(tk|c)=(类 c 下单

    30、词 tk 在各个文档中出现过的次数之和+1)/( 类 c 下单词总数+|V|)V 是训练样本的单词表(即抽取单词,单词出现多次,只算一个),|V|则表示训练样本包含多少种单词。 P(tk|c)可以看作是单词 tk 在证明 d 属于类 c 上提供了多大的证据,而 P(c)则可以认为是类别 c 在整体上占多大比例(有多大可能性)。2)举例给定一组分好类的文本训练数据,如下:docId doc 类别 In c=China?1 Chinese Beijing Chinese yes2 Chinese Chinese Shanghai yes3 Chinese Macao yes4 Tokyo Japa

    31、n Chinese no给定一个新样本 Chinese Chinese Chinese Tokyo Japan,对其进行分类。该文本用属性向量表示为d=(Chinese, Chinese, Chinese, Tokyo, Japan),类别集合为 Y=yes, no。类 yes 下总共有 8 个单词,类 no 下总共有 3 个单词,训练样本单词总数为 11,因此 P(yes)=8/11, P(no)=3/11。类条件概率计算如下:P(Chinese | yes)=(5+1)/(8+6)=6/14=3/7P(Japan | yes)=P(Tokyo | yes)= (0+1)/(8+6)=1/1

    32、4P(Chinese|no)=(1+1)/(3+6)=2/9P(Japan|no)=P(Tokyo| no) =(1+1)/(3+6)=2/9分母中的 8,是指 yes 类别下 textc 的长度,也即训练样本的单词总数,6 是指训练样本有Chinese,Beijing,Shanghai, Macao, Tokyo, Japan 共 6 个单词,3 是指 no 类下共有 3 个单词。有了以上类条件概率,开始计算后验概率:P(yes | d)=(3/7)31/141/148/11=108/1848770.00058417P(no | d)= (2/9)32/92/93/11=32/2165130

    33、.00014780比较大小,即可知道这个文档属于类别 china。2.2 伯努利模型1)基本原理P(c)= 类 c 下文件总数/整个训练样本的文件总数P(tk|c)=(类 c 下包含单词 tk 的文件数+1)/( 类 c 下单词总数+2)2)举例使用前面例子中的数据,模型换成伯努利模型。类 yes 下总共有 3 个文件,类 no 下有 1 个文件,训练样本文件总数为 11,因此 P(yes)=3/4, P(Chinese | yes)=(3+1)/(3+2)=4/5,条件概率如下:P(Japan | yes)=P(Tokyo | yes)=(0+1)/(3+2)=1/5P(Beijing |

    34、yes)= P(Macao|yes)= P(Shanghai |yes)=(1+1)/(3+2)=2/5P(Chinese|no)=(1+1)/(1+2)=2/3P(Japan|no)=P(Tokyo| no) =(1+1)/(1+2)=2/3P(Beijing| no)= P(Macao| no)= P(Shanghai | no)=(0+1)/(1+2)=1/3有了以上类条件概率,开始计算后验概率,P(yes|d)=P(yes)P(Chinese|yes)P(Japan|yes)P(Tokyo|yes)(1-P(Beijing|yes)(1-P(Shanghai|yes)(1-P(Maca

    35、o|yes)=3/44/51/51/5(1-2/5) (1-2/5)(1-2/5)=81/156250.005P(no|d)= 1/42/32/32/3(1-1/3)(1-1/3)(1-1/3)=16/7290.022因此,这个文档不属于类别 china。后记:文本分类是作为离散型数据的,以前糊涂是把连续型与离散型弄混一块了,朴素贝叶斯用于很多方面,数据就会有连续和离散的,连续型时可用正态分布,还可用区间,将数据的各属性分成几个区间段进行概率计算,测试时看其属性的值在哪个区间就用哪个条件概率。再有 TF、TDIDF ,这些只是描述事物属性时的不同计算方法,例如文本分类时,可以用单词在本文档中出现的次数描述一个文档,可以用出现还是没出现即 0 和 1 来描述,还可以用单词在本类文档中出现的次数与这个单词在剩余类出现的次数(降低此属性对某类的重要性)相结合来表述。

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:贝叶斯过滤垃圾邮件算法的基本步骤.docx
    链接地址:https://www.docduoduo.com/p-6545995.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开