简介

贝叶斯分类器是基于贝叶斯理论的分类器,在NLP(自然语言处理)领域有着广泛的应用,如垃圾邮件检测,个人邮件排序,文本分类,色情内容检测等等。由于贝叶斯分类器是基于贝叶斯理论的,因此使用该分类器时有一个基本假设,即:数据的各特征之间是条件独立的。

假设数据集 D={d1,d2,...,dn}D = \{d_1, d_2, ... , d_n\}D={d1​,d2​,...,dn​} 的特征集合为X={x1,x2,...,xm}X = \{x_1, x_2, ... , x_m\}X={x1​,x2​,...,xm​}, 类别集合为C={c1,c2,ck}C = \{c_1, c_2, c_k\}C={c1​,c2​,ck​}. 即对任意一条数据did_idi​,均有大小为mmm的一维特征向量,数据did_idi​的类别为cj(≤j≤k)c_j (\le j \le k)cj​(≤j≤k). 那么P(xi∣C)P(x_i|C)P(xi​∣C)相互之间是条件独立的,即P(x1,x2,...,xk∣C)=∏i=1kP(xi∣C)P(x_1, x_2, ... , x_k|C) = \prod_{i=1}^kP(x_i|C)P(x1​,x2​,...,xk​∣C)=∏i=1k​P(xi​∣C).

#贝叶斯定理(Naïve Bayes Theorem)
贝叶斯定理指:对于事件A和B,它们之间的概率关系满足:(1)P(A∣B)=P(B∣A)P(A)P(B)P(A|B) = \frac{P(B|A)P(A)}{P(B)}\tag{1}P(A∣B)=P(B)P(B∣A)P(A)​(1)
贝叶斯定理说明,通常事件A在事件B(发生)的条件下的概率,与时间B在事件A的条件下的概率是不一样的,但两者之间有确定的关系,这个关系可以用贝叶斯定理来描述。

通常在数据分类的应用中,我们会替换上述公式的一些符号以方便描述。我们假设XXX是数据的特征,CCC是数据的类别,则上式可以写成:(2)P(C∣X)=P(X∣C)P(C)P(X)P(C|X) = \frac{P(X|C)P(C)}{P(X)}\tag{2}P(C∣X)=P(X)P(X∣C)P(C)​(2)
其中P(C∣X)P(C|X)P(C∣X)的含义是:对于给定的一个文本,已知它的特征是XXX,那么这个文本属于类别CCC的概率是多少。这个值就是我们最终需要的值。

P(C∣X)P(C|X)P(C∣X)是贝叶斯分类器要计算出的结果,我们就是通过这个概率来确定这个文本属于哪个类别。这个概率称为后验概率(posterior probability),即我们只有在知道文本的特征XXX之后,才会知道这个文本属于哪个类别。

P(C)P(C)P(C)是先验概率(prior probability),表示在观察到文本的特征XXX之前,我们就已经知道了类别CCC概率,即这个概率跟XXX完全无关。P(X)P(X)P(X)同理。

P(X∣C)P(X|C)P(X∣C)称为相似度(likelihood)。这个概率表示的意思是我们已经确定了一个类别CCC,那么在CCC中的文本出现特征值为XXX的概率是多少。

在实际的应用中,P(X∣C)P(X|C)P(X∣C),P(C)P(C)P(C)和P(X)P(X)P(X)都可以直接或间接获得,或者通过估计得到。

Multinomial Naïve Bayes

贝叶斯分类器有三种,分别是Multinomial Naive Bayes, Binarized Multinomial Naive Bayes以及Bernoulli Naive Bayes. 本文讲述第一种贝叶斯分类器,该分类器主要用于文本的主题分类。Multinomial Naive Bayes中会考虑单词出现的次数,即词频(term frequency);而第二种——Binarized Multinomial Naive Bayes——不考虑词频,只考虑这个单词有没有出现,主要用于文本情绪分析。例如,一段文本提到bad这个单词,使用第二种分类器不会考虑bad出现了几次,它只关注bad这个有没有出现

