朴素贝叶斯法

本文介绍如何利用贝叶斯分类器进行文本情感分析,并通过拉普拉斯平滑处理来解决训练数据中未出现的词汇问题。通过具体实例演示了分类器的训练与分类过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习与分类算法

先从训练数据中计算先验概率和条件概率,然后对于给定的实例计算最大的条件概率,输出该条件对应的类别。形式化的描述如下:

这里写图片描述

贝叶斯估计

最大似然估计有个隐患,假设训练数据中没有出现某种参数和类别的组合怎么办?此时估计的概率值为0,但是这不代表真实数据中就没有这样的组合。解决办法是采用贝叶斯估计

1、条件概率的贝叶斯估计:

这里写图片描述

其中平滑因子.png,Sj表示xj可能取值的种数。分子和分母分别比最大似然估计多了一点东西,其意义是在随机变量每个取值的频数上加一个常量平滑因子.png。当此常量取0时,就是最大似然估计,当此常量取1时,称为拉普拉斯平滑。

2、先验概率的贝叶斯估计:

这里写图片描述

贝叶斯情感极性分析器

这里分析一个基于贝叶斯文本分类器实现的简单情感极性分析器。

调用实例:

  1. # -*-coding:utf-8 -*-
  2. #Filename: Bayes.py
  3. # Authorhankcs
  4. # Date:2015/2/6 22:25
  5. from math import log, exp
  6.  
  7.  
  8. class LaplaceEstimate(object):
  9.     """
  10.     拉普拉斯平滑处理的贝叶斯估计
  11.     """
  12.  
  13.     def __init__(self):
  14.         self.d = {}   # [-词频]map
  15.         self.total = 0.0   全部词的词频
  16.         self.none = 1   当一个词不存在的时候,它的词频(等于0+1
  17.  
  18.     def exists(self, key):
  19.         return key in self.d
  20.  
  21.     def getsum(self):
  22.         return self.total
  23.  
  24.     def get(self, key):
  25.         if not self.exists(key):
  26.             return False, self.none
  27.         return True, self.d[key]
  28.  
  29.     def getprob(self, key):
  30.         """
  31.         估计先验概率
  32.         :param key: 
  33.         :return: 概率
  34.         """
  35.         return float(self.get(key)[1]) / self.total
  36.  
  37.     def samples(self):
  38.         """
  39.         获取全部样本
  40.         :return:
  41.         """
  42.         return self.d.keys()
  43.  
  44.     def add(self, key, value):
  45.         self.total += value
  46.         if not self.exists(key):
  47.             self.d[key] = 1
  48.             self.total += 1
  49.         self.d[key] += value
  50.  
  51.  
  52. class Bayes(object):
  53.     def __init__(self):
  54.         self.d = {}   # [标签概率] map
  55.         self.total = 0   全部词频
  56.  
  57.  
  58.     def train(self, data):
  59.         for d in data:  # d[[词链表], 标签]
  60.             c = d[1]   # c是分类
  61.             if c not in self.d:
  62.                 self.d[c] =LaplaceEstimate()   # d[c]是概率统计工具
  63.             for word in d[0]:
  64.                 self.d[c].add(word, 1)   统计词频
  65.         self.total = sum(map(lambda x: self.d[x].getsum(), self.d.keys()))
  66.  
  67.     def classify(self, x):
  68.         tmp = {}
  69.         for c in self.d: 分类
  70.             tmp[c] = log(self.d[c].getsum()) - log(self.total)   # P(Y=ck)
  71.             for word in x:
  72.                 tmp[c] += log(self.d[c].getprob(word))           # P(Xj=xj | Y=ck)
  73.         ret, prob = 0, 0
  74.         for c in self.d:
  75.             now = 0
  76.             try:
  77.                 for otherc in self.d:
  78.                     now += exp(tmp[otherc] - tmp[c])            将对数还原为1/p
  79.                 now = 1 / now
  80.             except OverflowError:
  81.                 now = 0
  82.             if now > prob:
  83.                 ret, prob = c, now
  84.         return (ret, prob)
  85.  
  86.  
  87. class Sentiment(object):
  88.     def __init__(self):
  89.         self.classifier = Bayes()
  90.  
  91.     def segment(self, sent):
  92.         words = sent.split(' ')
  93.         return words
  94.  
  95.     def train(self,neg_docs, pos_docs):
  96.         data = []
  97.         for sent in neg_docs:
  98.             data.append([self.segment(sent), u'neg'])
  99.         for sent in pos_docs:
  100.             data.append([self.segment(sent), u'pos'])
  101.         self.classifier.train(data)
  102.  
  103.     def classify(self, sent):
  104.  
  105.         return self.classifier.classify(self.segment(sent))
  106.  
  107. =Sentiment()
  108. s.train([u'糟糕', u' 差劲'], [u'优秀', u' ']) 空格分词
  109.  
  110. print s.classify(u" 优秀")

    输出

    1. (u'pos', 0.6666666666666665)

      说明“好优秀”这句话具有正能量的概率是66%,虽然“好”这个词语也存在于负极性的语句中,但是分类器还是准确地区分了它。

      上面的贝叶斯分类器使用了拉布拉斯平滑处理策略,在进行条件概率的时候,不是连乘,而是取对数相加,最后逐差取指数,这个过程会发生归一化,得出一个概率出来。

      原文作者:hankcs
      原文地址:http://www.hankcs.com/ml/naive-bayesian-method.html

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值