转自 寒小阳html
1. 引言¶
贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理不少问题时直接而又高效,不少高级天然语言处理模型也能够从它演化而来。所以,学习贝叶斯方法,是研究天然语言处理问题的一个很是好的切入口。python
2. 贝叶斯公式¶
贝叶斯公式就一行:web
P(Y|X)=P(X|Y)P(Y)P(X)
而它实际上是由如下的联合几率公式推导出来:算法
P(Y,X)=P(Y|X)P(X)=P(X|Y)P(Y)
其中
P(Y)
叫作先验几率,
P(Y|X)
叫作后验几率,
P(Y,X)
叫作联合几率。安全
没了,贝叶斯最核心的公式就这么些。网络
3. 用机器学习的视角理解贝叶斯公式¶
在机器学习的视角下,咱们把
X
理解成“具备某特征”,把
Y
理解成“类别标签”(通常机器学习为题中都是X=>特征
, Y=>结果
对吧)。在最简单的二分类问题(是
与否
断定)下,咱们将
Y
理解成“属于某类”的标签。因而贝叶斯公式就变造成了下面的样子:机器学习
P(“属于某类”|“具有某特征”)=P(“具有某特征”|“属于某类”)P(“属于某类”)P(“具有某特征”)
svg
咱们简化解释一下上述公式:函数
P(“属于某类”|“具有某特征”)=
在已知某样本“具备某特征”的条件下,该样本“属于某类”的几率。因此叫作『后验几率』。
P(“具有某特征”|“属于某类”)=
在已知某样本“属于某类”的条件下,该样本“具备某特征”的几率。
P(“属于某类”)=
(在未知某样本具备该“具备某特征”的条件下,)该样本“属于某类”的几率。因此叫作『先验几率』。
P(“具有某特征”)=
(在未知某样本“属于某类”的条件下,)该样本“具备某特征”的几率。
工具
而咱们二分类问题的最终目的就是要判断
P(“属于某类”|“具有某特征”)
是否大于1/2就够了。贝叶斯方法把计算“具备某特征的条件下属于某类”的几率转换成须要计算“属于某类的条件下具备某特征”的几率,然后者获取方法就简单多了,咱们只须要找到一些包含已知特征标签的样本,便可进行训练。而样本的类别标签都是明确的,因此贝叶斯方法在机器学习里属于有监督学习方法。
这里再补充一下,通常『先验几率』、『后验几率』是相对出现的,好比
P(Y)
与
P(Y|X)
是关于
Y
的先验几率与后验几率,
P(X)
与
P(X|Y)
是关于
X
的先验几率与后验几率。
4. 垃圾邮件识别¶
举个例子好啦,咱们如今要对邮件进行分类,识别垃圾邮件和普通邮件,若是咱们选择使用朴素贝叶斯分类器,那目标就是判断
P(“垃圾邮件”|“具有某特征”)
是否大于1/2。如今假设咱们有垃圾邮件和正常邮件各1万封做为训练集。须要判断如下这个邮件是否属于垃圾邮件:
“我司可办理正规发票(保真)17%增值税发票点数优惠!”
也就是判断几率
P(“垃圾邮件”|“我司可办理正规发票(保真)17%增值税发票点数优惠!”)
是否大于1/2。
咳咳,有木有发现,转换成的这个几率,计算的方法:就是写个计数器,而后+1 +1 +1统计出全部垃圾邮件和正常邮件中出现这句话的次数啊!!!好,具体点说:
P(“垃圾邮件”|“我司可办理正规发票(保真)17%增值税发票点数优惠!”)
=垃圾邮件中出现这句话的次数垃圾邮件中出现这句话的次数+正常邮件中出现这句话的次数
5. 分词¶
一个很悲哀可是很现实的结论: 训练集是有限的,而句子的可能性则是无限的。因此覆盖全部句子可能性的训练集是不存在的。
因此解决方法是? 句子的可能性无限,可是词语就那么些!!汉语经常使用字2500个,经常使用词语也就56000个(你终于明白小学语文老师的用心良苦了)。按人们的经验理解,两句话意思相近并不强求非得每一个字、词语都同样。好比“我司可办理正规发票,17%增值税发票点数优惠!”,这句话就比以前那句话少了“(保真)”这个词,可是意思基本同样。若是把这些状况也考虑进来,那样本数量就会增长,这就方便咱们计算了。
因而,咱们能够不拿句子做为特征,而是拿句子里面的词语(组合)做为特征去考虑。好比“正规发票”能够做为一个单独的词语,“增值税”也能够做为一个单独的词语等等。
句子“我司可办理正规发票,17%增值税发票点数优惠!”就能够变成(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))。
因而你接触到了中文NLP中,最最最重要的技术之一:分词!!!也就是把一整句话拆分红更细粒度的词语来进行表示。另外,分词以后去除标点符号、数字甚至无关成分(停用词)是特征预处理中的一项技术。
中文分词是一个专门的技术领域(我不会告诉你某搜索引擎厂码砖工有专门作分词的!!!),上过以前课程的同窗都知道python有一个很是方便的分词工具jieba,假定咱们已经完成分词工做:
咱们观察(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”),这能够理解成一个向量:向量的每一维度都表示着该特征词在文本中的特定位置存在。这种将特征拆分红更小的单元,依据这些更灵活、更细粒度的特征进行判断的思惟方式,在天然语言处理与机器学习中都是很是常见又有效的。
所以贝叶斯公式就变成了:
P(“垃圾邮件”|(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))
=P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)|"垃圾邮件")P(“垃圾邮件”)P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))
P(“正常邮件”|(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))
=P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)|"正常邮件")P(“正常邮件”)P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”))
6. 条件独立假设¶
下面咱们立刻会看到一个很是简单粗暴的假设。
几率
P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)|"垃圾邮件")
依旧不够好求,咱们引进一个很朴素的近似。为了让公式显得更加紧凑,咱们令字母S表示“垃圾邮件”,令字母H表示“正常邮件”。近似公式以下:
P((“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)|S)
=P(“我”|S)×P(“司”|S)×P(“可”|S)×P(“办理”|S)×P(“正规发票”|S)
×P(“保真”|S)×P(“增值税”|S)×P(“发票”|S)×P(“点数”|S)×P(“优惠”|S)
这就是传说中的条件独立假设。基于“正常邮件”的条件独立假设的式子与上式相似,此处省去。接着,将条件独立假设代入上面两个相反事件的贝叶斯公式。
因而咱们就只须要比较如下两个式子的大小:
C=P(“我”|S)P(“司”|S)P(“可”|S)P(“办理”|S)P(“正规发票”|S)
×P(“保真”|S)P(“增值税”|S)P(“发票”|S)P(“点数”|S)P(“优惠”|S)P(“垃圾邮件”)
C¯¯¯¯=P(“我”|H)P(“司”|H)P(“可”|H)P(“办理”|H)P(“正规发票”|H)
×P(“保真”|H)P(“增值税”|H)P(“发票”|H)P(“点数”|H)P(“优惠”|H)P(“正常邮件”)
厉(wo)害(cao)!酱紫处理后式子中的每一项都特别好求!只须要分别统计各种邮件中该关键词出现的几率就能够了!!!好比:
P(“发票”|S)=垃圾邮件中所有“发票”的次数垃圾邮件中所有词语的次数
统计次数很是方便,并且样本数量足够大,算出来的几率比较接近真实。因而垃圾邮件识别的问题就可解了。
7. 朴素贝叶斯(Naive Bayes),“Naive”在何处?¶
加上条件独立假设的贝叶斯方法就是朴素贝叶斯方法(Naive Bayes)。 Naive的发音是“乃一污”,意思是“朴素的”、“幼稚的”、“蠢蠢的”。咳咳,也就是说,大神们取名说该方法是一种比较萌蠢的方法,为啥?
将句子(“我”,“司”,“可”,“办理”,“正规发票”) 中的 (“我”,“司”)与(“正规发票”)调换一下顺序,就变成了一个新的句子(“正规发票”,“可”,“办理”, “我”, “司”)。新句子与旧句子的意思彻底不一样。但因为乘法交换律,朴素贝叶斯方法中算出来两者的条件几率彻底同样!计算过程以下:
P((“我”,“司”,“可”,“办理”,“正规发票”)|S)
=P(“我”|S)P(“司”|S)P(“可”|S)P(“办理”|S)P(“正规发票”|S)
=P(“正规发票”|S)P(“可”|S)P(“办理”|S)P(“我”|S)P(“司”|S)
=P((“正规发票”,“可”,“办理”,“我”,“司”)|S)
也就是说,在朴素贝叶斯眼里,“我司可办理正规发票”与“正规发票可办理我司”彻底相同。朴素贝叶斯失去了词语之间的顺序信息。这就至关于把全部的词汇扔进到一个袋子里随便搅和,贝叶斯都认为它们同样。所以这种状况也称做词袋子模型(bag of words)。