Multinomial Naïve Bayes分类器算法

假设有文本数据集D={d1,d2,...,dn}D = \{d_1, d_2, ... , d_n\}D={d1​,d2​,...,dn​},其中di(1≤i≤n)d_i (1 \le i \le n)di​(1≤i≤n)表示第iii个文本,因此这个文本数据集一共有nnn个文本。

该文本数据集DDD有一个特征集X={x1,x2,...,xm}X = \{x_1, x_2, ... , x_m\}X={x1​,x2​,...,xm​},表示对于任意一个文本did_idi​,都有一个特征集XiX_iXi​,文本did_idi​的特征大小为mmm,即did_idi​有mmm个特征。这个特征可以是单词(这是最简单的情况),也可以是N-gram或自己设计的特征。本文使用单词作为特征。若使用单词,那么特征集XXX就是文本数据集DDD中的所有单词的集合,xjx_jxj​就是第jjj个单词,mmm就是所有单词的数量,可记为m=∣X∣m=|X|m=∣X∣。

例如有两个文本d1d_1d1​和d2d_2d2​
d1d_1d1​:This article is about Bayes.
d2d_2d2​:Thomas Bayes provided Bayes equation.
在这个例子中,D={d1,d2}D=\{d_1, d_2\}D={d1​,d2​},X={this,article,is,about,bayes,thomas,provided,equation}X=\{this, article, is, about, bayes, thomas, provided, equation\}X={this,article,is,about,bayes,thomas,provided,equation},∣X∣=8|X| = 8∣X∣=8

根据公式(2),要得到一段文本属于某一类的概率,需要先计算P(C)P(C)P(C), P(X)P(X)P(X)和P(X∣C)P(X|C)P(X∣C)。

应用贝叶斯分类器之前,我们通常会有training data,以上三个概率就从training data中获得。

如何计算P(C)P(C)P(C)

设有类别集合C={c1,c2,...,ck}C=\{c_1, c_2, ... , c_k\}C={c1​,c2​,...,ck​},P(C)P(C)P(C)表示取得某一个类别的概率,比如不同文本可能属于不同的话题类别,如sport, politics, science等。通常我们假设文本的话题类别归属随机,假设有kkk个类别,那么取到任一个类别的概率(用频率来近似概率)就是1k\frac{1}{k}k1​. 因此P(C)P(C)P(C)的值是固定的,P(C)=1kP(C) = \frac{1}{k}P(C)=k1​,kkk是类别的数量,这个是事先定义好的。

这是最简单的情况,在一些应用上,P(C)P(C)P(C)的值是随不同类别的变化而变化的,或者cic_ici​服从某种分布,视具体情况而定。有时可以在training data中用各类的出现的频率作为P(C)P(C)P(C)的估计值。

如何计算P(X)P(X)P(X)

在本文例子中,X={x1,x2,...,xm}X = \{x_1, x_2, ... , x_m\}X={x1​,x2​,...,xm​}是所有文本的单词集合,mmm表示单词数量。通常情况下,P(X)P(X)P(X)的值是固定,即P(X)=1mP(X)=\frac{1}{m}P(X)=m1​(用频率来近似概率)。该值的确定是基于词袋模型(bag-of-words),即一篇文章是由若干单词组成,每个单词均是从词库中随机等概率抽取而来。像是将所有单词放到一个袋子里(bag),写文章就从这个袋子里随机抽取单词。

但是该模型的缺陷显而易见,通常写作用的单词并不是等概率抽取的。然而实际应用中这样简化问题并取得令人满意的结果。

如何计算P(X∣C)P(X|C)P(X∣C)

P(X∣C)P(X|C)P(X∣C)表示对于指定的类别CCC,在这个类别中的文本出现的特征值等于XXX的概率是多少。注意到XXX和CCC都是集合,要确定一段文本属于哪一类,需要计算所有类别的P(X∣C)P(X|C)P(X∣C),即对第iii类,计算P(X∣ci)P(X|c_i)P(X∣ci​)。如此最后才能比较文本属于哪个类别的概率最大。

