贝叶斯过滤垃圾邮件算法的基本步骤.docx
- 文档编号:26405508
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:29
- 大小:464.46KB
贝叶斯过滤垃圾邮件算法的基本步骤.docx
《贝叶斯过滤垃圾邮件算法的基本步骤.docx》由会员分享,可在线阅读,更多相关《贝叶斯过滤垃圾邮件算法的基本步骤.docx(29页珍藏版)》请在冰豆网上搜索。
贝叶斯过滤垃圾邮件算法的基本步骤
一、贝叶斯过滤算法的基本步骤
1)、收集大量的垃圾邮件和非垃圾邮件,建立垃圾邮件集和非垃圾邮件集;
2)、提取邮件主题和邮件体中的独立字串例如ABC32,¥234等作为TOKEN串并统计提取出的TOKEN串出现的次数即字频。
按照上述的方法分别处理垃圾邮件集和非垃圾邮件集中的所有邮件;
3)、每一个邮件集对应一个哈希表,Hashtable_Good对应非垃圾邮件集而Hashtable_Bad对应垃圾邮件集。
表中存储TOKEN串到字频的映射关系;
4)、计算每个哈希表中TOKEN串出现的概率P=(某TOKEN串的字频)/(对应哈希表的长度);
5)、综合考虑hashtable_good和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)、至此,垃圾邮件集和非垃圾邮件集的学习过程结束。
根据建立的哈希表Hashtable_Probability可以估计一封新到的邮件为垃圾邮件的可能性。
当新到一封邮件时,按照步骤2)生成TOKEN串。
查询hashtable_probability得到该TOKEN串的键值。
假设由该邮件共得到N个TOKEN串,t1,t2…….tn,hashtable_probability中对应的值为P1,P2,。
。
。
。
。
。
PN,P(A|t1,t2,t3……tn)表示在邮件中同时出现多个TOKEN串t1,t2…….tn时,该邮件为垃圾邮件的概率。
由复合概率公式可得
P(A|t1,t2,t3……tn)=(P1*P2*。
。
。
。
PN)/[P1*P2*。
。
。
。
。
PN+(1-P1)*(1-P2)*。
。
。
(1-PN)]
当P(A|t1,t2,t3……tn)超过预定阈值时,就可以判断邮件为垃圾邮件。
二、贝叶斯过滤算法举例
例如:
一封含有“法轮功”字样的垃圾邮件A和一封含有“法律”字样的非垃圾邮件B
根据邮件A生成hashtable_bad,该哈希表中的记录为
法:
1次
轮:
1次
功:
1次
计算得在本表中:
法出现的概率为0.3
轮出现的概率为0.3
功出现的概率为0.3
根据邮件B生成hashtable_good,该哈希表中的记录为:
法:
1
律:
1
计算得在本表中:
法出现的概率为0.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(垃圾邮件|功)=1
P(垃圾邮件|律)=0
此时该邮件为垃圾邮件的可能性为:
P=(0*1)/[0*1+(1-0)*(1-1)]=0
由此可推出该邮件为非垃圾邮件
基于朴素贝叶斯分类器的文本分类算法(上)
本文缘起于最近在读的一本书--TomM.Mitchell的《机器学习》,书中第6章详细讲解了贝叶斯学习的理论知识,为了将其应用到实际中来,参考了网上许多资料,从而得此文。
文章将分为两个部分,第一部分将介绍贝叶斯学习的相关理论(如果你对理论不感兴趣,请直接跳至第二部分<<基于朴素贝叶斯分类器的文本分类算法(下)>>)。
第二部分讲如何将贝叶斯分类器应用到中文文本分类,随文附上示例代码。
Introduction
我们在《概率论和数理统计》这门课的第一章都学过贝叶斯公式和全概率公式,先来简单复习下:
条件概率
定义设A,B是两个事件,且P(A)>0称P(B∣A)=P(AB)/P(A)为在条件A下发生的条件事件B发生的条件概率。
乘法公式设P(A)>0则有P(AB)=P(B∣A)P(A)
全概率公式和贝叶斯公式
定义设S为试验E的样本空间,B1,B2,…Bn为E的一组事件,若BiBj=Ф,i≠j,i,j=1,2,…,n;B1∪B2∪…∪Bn=S则称B1,B2,…,Bn为样本空间的一个划分。
定理设试验E的样本空间为,A为E的事件,B1,B2,…,Bn为的一个划分,且P(Bi)>0(i=1,2,…n),则P(A)=P(A∣B1)P(B1)+P(A∣B2)+…+P(A∣Bn)P(Bn)称为全概率公式。
定理设试验俄E的样本空间为S,A为E的事件,B1,B2,…,Bn为的一个划分,则
P(Bi∣A)=P(A∣Bi)P(Bi)/∑P(B|Aj)P(Aj)=P(B|Ai)P(Ai)/P(B)
称为贝叶斯公式。
说明:
i,j均为下标,求和均是1到n
下面我再举个简单的例子来说明下。
示例1
考虑一个医疗诊断问题,有两种可能的假设:
(1)病人有癌症。
(2)病人无癌症。
样本数据来自某化验测试,它也有两种可能的结果:
阳性和阴性。
假设我们已经有先验知识:
在所有人口中只有0.008的人患病。
此外,化验测试对有病的患者有98%的可能返回阳性结果,对无病患者有97%的可能返回阴性结果。
上面的数据可以用以下概率式子表示:
P(cancer)=0.008,P(无cancer)=0.992
P(阳性|cancer)=0.98,P(阴性|cancer)=0.02
P(阳性|无cancer)=0.03,P(阴性|无cancer)=0.97
假设现在有一个新病人,化验测试返回阳性,是否将病人断定为有癌症呢?
我们可以来计算极大后验假设:
P(阳性|cancer)p(cancer)=0.98*0.008=0.0078
P(阳性|无cancer)*p(无cancer)=0.03*0.992=0.0298
因此,应该判断为无癌症。
贝叶斯学习理论
贝叶斯是一种基于概率的学习算法,能够用来计算显式的假设概率,它基于假设的先验概率,给定假设下观察到不同数据的概率以及观察到的数据本身(后面我们可以看到,其实就这么三点东西,呵呵)。
我们用P(h)表示没有训练样本数据前假设h拥有的初始概率,也就称为h的先验概率,它反映了我们所拥有的关于h是一个正确假设的机会的背景知识。
当然如果没有这个先验知识的话,在实际处理中,我们可以简单地将每一种假设都赋给一个相同的概率。
类似,P(D)代表将要观察的训练样本数据D的先验概率(也就是说,在没有确定某一个假设成立时D的概率)。
然后是P(D/h),它表示假设h成立时观察到数据D的概率。
在机器学习中,我们感兴趣的是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)。
简单点说,就是给定了一个训练样本数据(样本数据已经人工分类好了),我们应该如何从这个样本数据集去学习,从而当我们碰到新的数据时,可以将新数据分类到某一个类别中去。
那可以看到,上面的贝叶斯理论和这个任务是吻合的。
朴素贝叶斯分类
也许你觉得这理论还不是很懂,那我再举个简单的例子,让大家对这个算法的原理有个快速的认识。
(注:
这个示例摘抄自《机器学习》这本书的第三章的表3-2.)
假设给定了如下训练样本数据,我们学习的目标是根据给定的天气状况判断你对PlayTennis这个请求的回答是Yes还是No。
Day
Outlook
Temperature
Humidity
Wind
PlayTennis
D1
Sunny
Hot
High
Weak
No
D2
Sunny
Hot
High
Strong
No
D3
Overcast
Hot
High
Weak
Yes
D4
Rain
Mild
High
Weak
Yes
D5
Rain
Cool
Normal
Weak
Yes
D6
Rain
Cool
Normal
Strong
No
D7
Overcast
Cool
Normal
Strong
Yes
D8
Sunny
Mild
High
Weak
No
D9
Sunny
Cool
Normal
Weak
Yes
D10
Rain
Mild
Normal
Weak
Yes
D11
Sunny
Mild
Normal
Strong
Yes
D12
Overcast
Mild
High
Strong
Yes
D13
Overcast
Hot
Normal
Weak
Yes
D14
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/14=0.36
P(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.0053
P(no)P(Sunny|no)P(Cool|no)P(high|no)P(Strong|no)=0.0206
因此应该分类到no这一类中。
贝叶斯文本分类算法
好了,现在开始进入本文的主旨部分:
如何将贝叶斯分类器应用到中文文本的分类上来?
根据联合概率公式(全概率公式)
M——训练文本集合中经过踢出无用词去除文本预处理之后关键字的数量。
基于朴素贝叶斯分类器的文本分类算法(下)
文本的分类和聚类是一个比较有意思的话题,我以前也写过一篇blog《基于K-Means的文本聚类算法》,加上最近读了几本数据挖掘和机器学习的书籍,因此很想写点东西来记录下学习的所得。
在本文的上半部分《基于朴素贝叶斯分类器的文本分类算法(上)》一文中简单介绍了贝叶斯学习的基本理论,这一篇将展示如何将该理论运用到中文文本分类中来,具体的文本分类原理就不再介绍了,在上半部分有,也可以参见代码的注释。
文本特征向量
文本特征向量可以描述为文本中的字/词构成的属性。
例如给出文本:
Goodgoodstudy,Daydayup.
可以获得该文本的特征向量集:
{Good,good,study,Day,day,up.}
朴素贝叶斯模型是文本分类模型中的一种简单但性能优越的的分类模型。
为了简化计算过程,假定各待分类文本特征变量是相互独立的,即“朴素贝叶斯模型的假设”。
相互独立表明了所有特征变量之间的表述是没有关联的。
如上例中,[good]和[study]这两个特征变量就是没有任何关联的。
在上例中,文本是英文,但由于中文本身是没有自然分割符(如空格之类符号),所以要获得中文文本的特征变量向量首先需要对文本进行中文分词
中文分词
这里采用极易中文分词组件,这个中文分词组件可以免费使用,提供Lucene接口,跨平台,性能可靠。
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 analyzer = 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 stopWordsList[] ={"的", "我们","要","自己","之","将","“","”",",","(",")","后","应","到","某","后","个","是","位","新","一","两","在","中","或","有","更","好",""};//常用停用词
public static boolean IsStopWord(String word)
{
for(int i=0;i { if(word.equalsIgnoreCase(stopWordsList[i])) return true; } return false; } } 训练集管理器 我们的系统首先需要从训练样本集中得到假设的先验概率和给定假设下观察到不同数据的概率。 package com.vista; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; /** * 训练集管理器 */ public class TrainingDataManager { private String[] traningFileClassifications;//训练语料分类集合 private File traningTextDir;//训练语料存放目录 private static String defaultPath = "D: \\TrainningSet"; public TrainingDataManager() { traningTextDir = new File(defaultPath); if (! traningTextDir.isDirectory()) { throw new IllegalArgumentException("训练语料库搜索失败! [" +defaultPath + "]"); } this.traningFileClassifications = traningTextDir.list(); } /** * 返回训练文本类别,这个类别就是目录名 * @return 训练文本类别 */ public String[] getTraningClassifications() { return this.traningFileClassifications; } /** * 根据训练文本类别返回这个类别下的所有训练文本路径(full path) * @param classification 给定的分类 * @return 给定分类下所有文件的路径(full path) */ public String[] getFilesPath(String classification) { File classDir = new File(traningTextDir.getPath() +File.separator +classification); String[] ret = classDir.list(); for (int i = 0; i < ret.length; i++) { ret[i] = traningTextDir.getPath() +File.separator +classification +File.separator +ret[i]; } return ret; } /** * 返回给定路径的文本文件内容 * @param filePath 给定的文本文件路径 * @return 文本内容 * @throws java.io.FileNotFoundException * @throws java.io.IOException */ public static String getText(String filePath) throws FileNotFoundException,IOException { InputStreamReader isReader =new InputStreamReader(new FileInputStream(filePath),"GBK"); BufferedReader reader = new BufferedReader(isReader); String aline; StringBuilder sb = new StringBuilder(); while ((aline = reader.readLine()) ! = null) { sb.append(aline + " "); } isReader.close(); reader.close(); return sb.toString(); } /** * 返回训练文本集中所有的文本数目 * @return 训练文本集中所有的文本数目 */ public int getTrainingFileCount() { int ret = 0; for (int i = 0; i < traningFileClassifications.length; i++) { ret +=getTrainingFileCountOfClassification(traningFileClassifications[i]); } return ret; } /** * 返回训练文本集中在给定分类下的训练文本数目 * @param classification 给定的分类 * @return 训练文本集中在给定分类下的训练文本数目 */ public int getTrainingFileCountOfClassification(String classification) { File classDir = new File(traningTextDir.getPath() +File.separator +classification); return classDir.list().length; } /** * 返回给定分类中包含关键字/词的训练文本的数目 * @param classification 给定的分类 * @param key 给定的关键字/词 * @return 给定分类中包含关键字/词的训练文本的数目 */ public int getCountContainKeyOfClassification(String classification,String key) { int ret = 0; try
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贝叶斯 过滤 垃圾邮件 算法 基本 步骤