本文介绍朴素贝叶斯算法如何对文本进行分类。好比,每一个用户的购物评论就是一篇文本,识别出这篇文本属于正向评论仍是负面评论 就是分类的过程,而类别就是:{正面评论,负面评论}。正面评论为Positive,用标识符'+'表示;负面评论为Negative,用标识符'-'表示。html
一,分类目标web
寻找文本的某些特征,而后根据这些特征将文本归为某个类。算法
The goal of classification is to take a single observation, extract some useful
features, and thereby classify the observation into one of a set of discrete classes.
使用监督式机器学习方法对文本进行分类:首先假设已经有分好类的N篇文档:(d1,c1)、(d2,c2)、(d3,c3)……(dn,cn)机器学习
di表示第i篇文档,ci表示第i个类别。目标是:寻找一个分类器,这个分类器可以:当丢给它一篇新文档d,它就输出d (最有可能)属于哪一个类别cide
二,分类器的介绍函数
①Generative classifierpost
朴素贝叶斯分类器属于Generative classifier。 学习
②Discriminative classifier测试
逻辑回归属于Discriminative classifier。ui
Generative classifiers like naive Bayes build a model of each class. Given an observation,they return the class most likely to have generated the observation.
Discriminative classifiers like logistic regression instead learn what features from the input are most useful to discriminate between the different possible classes.
三,词袋模型(Bag Of Words)
前面提到,文本分类须要寻找文本的特征。而词袋模型就是表示文本特征的一种方式。给定一篇文档,它会有不少特征,好比文档中每一个单词出现的次数、某些单词出现的位置、单词的长度、单词出现的频率……而词袋模型只考虑一篇文档中单词出现的频率(次数),用每一个单词出现的频率做为文档的特征(或者说用单词出现的频率来表明该文档)。词袋模型的示意图以下:
We represent a text document as if it were a bag-of-words,
that is, an unordered set of words with their position ignored, keeping only their frequency in the document.
四,朴素贝叶斯分类器
朴素贝叶斯分类器是一个几率分类器。假设现有的类别C={c1,c2,……cm}。给定一篇文档d,文档d最有可能属于哪一个类呢?这个问题用数学公式表示以下:
(公式一)
c^ 就是:在全部的类别C={c1,c2,……cm} 中,使得:条件几率P(c|d)取最大值的类别。使用贝叶斯公式,将(公式一)转换成以下形式:
(公式二)
对类别C中的每一个类型,计算 [p(d|c)*p(c)]/p(d) 的值,而后选取最大值对应的那个类型ci ,该ci就是最优解c^,所以,能够忽略掉分母 p(d),(公式二)变成以下形式:
(公式三)
这个公式由两部分组成,前面那部分P(d|c) 称为似然函数,后面那部分P(c) 称为先验几率。
前面提到使用词袋模型来表示 文档d,文档d的每一个特征表示为:d={f1,f2,f3……fn},那么这里的特征fi 其实就是单词wi 出现的频率(次数),公式三转化成以下形式:
(公式四)
对文档d 作个假设:假设各个特征之间是相互独立的。那么p(f1,f2……fn|c)=p(f1|c)*p(f2|c)*……*p(fn|c),公式四转化成以下形式:
(公式五)
因为每一个几率值很小(好比0.0001)若干个很小的几率值直接相乘,获得的结果会愈来愈小。为了不计算过程出现下溢(underflower),引入对数函数Log,在 log space中进行计算。而后使用词袋模型的每一个单词wi 出现频率做为特征,获得以下公式
(公式六)
五,训练朴素贝叶斯分类器
训练朴素贝叶斯的过程其实就是计算先验几率和似然函数的过程。
①先验几率P(c)的计算
P(c)的意思是:在全部的文档中,类别为c的文档出现的几率有多大?假设训练数据中一共有Ndoc篇文档,只要数一下类别c的文档有多少个就能计算p(c)了,类别c的文档共有Nc篇,先验几率的计算公式以下:
(公式七)
【先验几率 其实就是 准备干一件事情时,目前已经掌握了哪些信息了】关于先验信息理解,可参考:这篇文章。
For the document prior P(c) we ask what percentage of the documents in our training set are in each class c.
Let Nc be the number of documents in our training data with
class c and Ndoc be the total number of documents
②似然函数P(wi|c)的计算
因为是用词袋模型表示一篇文档d,对于文档d中的每一个单词wi,找到训练数据集中全部类别为c的文档,数一数 单词wi在这些文档(类别为c)中出现的次数:count(wi,c)
而后,再数一数训练数据集中类别为c的文档一共有多少个单词。计算 两者之间的比值,就是似然函数的值。似然函数计算公式以下:
(公式八)
其中V,就是词库。(有些单词在词库中,可是不属于类别C,那么 count(w,c)=0)
Here the vocabulary V consists of the union of all the word types in all classes, not just the words in one class c.
从上面计算似然函数的过程来看,其实至关于一个发掘(统计)潜藏规律的过程。
六,unknow words的情形
假设只考虑文本二分类:将文档分红 positve类别,或者negative类别,C={positive, negative}
在训练数据集中,类别为positive的全部文档 都没有 包含 单词wi = fantastic(fantastic可能出如今类别为negative的文档中)
那么 count(wi=fantastic,ci=positive)=0 。那么:
而注意到前面公式五中的累乘,整篇文档的似然函数值为0,也就是说:若是文档d中有个单词fantastic在类别为c的训练数据集文档中从未出现过,那文档d被分类到类别c的几率为0,尽管文档d中还有一些其余单词(特征),而这些单词所表明的特征认为文档d应该被分类 到 类别c中
But since naive Bayes naively multiplies all the feature likelihoods together, zero
probabilities in the likelihood term for any class will cause the probability of the
class to be zero, no matter the other evidence!
解决方案就是 add-one smoothing。(不介绍了),其实就是将“出现次数加1”。似然函数公式变成以下形式:
(公式九)
其中|V|是词库中全部单词的个数。
七,朴素贝叶斯分类示例
假设训练数据集有五篇文档,其中Negative类别的文档有三篇,用符号 '-' 标识;Positive类别的文档有二篇,用符号 '+' 标识,它们的内容以下:
- just plain boring
- entirely predictable and lacks energy
- no surprises and very few laughs
+ very powerful
+ the most fun film of the summer
测试数据集T 有一篇文档dt,内容以下:
predictable with no fun
朴素贝叶斯分类器会把“predictable with no fun”归为哪一个类呢?根据第五节“训练朴素贝叶斯分类器”,须要计算先验几率和似然函数。
因为训练数据集中一共有5篇文档,其中类别 '+' 的文档有2篇,类别为 '-' 的文档有3篇,所以先验几率:P(c)=P('-')=Nc/Ndoc=3/5=0.6
类别为'+' 的文档有2篇,故 P(c)=P('+')=Nc/Ndoc=2/5=0.4
对测试数据集文档dt中的每一个单词,似然函数采用“add-one smoothing”处理,计算相应的似然几率:
首先单词 predictable 在训练数据集中 类别为'-'的文档中只出现了1次,类别为'-'的文档一共有14个单词,训练数据集中两种类型的文档加起来一共有23个单词,可是有三个单词(and、
very、the)重复出现了两次,故词库V的大小为 20。所以单词predictable对应的似然几率以下:
p(predictable|'-')=(1+1)/(14+20)=2/34
同理:p(predictable|'+')=(0+1)/(9+20)=1/29 (predictable没有在类别为'+'的训练数据集中出现过)
相似地:p(no|'-')=(1+1)/(14+20) p(no|'+')=(0+1)/(9+20)
p(fun|'-')=(0+1)/(14+20) p(fun|'+')=(1+1)/(9+20)
所以,测试集中的文档d归类为 '-' 的几率为:0.6 * (2*2*1)/343 = 6.1*10-5
测试集中的文档d归类为 '+' 的几率为:0.4*(1*1*2)/293 =3.2*10-5
比较上面两个几率的大小,就能够知道将“predictable with no fun”归为 '-' 类别。
八,参考资料
CS 124: From Languages to Information