而XXX是单词的集合,一段文本是由若干单词组成,整个单词串连在一起才能作为这段文本的特征值向量。因此对第iii类,我们需要对每个文本计算P(x1,x2,...,xm∣ci)P(x_1, x_2, ... , x_m|c_i)P(x1​,x2​,...,xm​∣ci​)。注意到前面提到贝叶斯分类器的假设是各特征变量之间条件独立,因此有(3)P(x1,x2,...,xm∣ci)=∏j=1mP(xj∣ci)P(x_1, x_2, ... , x_m|c_i) = \prod_{j=1}^mP(x_j|c_i) \tag{3}P(x1​,x2​,...,xm​∣ci​)=j=1∏m​P(xj​∣ci​)(3)

计算类别归属(P(C∣X)P(C|X)P(C∣X))

如此,判断文本ddd属于第iii类的概率可以写成:(4)P(C∣X)=P(ci)∏j=1mP(xj∣ci)P(X)P(C|X) = \frac{P(c_i) \prod_{j=1}^mP(x_j|c_i)}{P(X)} \tag{4}P(C∣X)=P(X)P(ci​)∏j=1m​P(xj​∣ci​)​(4)
因为P(X)P(X)P(X)是常数项(简单情况下P(ci)P(c_i)P(ci​)也可以是常数项),因此上式可以简化为:(5)P(C∣X)∝P(ci)∏j=1mP(xj∣ci)P(C|X) \propto P(c_i) \prod_{j=1}^mP(x_j|c_i) \tag{5}P(C∣X)∝P(ci​)j=1∏m​P(xj​∣ci​)(5)
因为上式去掉了分母,得到的结果已不是概率,因此将等号替换为∝\propto∝(approximately proportional to)。上式含有积分项,不方便计算且在计算机中可能有溢出的危险,因此对上式右项取对数,简化为:(6)P(C∣X)∝log⁡P(ci)+∑j=1mlog⁡P(xj∣ci)P(C|X) \propto \log P(c_i) + \sum_{j=1}^m \log P(x_j|c_i) \tag{6}P(C∣X)∝logP(ci​)+j=1∑m​logP(xj​∣ci​)(6)
此时公式已化至最简,但加号右边的单项P(x∣c)P(x|c)P(x∣c)如何计算?

P(x∣c)P(x|c)P(x∣c)的计算以及平滑因子的引入

可以将单词xjx_jxj​在cic_ici​类中出现的次数转化为频率,用该频率来估计P(xj∣ci)P(x_j|c_i)P(xj​∣ci​)。下面是个例子。
假设有以下文本:

Text Class Doc
Chinese Beijing Chinese ZH d1d_1d1​ Training
Chinese Chinese Shanghai ZH d2d_2d2​
Chinese Macao ZH d3d_3d3​
Tokyo Japan Chinese JP d4d_4d4​
Chinese Chinese Chinese Tokyo Japan ? d5d_5d5​ Test

上述例子的training data中,X={Chinese,Beijing,Shanghai,Macao,Tokyo,Japan}X=\{Chinese, Beijing, Shanghai, Macao, Tokyo, Japan\}X={Chinese,Beijing,Shanghai,Macao,Tokyo,Japan},C={ZH,JP}C=\{ZH, JP\}C={ZH,JP}。
ChineseZH类中出现的次数count(Chinese,ZH)=5count(Chinese, ZH)=5count(Chinese,ZH)=5,在JP类中出现的次数count(Chinese,JP)=1count(Chinese, JP)=1count(Chinese,JP)=1。类似地,有:
count(Chinese,ZH)=5count(Chinese, ZH)=5count(Chinese,ZH)=5
count(Beijing,ZH)=1count(Beijing, ZH)=1count(Beijing,ZH)=1
count(Shanghai,ZH)=1count(Shanghai, ZH)=1count(Shanghai,ZH)=1
count(Macao,ZH)=1count(Macao, ZH)=1count(Macao,ZH)=1
count(Tokyo,JP)=1count(Tokyo, JP)=1count(Tokyo,JP)=1
count(Japan,JP)=1count(Japan, JP)=1count(Japan,JP)=1
count(Chinese,JP)=1count(Chinese, JP)=1count(Chinese,JP)=1

