不需要深度学习就能做的文本分类器

朴素贝叶斯文本分类应该是最简单的文本分类器了。它基于这么一个假设:在给定类别的文档中,所有的词都是独立无关的

朴素贝叶斯做文本分类的原理如下:

令d代表输入文档,c代表文档所属类别。分类的目标是要 求在输入d文档的前提下属于类别c的概率$P(c|d)$,概率越高说明文档越有可能属于类别c。即

$\widehat{c}=\arg \max \limits_{c \in C} P(c|d)$

利用贝叶斯公式$P(c|d)=\frac{P(d|c) P(c)}{P(d)}$,由于$P(d)$指的是文档d出现的概率,它在整个数据集中都有相同的值,对每个类别的贡献都是相同的,所以我们可以将它忽略,于是可以得到下式

$\widehat{c}=\arg \max \limits_{c \in C} P(d|c) P(c)$

因为文档d是由单词word组成的,所以可以进一步分解如下

$\widehat{c}=\arg \max \limits_{c \in C} P(w_1,w_2,...,w_n|c) P(c)$

再利用朴素贝叶斯的假设,变为

$\widehat{c}=\arg \max \limits_{c \in C} P(w_1,w_2,...,w_n|c) P(c)=\arg \max \limits_{c \in C} P(c) \prod_{i=1}^{n} P(w_i|c) $

这里i表示word所在的位置

两边取log,避免溢出,就得到

$log \widehat{c}=log \arg \max \limits_{c \in C} P(c) \prod_{i=1}^{n} P(w_i|c) =\arg \max \limits_{c \in C} log P(c) + \sum_{i=1}^{n} log P(w_i|c)$

接下来计算P(c)和P(w_i|c)。

P(c)表示某类数据在所有数据中出现的概率。在文本分类中,它表示c类型的文档在所有文档中出现的概率,即c类型的文档$N_c$占总文档数量$N_{doc}$的比例

$P(c)=\frac{N_c}{N_{doc}}$

然后求$P(w_i|c)$:

$P(w_i|c)=\frac{count(w_i,c)}{\sum_{w \in V} count(w,c)}$

$count(w_i,c)$为某类文档中w_i词出现的次数,V为所有文档中出现的词汇。

Tips:

未出现的词会导致概率为0,使得所有乘积为0。推荐的一种方法是使用加1(Laplace)平滑:

$P(w_i|c)=\frac{count(w_i,c)+1}{\sum_{w \in V} (count(w,c)+1)}=\frac{count(w_i,c)+1}{\sum_{w \in V} count(w,c)+|V|}$

python实现参考链接:https://github.com/webbery/NLPExperiments.git

伪代码实现如下:

 参考文献:

[1] Speech and Language Processing. Third Edition. Daniel Jurafsky, James H. Martin

转载于:https://www.cnblogs.com/webbery/p/11277458.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值