词袋子模型与人们的平常经验彻底不一样。好比,在条件独立假设的状况下,“武松打死了老虎”与“老虎打死了武松”被它认做一个意思了。恩,朴素贝叶斯就是这么单纯和直接,对比于其余分类器,好像是显得有那么点萌蠢。
8. 简单高效,吊丝逆袭¶
虽说朴素贝叶斯方法萌蠢萌蠢的,但实践证实在垃圾邮件识别的应用还使人诧异地好。Paul Graham先生本身简单作了一个朴素贝叶斯分类器,“1000封垃圾邮件可以被过滤掉995封,而且没有一个误判”。(Paul Graham《黑客与画家》)
那个…效果为啥好呢?
“有人对此提出了一个理论解释,而且创建了何时朴素贝叶斯的效果可以等价于非朴素贝叶斯的充要条件,这个解释的核心就是:有些独立假设在各个分类之间的分布都是均匀的因此对于似然的相对大小不产生影响;即使不是如此,也有很大的可能性各个独立假设所产生的消极影响或积极影响互相抵消,最终致使结果受到的影响不大。具体的数学公式请参考这篇 paper。”(刘未鹏《:平凡而又神奇的贝叶斯方法》)
恩,这个分类器中最简单直接看似萌蠢的小盆友『朴素贝叶斯』,实际上倒是简单、实用、且强大的。
9. 处理重复词语的三种方式¶
咱们以前的垃圾邮件向量(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”),其中每一个词都不重复。而这在现实中其实不多见。由于若是文本长度增长,或者分词方法改变,必然会有许多词重复出现,所以须要对这种状况进行进一步探讨。好比如下这段邮件:
“代开发票。增值税发票,正规发票。” 分词后为向量: (“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)
其中“发票”重复了三次。
9.1 多项式模型:¶
若是咱们考虑重复词语的状况,也就是说,重复的词语咱们视为其出现屡次,直接按条件独立假设的方式推导,则有
P((“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)|S)
=P(“代开””|S)P(“发票”|S)P(“增值税”|S)P(“发票”|S)P(“正规”|S)P(“发票”|S)
=P(“代开””|S)P3(“发票”|S)P(“增值税”|S)P(“正规”|S)
注意这一项:
P3(“发票”|S)
。
在统计计算P(“发票”|S)时,每一个被统计的垃圾邮件样本中重复的词语也统计屡次。
P(“发票”|S)=每封垃圾邮件中出现“发票”的次数的总和每封垃圾邮件中所有词出现次数(计算重复次数)的总和
你看这个屡次出现的结果,出如今几率的指数/次方上,所以这样的模型叫做多项式模型。
9.2 伯努利模型¶
另外一种更加简化的方法是将重复的词语都视为其只出现1次,
P((“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)|S)
=P(“发票”|S)P(“代开””|S)P(“增值税”|S)P(“正规”|S)
统计计算
P(“词语”|S)
时也是如此。
P(“发票”|S)=出现“发票”的垃圾邮件的封数每封垃圾邮件中所有词出现次数(出现了只计算一次)的总和
这样的模型叫做伯努利模型(又称为二项独立模型)。这种方式更加简化与方便。固然它丢失了词频的信息,所以效果可能会差一些。
9.3 混合模型¶
第三种方式是在计算句子几率时,不考虑重复词语出现的次数,可是在统计计算词语的几率P(“词语”|S)时,却考虑重复词语的出现次数,这样的模型能够叫做混合模型。
咱们经过下图展现三种模型的关系。