将上述单词出现的次数转换为频率,即除以该类别的单词数量。类别ZH的单词数量为8(重复的单词也算),JP类别的单词数量为3. 实际上我们要算的是Test数据分别属于ZHJP的概率,因此只考虑Test出现的单词即可(忽略Beijing, Shanghai和Macao)。计算得到:
P(Chinese∣ZH)≃freq(Chinese,ZH)=58P(Chinese|ZH) \simeq freq(Chinese, ZH) = \frac{5}{8}P(Chinese∣ZH)≃freq(Chinese,ZH)=85​
P(Tokyo∣ZH)≃freq(Tokyo,ZH)=0P(Tokyo|ZH) \simeq freq(Tokyo, ZH) = 0P(Tokyo∣ZH)≃freq(Tokyo,ZH)=0
P(Japan∣ZH)≃freq(Japan,ZH)=18P(Japan|ZH) \simeq freq(Japan, ZH) = \frac{1}{8}P(Japan∣ZH)≃freq(Japan,ZH)=81​
P(Chinese∣JP)≃freq(Chinese,JP)=13P(Chinese|JP) \simeq freq(Chinese, JP) = \frac{1}{3}P(Chinese∣JP)≃freq(Chinese,JP)=31​
P(Tokyo∣JP)≃freq(Tokyo,JP)=13P(Tokyo|JP) \simeq freq(Tokyo, JP) = \frac{1}{3}P(Tokyo∣JP)≃freq(Tokyo,JP)=31​
P(Japan∣JP)≃freq(Japan,JP)=13P(Japan|JP) \simeq freq(Japan, JP) = \frac{1}{3}P(Japan∣JP)≃freq(Japan,JP)=31​
以上是计算单项P(xj∣ci)P(x_j|c_i)P(xj​∣ci​)的简单过程。

一般地,设TcxT_{cx}Tcx​是某个文档ddd中的单词xxx在ccc类中出现的次数。设∑x+∈XTcx+\sum_{x^+\in X}T_{cx^+}∑x+∈X​Tcx+​是所有文档中(即DDD)单词x+x^+x+出现在ccc类中的次数,XXX表示DDD的单词集合。则上述过程的计算可用下式表示:(7)P(x∣c)=Tcx∑x+∈XTcx+P(x|c)=\frac{T_{cx}}{\sum_{x^+\in X}T_{cx^+}} \tag{7}P(x∣c)=∑x+∈X​Tcx+​Tcx​​(7)

但注意到上式的分子分母都可能为0,如P(Tokyo∣ZH)P(Tokyo|ZH)P(Tokyo∣ZH)的值为0,显然0的对数无意义。因此引入平滑因子α\alphaα,上式改写为:(8)P(x∣c)=Tcx+α∑x+∈X(Tcx++α)P(x|c)=\frac{T_{cx}+\alpha}{\sum_{x^+\in X}(T_{cx^+}+\alpha)} \tag{8}P(x∣c)=∑x+∈X​(Tcx+​+α)Tcx​+α​(8)
令α=1\alpha=1α=1,则有:
(9)P(x∣c)=Tcx+1∑x+∈X(Tcx++1)=Tcx+1∑x+∈X(Tcx+)+∣X∣P(x|c)=\frac{T_{cx}+1}{\sum_{x^+\in X}(T_{cx^+}+1)}= \frac{T_{cx}+1}{\sum_{x^+\in X}(T_{cx^+})+|X|} \tag{9}P(x∣c)=∑x+∈X​(Tcx+​+1)Tcx​+1​=∑x+∈X​(Tcx+​)+∣X∣Tcx​+1​(9)

