最近学习了自然语言处理的朴素贝叶斯方法,下面是我对朴素贝叶斯方法的理解。下面是本文的结构:
1、贝叶斯公式的介绍
2、通过垃圾邮件的识别理解朴素贝叶斯方法的应用
3、使用朴素贝叶斯时其他的一些处理方法
4、朴素贝叶斯在实际工程中的tricks
5、朴素贝叶斯方法在实际生活中的应用
1、贝叶斯公式的介绍
贝叶斯公式就一行:
其中P(Y)叫做先验概率,P(Y|X)叫做后验概率,P(X,Y)叫做联合概率。
在机器学习的视角下,我们通常把X理解成“具有某特征”,把Y理解为“类别标签”,而在简单的二分类问题(判断是和否)下,Y可以理解为“属于某类”的标签。于是,贝叶斯公式可以写成:
而我们对于二分类问题,只要判断P大于1/2就可以了。根据上面公式,问题可以转化为“具有某特征条件下属于某类”的概率,而“具有某特征条件下属于某类”的概率可以直接统计的,只要我们能够找到相关特征的样本,进行训练,在样本数量足够大的情况下,就可以比较准确的计算出P的概率。
2、通过垃圾邮件的识别理解朴素贝叶斯方法的应用
下面通过对垃圾邮件的识别的例子,来理解贝叶斯方法的应用。
假设我们现在拥有正常邮件和垃圾邮件各10000封作为训练集,用来判断下面邮件是否为垃圾邮件:
“我司可办理正规发票(保真)17%增值税发票点数优惠!”
那么问题可以转化为:
2.1分词
针对上面问题发现:训练集是有限的,而句子的可能性是无限的,我们不可能直接让训练集覆盖所有的句子。而根据以往的经验,当句子包含的大部分的词语是一样的情况下,两个句子意思相同的可能性是很高的。于是我们把句子可以替换成:
“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”
于是需要使用到NLP中最重要的一项技术--分词,通过分词技术,可以把句子中符号,数字等无关的成分去掉。
分词后,上面的贝叶斯公式变成:
2.2条件独立假设
我们发现,上面公式中的
依然不好求,于是我们假设经过分词处理之后每个词出现的概率都是相互独立的,为了表达方便,把S=“垃圾邮件”,H=“正常邮件”,可以得出下面的近似公式:
发现这样处理后,其中的每一项特别好求,比如:
只要样本中的数据足够大,这个概率就越准确。
以上加上条件独立假设之后的贝叶斯方法称为朴素贝叶斯方法。我们可以发现,使用朴素贝叶斯方法处理时并没有考虑每个词语的顺序,就像把这个句子分词后将得到的所有词语放到一个袋子里,也称为“词袋子模型”。
3、使用朴素贝叶斯时其他的一些处理方法
3.1去除重复词语
观察比较长的文本可以发现,很多情况下,经过分词处理之后,存在大量重复的词语,针对这种情况,常见处理方式有三种。
3.1.1多项式模型
比如对于上面的公式发现,“发票”这个词出现多次,处理如下:
以上方模型称为多项式模型。
3.1.2伯努利模型
伯努利模型处理如下:
该模型也称为“二项独立模型”
3.1.3混合模型
第三种方式是在计算句子概率时,不考虑重复词语出现的次数,但是在统计计算词语的概率P(“词语”|S)时,却考虑重复词语的出现次数,这样的模型可以叫作混合模型。
3.2去除停用词和选择关键词
我们继续观察(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”) 这句话。其实,像“我”、“可”之类词其实非常中性,无论其是否出现在垃圾邮件中都无法帮助判断的有用信息。所以可以直接不考虑这些典型的词。这些无助于我们分类的词语叫作“停用词”(Stop Words)。这样可以减少我们训练模型、判断分类的时间。 于是之前的句子就变成了(“司”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”) 。
我们进一步分析。以人类的经验,其实“正规发票”、“发票”这类的词如果出现的话,邮件作为垃圾邮件的概率非常大,可以作为我们区分垃圾邮件的“关键词”。而像“司”、“办理”、“优惠”这类的词则有点鸡肋,可能有助于分类,但又不那么强烈。如果想省事做个简单的分类器的话,则可以直接采用“关键词”进行统计与判断,剩下的词就可以先不管了。于是之前的垃圾邮件句子就变成了(“正规发票”,“发票”) 。这样就更加减少了我们训练模型、判断分类的时间,速度非常快。
“停用词”和“关键词”一般都可以提前靠人工经验指定。不同的“停用词”和“关键词”训练出来的分类器的效果也会有些差异。
3.3平滑技术
对于上面公式,当训练集不够大时,很可能出现其中一项为0,导致整个计算结果为0,和实际不符。针对这种情况,有多种平滑算法,比如:
对于伯努利模型,P(“正规发票”|S)的一种平滑算法是:
4、朴素贝叶斯在实际工程中的tricks
4.1取对数
对于上面公式,我们发现里面存在大量的乘法运算,计算时间的开销比较大,处理的方法是:对两边同时取对数,如下:
对于对数的计算,是通过训练,将对数的计算结果直接存在一张哈希表里,在实际的计算时,直接从哈希表中取计算结果相加即可。
4.2转换权重
对于二分类,比较两者的大小,可以直接将两者相减,得到如下:
我们把其中每一项作为对应该词语的权重,比如把
作为“发票”的权重,权重越大说明越有可能是于垃圾邮件相关的词语,这些权重词可以直接存在哈希表中,使用是直接从哈希表中取即可。
4.3分割样本
对于比较长的文本,如果里面只插入语句垃圾句子,如果还是按照常规的计算,计算结果就会收到文章长度的影响。处理的基本思想是从整个文章中选取一定数量的词语和对应的阈值(和文章的长度成正相关)进行判断。
4.4位置权重
位置权重是将词语所在文章的位置考虑进去,乘以相应的权重。比如“正规发票”这个词语在邮件的标题,那么在该词前乘以一个更大的数值。
4.5蜜罐
随着时间的推移,许多词语的权重会相应的发生变化,这时候需要收集新的垃圾邮件进行分析,重新调整权重。
而搜集最新垃圾邮件有一个技巧,就是随便注册一些邮箱,然后将它们公布在各大论坛上。接下来就坐等一个月,到时候收到的邮件就绝大部分都是垃圾邮件了(好奸诈)。再找一些正常的邮件,基本就能够训练了。这些用于自动搜集垃圾邮件的邮箱叫做“蜜罐”。
5、朴素贝叶斯方法在实际生活中的应用
5.1褒贬分析
一个比较常见的应用场景是情感褒贬分析。比如你要统计微博上人们对一个新上映电影的褒贬程度评价:好片还是烂片。但是一条一条地看微博是根本看不过来,只能用自动化的方法。我们可以有一个很粗略的思路:
首先是用爬虫将微博上提到这个电影名字的微博全都抓取下来,比如有10万条。
然后用训练好的朴素贝叶斯分类器分别判断这些微博对电影是好评还是差评。
最后统计出这些好评的影评占所有样本中的比例,就能形成微博网友对这个电影综合评价的大致估计。
接下来的核心问题就是训练出一个靠谱的分类器。首先需要有打好标签的文本。这个好找,豆瓣影评上就有大量网友对之前电影的评价,并且对电影进行1星到5星的评价。我们可以认为3星以上的评论都是好评,3星以下的评论都是差评。这样就分别得到了好评差评两类的语料样本。剩下就可以用朴素贝叶斯方法进行训练了。基本思路如下:
训练与测试样本:豆瓣影评的网友评论,用爬虫抓取下100万条。
标签:3星以上的是好评,3星以下的是差评。
特征:豆瓣评论分词后的词语。一个简单的方法是只选择其中的形容词,网上有大量的情绪词库可以为我们所用。
然后再用常规的朴素贝叶斯方法进行训练。
5.2拼写纠错
拼写纠错本质上也是一个分类问题。但按照错误类型不同,又分为两种情况:
非词错误(Non-word Errors):指那些拼写错误后的词本身就不合法,如将“wifi”写成“wify”;
真词错误(Real-word Errors):指那些拼写错误后的词仍然是合法的情况,如将“wifi”写成“wife”。
对于非词错误,就可以直接采用贝叶斯方法,其基本思路如下:
标签:通过计算错误词语的最小编辑距离(之前咱们提到过的),获取最相似的候选词,每个候选词作为一个分类。
特征:拼写错误的词本身。因为它就一个特征,所以没有什么条件独立性假设、朴素贝叶斯啥的。它就是纯而又纯的贝叶斯方法。
判别公式:
训练样本1:该场景下的正常用词语料库,用于计算P(候选词i)。
训练样本2:该场景下错误词与正确词对应关系的语料库,用于计算P(错误词|候选词i)