具体实践中采用那种模型,关键看具体的业务场景,一个简单经验是,对于垃圾邮件识别,混合模型更好些。
10. 去除停用词与选择关键词¶
咱们继续观察(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”) 这句话。其实,像“我”、“可”之类词其实很是中性,不管其是否出如今垃圾邮件中都没法帮助判断的有用信息。因此能够直接不考虑这些典型的词。这些无助于咱们分类的词语叫做“停用词”(Stop Words)。这样能够减小咱们训练模型、判断分类的时间。 因而以前的句子就变成了(“司”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”) 。
咱们进一步分析。以人类的经验,其实“正规发票”、“发票”这类的词若是出现的话,邮件做为垃圾邮件的几率很是大,能够做为咱们区分垃圾邮件的“关键词”。而像“司”、“办理”、“优惠”这类的词则有点鸡肋,可能有助于分类,但又不那么强烈。若是想省事作个简单的分类器的话,则能够直接采用“关键词”进行统计与判断,剩下的词就能够先无论了。因而以前的垃圾邮件句子就变成了(“正规发票”,“发票”) 。这样就更加减小了咱们训练模型、判断分类的时间,速度很是快。
“停用词”和“关键词”通常均可以提早靠人工经验指定。不一样的“停用词”和“关键词”训练出来的分类器的效果也会有些差别。
11. 浅谈平滑技术¶
咱们来讲个问题(中文NLP里问题超级多,哭瞎T_T),好比在计算如下独立条件假设的几率:
P((“我”,“司”,“可”,“办理”,“正规发票”)|S)
=P(“我”|S)P(“司”|S)P(“可”|S)P(“办理”|S)P(“正规发票”|S)
咱们扫描一下训练集,发现“正规发票”这个词从出现过!!!*,因而
P(“正规发票”|S)=0
…问题严重了,整个几率都变成0了!!!朴素贝叶斯方法面对一堆0,很凄惨地失效了…更残酷的是这种状况其实很常见,由于哪怕训练集再大,也可能有覆盖不到的词语。本质上仍是样本数量太少,不知足大数定律,计算出来的几率失真**。为了解决这样的问题,一种分析思路就是直接不考虑这样的词语,但这种方法就至关于默认给P(“正规发票”|S)赋值为1。其实效果不太好,大量的统计信息给浪费掉了。咱们进一步分析,既然能够默认赋值为1,为何不能默认赋值为一个很小的数?这就是平滑技术的基本思路,依旧保持着一向的做风,朴实/土
可是直接而有效
。
对于伯努利模型,P(“正规发票”|S)的一种平滑算法是:
P(“正规发票”|S)=出现“正规发票”的垃圾邮件的封数+1每封垃圾邮件中所有词出现次数(出现了只计算一次)的总和+2
对于多项式模型,P(“正规发票”| S)的一种平滑算法是:
P(“发票”|S)=每封垃圾邮件中出现“发票”的次数的总和+1每封垃圾邮件中所有词出现次数(计算重复次数)的总和+被统计的词表的词语数量
提及来,平滑技术的种类其实很是多,有兴趣的话回头咱们专门拉个专题讲讲好了。这里只提一点,就是全部的平滑技术都是给未出如今训练集中的词语一个估计的几率,而相应地调低其余已经出现的词语的几率。
平滑技术是由于数据集过小而产生的现实需求。若是数据集足够大,平滑技术对结果的影响将会变小。
12. 内容小结¶
咱们找了个最简单常见的例子:垃圾邮件识别,说明了一下朴素贝叶斯进行文本分类的思路过程。基本思路是先区分好训练集与测试集,对文本集合进行分词、去除标点符号等特征预处理的操做,而后使用条件独立假设,将原几率转换成词几率乘积,再进行后续的处理。
贝叶斯公式 + 条件独立假设 = 朴素贝叶斯方法
基于对重复词语在训练阶段与判断(测试)阶段的三种不一样处理方式,咱们相应的有伯努利模型、多项式模型和混合模型。在训练阶段,若是样本集合过小致使某些词语并未出现,咱们能够采用平滑技术对其几率给一个估计值。并且并非全部的词语都须要统计,咱们能够按相应的“停用词”和“关键词”对模型进行进一步简化,提升训练和判断速度。
13. 为何不直接匹配关键词来识别垃圾邮件?¶
有同窗可能会问:“何须费这么大劲算那么多词的几率?直接看邮件中有没有‘代开发票’、‘转售发票’之类的关键词不就得了?若是关键词比较多就认为是垃圾邮件呗。”
其实关键词匹配的方法若是有效的话真没必要用朴素贝叶斯。毕竟这种方法简单嘛,就是一个字符串匹配。从历史来看,以前没有贝叶斯方法的时候主要也是用关键词匹配。可是这种方法准确率过低。咱们在工做项目中也尝试过用关键词匹配的方法去进行文本分类,发现大量误报。感受就像扔到垃圾箱的邮件99%都是正常的!这样的效果不忍直视。而加一个朴素贝叶斯方法就可能把误报率拉低近一个数量级,体验好得不要不要的。
另外一个缘由是词语会随着时间不断变化。发垃圾邮件的人也不傻,当他们发现本身的邮件被大量屏蔽以后,也会考虑采用新的方式,如变换文字、词语、句式、颜色等方式来绕过反垃圾邮件系统。好比对于垃圾邮件“我司可办理正规发票,17%增值税发票点数优惠”,他们采用火星文:“涐司岢办理㊣規髮票,17%增値稅髮票嚸數優蕙”,那么字符串匹配的方法又要从新找出这些火星文,一个一个找出关键词,从新写一些匹配规则。更可怕的是,这些规则可能相互之间的耦合关系异常复杂,要把它们梳理清楚又是大一个数量级的工做量。等这些规则失效了又要手动更新新的规则……无穷无尽猫鼠游戏最终会把猫给累死。
而朴素贝叶斯方法却显示出无比的优点。由于它是基于统计方法的,只要训练样本中有更新的垃圾邮件的新词语,哪怕它们是火星文,都能自动地把哪些更敏感的词语(如“髮”、“㊣”等)给凸显出来,并根据统计意义上的敏感性给他们分配适当的权重 ,这样就不须要什么人工了,很是省事。你只须要时不时地拿一些最新的样本扔到训练集中,从新训练一次便可。
小补充一下,对于火星文、同音字等替代语言,通常的分词技术可能会分得不许,最终可能只把一个一个字给分出来,成为“分字”。效果可能不会太好。也能够用过n-gram之类的语言模型,拿到最多见短语。固然,对于英文等天生自带空格来间隔单词的语言,分词则不是什么问题,使用朴素贝叶斯方法将会更加顺畅。
14.实际工程的tricks¶
应用朴素贝叶斯方法的过程当中,一些tricks能显著帮助工程解决问题。咱们毕竟经验有限,没法将它们全都罗列出来,只能就所知的一点点经验与你们分享,欢迎批评指正。
14.1 trick1:取对数¶
咱们提到用来识别垃圾邮件的方法是比较如下两个几率的大小(字母S表示“垃圾邮件”,字母H表示“正常邮件”):
C=P(“我”|S)P(“司”|S)P(“可”|S)P(“办理”|S)P(“正规发票”|S)
×P(“保真”|S)P(“增值税”|S)P(“发票”|S)P(“点数”|S)P(“优惠”|S)P(“垃圾邮件”)
C¯¯¯¯=P(“我”|H)P(“司”|H)P(“可”|H)P(“办理”|H)P(“正规发票”|H)
×P(“保真”|H)P(“增值税”|H)P(“发票”|H)P(“点数”|H)P(“优惠”|H)P(“正常邮件”)
但这里进行了不少乘法运算,计算的时间开销比较大。尤为是对于篇幅比较长的邮件,几万个数相乘起来仍是很是花时间的。若是能把这些乘法变成加法则方便得多。恰好数学中的对数函数log就能够实现这样的功能。两边同时取对数(本文统一取底数为2),则上面的公式变为:
logC=logP(“我”|S)+logP(“司”|S)+logP(“可”|S)+logP(“办理”|S)+logP(“正规发票”|S)
+logP(“保真”|S)+logP(“增值税”|S)+logP(“发票”|S)+logP(“点数”|S)+logP(“优惠”|S)+logP(“垃圾邮件”)
logC¯¯¯¯=logP(“我”|H)+logP(“司”|H)+logP(“可”|H)+logP(“办理”|H)+logP(“正规发票”|H)
+logP(“保真”|H)+logP(“增值税”|H)+logP(“发票”|H)+logP(“点数”|H)+logP(“优惠”|H)+logP(“正常邮件”)
有同窗可能要叫了:“作对数运算岂不会也很花时间?”的确如此,可是能够在训练阶段直接计算
logP
,而后把他们存在一张大的hash表里。在判断的时候直接提取hash表中已经计算好的对数几率,而后相加便可。这样使得判断所须要的计算时间被转移到了训练阶段,实时运行的时候速度就比以前快得多,这可不止几个数量级的提高。
14.2 trick2:转换为权重¶
对于二分类,咱们还能够继续提升判断的速度。既然要比较
logC
和
logC¯¯¯¯
的大小,那就能够直接将上下两式相减,并继续化简:
logCC¯¯¯¯=logP(“我”|S)P(“我”|H)+logP(“司”|S)P(“司”|H)+logP(“可”|S)P(“可”|H)+logP(“办理”|S)P(“办理”|H)+logP(“正规发票”|S)P(“正规发票”|H)
+logP(“保真”|S)P(“保真”|H)+logP(“增值税”|S)P(“增值税”|H)+logP(“发票”|S)P(“发票”|H)+logP(“点数”|S)P(“点数”|H)+logP(“优惠”|S)P(“优惠”|H)+logP(“正常邮件”|S)P(“正常邮件”)
logCC¯¯¯¯
若是大于0则属于垃圾邮件。咱们能够把其中每一项做为其对应词语的权重,好比
logP(“发票”|S)P(“发票”|H)
就能够做为词语“发票”的权重,权重越大就越说明“发票”更多是与“垃圾邮件”相关的特征。这样能够根据权重的大小来评估和筛选显著的特征,好比关键词。而这些权重值能够直接提早计算好而存在hash表中 。判断的时候直接将权重求和便可。
关键词hash表的样子以下,左列是权重,右列是其对应的词语,权重越高的说明越“关键”:

14.3 trick3:选取topk的关键词¶
前文说过能够经过提早选取关键词来提升判断的速度。有一种方法能够省略提早选取关键词的步骤,就是直接选取一段文本中权重最高的K个词语,将其权重进行加和。好比Paul Graham 在《黑客与画家》中是选取邮件中权重最高的15个词语计算的。
经过权重hash表可知,若是是全部词语的权重,则权重有正有负。若是只选择权重最高的K个词语,则它们的权重基本都是正的。因此就不能像以前那样判断
logCC¯¯¯¯
是否大于0来区分邮件了。而这须要依靠经验选定一个正数的阈值(门槛值) ,依据
logCC¯¯¯¯
与该门槛值的大小来识别垃圾邮件。
以下图所示,蓝色点表明垃圾邮件,绿色点表明正常邮件,横坐标为计算出来的
logCC¯¯¯¯
值,中间的红线表明阈值。

14.4 trick4:分割样本¶
选取topk个词语的方法对于篇幅变更不大的邮件样本比较有效。可是对篇幅过大或者太小的邮件则会有判断偏差。
好比这个垃圾邮件的例子:(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”)。分词出了10个词语,其中有“正规发票”、“发票”2个关键词。关键词的密度仍是蛮大的,应该算是敏感邮件。但由于采用最高15个词语的权重求和,而且相应的阈值是基于15个词的状况有效,可能算出来的结果还小于以前的阈值,这就形成漏判了。
相似的,若是一封税务主题的邮件有1000个词语,其中只有“正规发票”、“发票”、“避税方法”3个权重比较大的词语,它们只是在正文表述中顺带提到的内容。关键词的密度被较长的篇幅稀释了,应该算是正常邮件。可是却被阈值判断成敏感邮件,形成误判了。
这两种状况都说明topk关键词的方法须要考虑篇幅的影响。这里有许多种处理方式,它们的基本思想都是选取词语的个数及对应的阈值要与篇幅的大小成正比,本文只介绍其中一种方方法:
对于长篇幅邮件,按必定的大小,好比每500字,将其分割成小的文本段落,再对小文本段落采用topk关键词的方法。只要其中有一个小文本段落超过阈值就判断整封邮件是垃圾邮件。
对于超短篇幅邮件,好比50字,能够按篇幅与标准比较篇幅的比例来选取topk,以肯定应该匹配关键词语的个数。好比选取
50500×15≈2
个词语进行匹配,相应的阈值能够是以前阈值的
215
。以此来判断则更合理。
14.5 trick5:位置权重¶
到目前为止,咱们对词语权重求和的过程都没有考虑邮件篇章结构的因素。好比“正规发票”若是出如今标题中应该比它出如今正文中对判断整个邮件的影响更大;而出如今段首句中又比其出如今段落正文中对判断整个邮件的影响更大。因此能够根据词语出现的位置,对其权重再乘以一个放大系数,以扩大其对整封邮件的影响,提升识别准确度。
好比一封邮件其标题是“正规发票”(假设标题的放大系数为2),段首句是“发票”,“点数”,“优惠”(假设段首的放大系数为1.5),剩下的句子是(“我”,“司”,“可”,“办理”,“保真”)。则计算
logCC¯¯¯¯
时的公式就能够调整为:
logCC¯¯¯¯=2×logP(“正规发票”|S)P(“正规发票”|H)+1.5×logP(“发票”|S)P(“发票”|H)+1.5×logP(“点数”|S)P(“点数”|H)+1.5×logP(“优惠”|S)P(“优惠”|H)
+logP(“我”|S)P(“我”|H)+logP(“司”|S)P(“司”|H)+logP(“可”|S)P(“可”|H)+logP(“办理”|S)P(“办理”|H)+logP(“保真”|S)P(“保真”|H)+logP(“正常邮件”|S)P(“正常邮件”)