上式即为计算P(x∣c)P(x|c)P(x∣c)的最终公式。α=1\alpha=1α=1称为Laplace平滑

如此,将公式(9)带入公式(6),即可进行文本分类。当然,需要先有training data.

#使用Python做文本情绪分类的实例
现在有1000多条已经标注好类别的tweets,根据每条tweet中包含的hashtag确定这条tweet属于哪一类。例如一条tweet中包含“#happy”, 那么这条tweet就会被分类到happy的类别。

在这个例子中,所有的tweet组成了文本集合D={d1,d2,...,dn}D=\{d_1, d_2, ... , d_n\}D={d1​,d2​,...,dn​} (n=20000n=20000n=20000)。

将这些tweet分成两部分,一部分用作training data,有700条tweet,剩下的用于test data. 先看看这些tweet长什么样。

数据预处理

在对tweet分类之前,先对tweet进行了预处理。首先对每个单词做lemmalization,即将动词和名词复数转为原形,形容词加ly后缀变成的副词都转为形容词原形,这个步骤通过Python的库可以实现。因为tweet的用语十分不规范,存在很多网络语言,因此对每条tweet去掉了在英文字典中不存在的单词(其实这个步骤可以省略,不应该剔除特殊词汇。但是为了方便,我还是去掉了)。

Python的sklearn开发包

sklearn包含很多机器学习的库,multinomial Bayes位于sklearn.naive_bayes.MultinomialNB中。先看看这个**类(不是函数)**的定义:

sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

参数alpha就是上文提到的平滑因子α\alphaα。fit_prior=True指是否根据training data学习P(C)P(C)P(C)的值,若赋值False,则P(C)P(C)P(C)的值是固定的,即上文提到的P(C)=1kP(C)=\frac{1}{k}P(C)=k1​,kkk是类别数。class_prior指是否指定P(C)P(C)P(C)的值。

使用方法如下。具体的使用说明可以参考这个链接。

定义一个MultinomialNB的对象

clf = MultinomialNB(alpha, fit_prior, class_prior)

输入训练样本数据

clf.fit(X_train_tf, Y_train)

预测

predicted = clf.predict(X_pre_tf)

以上的难点其实在于如何获取X_train_tf. 最后处理的结果accuracy是0.7197. 这部分的代码和数据可以参考这里。

这个例子的缺陷

这个例子中使用的tweet无论是training data还是test data都是已经标注好的数据,而标注的依据便是tweet中包含的hashtag,因此每一条tweet其实都包含了某一个emotion类别的关键字,这样可能会无形中提高分类的accuracy. 同时对文本也没有进行去除stopword等预处理,也没有计算TF-IDF。

贝叶斯分类器用于文本分类: Multinomial Naïve Bayes相关推荐

  1. 贝叶斯分类器做文本分类案例

    贝叶斯分类器做文本分类 文本分类是现代机器学习应用中的一大模块,更是自然语言处理的基础之一.我们可以通过将文字数据处理成数字数据,然后使用贝叶斯来帮助我们判断一段话,或者一篇文章中的主题分类,感情倾向 ...

  2. python 贝叶斯分类器sklearn_使用sklearn自带的贝叶斯分类器进行文本分类和参数调优...

    数据挖掘入门与实战 公众号: datadw Part 1: 本篇内容简介 在前一篇文章完整手写一个朴素贝叶斯分类器,完成文本分类,我们使用首先假设在文档中出现的单词彼此独立,利用贝叶斯定理,完成了一个 ...

  3. c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)

    基于朴素贝叶斯分类器的文本分类算法(C语言) 基于朴素贝叶斯分类器的文本分类算法(C语言).txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情.#include ...

  4. 机器学习 —— 基础整理(二)朴素贝叶斯分类器;文本分类的方法杂谈

          上一篇博客复习了贝叶斯决策论,以及生成式模型的参数方法.本篇就给出一个具体的例子:朴素贝叶斯分类器应用于文本分类.后面简单谈了一下文本分类的方法. (五)朴素贝叶斯分类器(NaïveBay ...

  5. python文本分类算法_python编写朴素贝叶斯用于文本分类

    朴素贝叶斯估计 朴素贝叶斯是基于贝叶斯定理与特征条件独立分布假设的分类方法.首先根据特征条件独立的假设学习输入/输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出 ...

  6. 6个你应该用用看的用于文本分类的最新开源预训练模型 忆臻

    作者:PURVA HUILGOL 编译:ronghuaiyang (AI公园) 原文链接: 6个你应该用用看的用于文本分类的最新开源预训练模型​mp.weixin.qq.com 导读 文本分类是NLP ...

  7. 【NLP】6种用于文本分类的开源预训练模型

    来源 | PURVA HUILGOL 编译 | VK 作者 | Analytics Vidhya [导读]我们正站在语言和机器的交汇处,这个话题我很感兴趣.机器能像莎士比亚一样写作吗?机器能提高我自己 ...

  8. 六种用于文本分类的开源预训练模型

    作者|PURVA HUILGOL 编译|VK 来源|Analytics Vidhya 介绍 我们正站在语言和机器的交汇处,这个话题我很感兴趣.机器能像莎士比亚一样写作吗?机器能提高我自己的写作能力吗? ...

  9. TextRNN用于文本分类

    1.单向RNN结构 上述公式中,权重矩阵U.V.W共享 2.双向RNN(Bidirection-RNN)结构 双向RNN的最终输出和中间隐藏状态的计算公式如下,正向计算与反向计算不共享权重: 3.LS ...

最新文章

  1. windows服务器指定IP地址才能进行远程访问桌面设置方法
  2. 【mysql解决方案】ERROR 1248 (42000): Every derived table must have its own alias
  3. Leetcode 剑指 Offer 13. 机器人的运动范围 (每日一题 20210906)
  4. Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)
  5. 香农定理和奈奎斯特定理区别_「中考复习」三大变换之旋转(旋转的构造-托勒密定理)...
  6. android 判断手机计步_干货:电脑控制手机 一定不能错过的神器
  7. android webview 截图,Android获取webView快照与屏幕截屏的方法 -电脑资料
  8. 《.NET设计规范 约定、惯用法与模式》读书笔记
  9. Cloud for Customer里点了Opportunity ID的超链接到进入overview page,背后发生了什么事?
  10. mysql导入sql脚本命令
  11. java多条件组合查询6_elasticsearch组合多条件查询实现restful api以及java代码实现
  12. python适用的操作系统是_操作系统先来先服务python
  13. java项目eclipse上tomcat部署后项目添加不进去
  14. nginx expires配置
  15. 学计算机和摄影哪个好,【干货】如何学习好摄影后期
  16. Flask中数据库的应用
  17. 《穷爸爸,富爸爸》读书笔记
  18. 对目录下所有库文件进行rpath更改操作的SHELL脚本
  19. 1.3寸OLED 12864 sh1106带中文字库液晶屏介绍
  20. java JDK安装及环境变量配置

热门文章

  1. SQL Server AlwaysOn集群在辅助副本创建只读账号
  2. 9. 求数组任意次最值
  3. 用 npm script 实现服务自动化运维
  4. 容器编排技术 -- Kubernetes kubectl 概述
  5. Struts2 Hibernate集成示例教程
  6. Dubbo面试 - 如何自己设计一个类似 Dubbo 的 RPC 框架?
  7. 使用MariaDB后端在Ubuntu 18.04 / Debian 9上安装PowerDNS和PowerDNS-Admin
  8. Docker上部署MariaDB
  9. 开发技术--设计模式
  10. 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 数据渲染模块