python编写朴素贝叶斯用于文本分类


Posted in Python onDecember 21, 2017

朴素贝叶斯估计

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

python编写朴素贝叶斯用于文本分类

以及条件概率为

python编写朴素贝叶斯用于文本分类

Xl表示第l个特征,由于特征条件独立的假设,可得

python编写朴素贝叶斯用于文本分类

条件概率的极大似然估计为

python编写朴素贝叶斯用于文本分类

根据贝叶斯定理

python编写朴素贝叶斯用于文本分类

则由上式可以得到条件概率P(Y=ck|X=x)。

贝叶斯估计

用极大似然估计可能会出现所估计的概率为0的情况。后影响到后验概率结果的计算,使分类产生偏差。采用如下方法解决。
条件概率的贝叶斯改为

python编写朴素贝叶斯用于文本分类

其中Sl表示第l个特征可能取值的个数。
同样,先验概率的贝叶斯估计改为

$$
P(Y=c_k) = \frac{\sum\limits_{i=1}^NI(y_i=c_k)+\lambda}{N+K\lambda}
$K$

表示Y的所有可能取值的个数,即类型的个数。
具体意义是,给每种可能初始化出现次数为1,保证每种可能都出现过一次,来解决估计为0的情况。

文本分类

朴素贝叶斯分类器可以给出一个最有结果的猜测值,并给出估计概率。通常用于文本分类。
分类核心思想为选择概率最大的类别。贝叶斯公式如下:

python编写朴素贝叶斯用于文本分类

词条:将每个词出现的次数作为特征。
假设每个特征相互独立,即每个词相互独立,不相关。则

python编写朴素贝叶斯用于文本分类

完整代码如下;

import numpy as np
import re
import feedparser
import operator
def loadDataSet():
 postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
     ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
     ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
     ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
     ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
     ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
 classVec = [0,1,0,1,0,1] #1 is abusive, 0 not
 return postingList,classVec

def createVocabList(data): #创建词向量
 returnList = set([])
 for subdata in data:
  returnList = returnList | set(subdata)
 return list(returnList)


def setofWords2Vec(vocabList,data):  #将文本转化为词条

 returnList = [0]*len(vocabList)
 for vocab in data:
  if vocab in vocabList:
   returnList[vocabList.index(vocab)] += 1
 return returnList


def trainNB0(trainMatrix,trainCategory):  #训练,得到分类概率
 pAbusive = sum(trainCategory)/len(trainCategory)
 p1num = np.ones(len(trainMatrix[0]))
 p0num = np.ones(len(trainMatrix[0]))
 p1Denom = 2
 p0Denom = 2
 for i in range(len(trainCategory)):
  if trainCategory[i] == 1:
   p1num = p1num + trainMatrix[i]
   p1Denom = p1Denom + sum(trainMatrix[i])
  else:
   p0num = p0num + trainMatrix[i]
   p0Denom = p0Denom + sum(trainMatrix[i])
 p1Vect = np.log(p1num/p1Denom)
 p0Vect = np.log(p0num/p0Denom)
 return p0Vect,p1Vect,pAbusive


def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1): #分类
 p0 = sum(vec2Classify*p0Vec)+np.log(1-pClass1)
 p1 = sum(vec2Classify*p1Vec)+np.log(pClass1)
 if p1 > p0:
  return 1
 else:
  return 0
def textParse(bigString):   #文本解析
 splitdata = re.split(r'\W+',bigString)
 splitdata = [token.lower() for token in splitdata if len(token) > 2]
 return splitdata
def spamTest():
 docList = []
 classList = []
 for i in range(1,26):
  with open('spam/%d.txt'%i) as f:
   doc = f.read()
  docList.append(doc)
  classList.append(1)
  with open('ham/%d.txt'%i) as f:
   doc = f.read()
  docList.append(doc)
  classList.append(0)
 vocalList = createVocabList(docList)
 trainList = list(range(50))
 testList = []
 for i in range(13):
  num = int(np.random.uniform(0,len(docList))-10)
  testList.append(trainList[num])
  del(trainList[num])
 docMatrix = []
 docClass = []
 for i in trainList:
  subVec = setofWords2Vec(vocalList,docList[i])
  docMatrix.append(subVec)
  docClass.append(classList[i])
 p0v,p1v,pAb = trainNB0(docMatrix,docClass)
 errorCount = 0
 for i in testList:
  subVec = setofWords2Vec(vocalList,docList[i])
  if classList[i] != classifyNB(subVec,p0v,p1v,pAb):
   errorCount += 1
 return errorCount/len(testList)

def calcMostFreq(vocabList,fullText):
 count = {}
 for vocab in vocabList:
  count[vocab] = fullText.count(vocab)
 sortedFreq = sorted(count.items(),key=operator.itemgetter(1),reverse=True)
 return sortedFreq[:30]

def localWords(feed1,feed0):
 docList = []
 classList = []
 fullText = []
 numList = min(len(feed1['entries']),len(feed0['entries']))
 for i in range(numList):
  doc1 = feed1['entries'][i]['summary']
  docList.append(doc1)
  classList.append(1)
  fullText.extend(doc1)
  doc0 = feed0['entries'][i]['summary']
  docList.append(doc0)
  classList.append(0)
  fullText.extend(doc0)
 vocabList = createVocabList(docList)
 top30Words = calcMostFreq(vocabList,fullText)
 for word in top30Words:
  if word[0] in vocabList:
   vocabList.remove(word[0])
 trainingSet = list(range(2*numList))
 testSet = []
 for i in range(20):
  randnum = int(np.random.uniform(0,len(trainingSet)-5))
  testSet.append(trainingSet[randnum])
  del(trainingSet[randnum])
 trainMat = []
 trainClass = []
 for i in trainingSet:
  trainClass.append(classList[i])
  trainMat.append(setofWords2Vec(vocabList,docList[i]))
 p0V,p1V,pSpam = trainNB0(trainMat,trainClass)
 errCount = 0
 for i in testSet:
  testData = setofWords2Vec(vocabList,docList[i])
  if classList[i] != classifyNB(testData,p0V,p1V,pSpam):
   errCount += 1
 return errCount/len(testData)
if __name__=="__main__":
 ny = feedparser.parse('http://newyork.craigslist.org/stp/index.rss')
 sf = feedparser.parse('http://sfbay.craigslist.org/stp/index.rss')
 print(localWords(ny,sf))

编程技巧:

1.两个集合的并集

vocab = vocab | set(document)

2.创建元素全为零的向量

vec = [0]*10

代码及数据集下载:贝叶斯

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中删除文件的程序代码
Mar 13 Python
Python3.0与2.X版本的区别实例分析
Aug 25 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
简单了解python模块概念
Jan 11 Python
对pandas中apply函数的用法详解
Apr 10 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python提取xml里面的链接源码详解
Oct 15 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 Python
python并发2之使用asyncio处理并发
Dec 21 #Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 #Python
Python人脸识别初探
Dec 21 #Python
python中判断文件编码的chardet(实例讲解)
Dec 21 #Python
python 设置文件编码格式的实现方法
Dec 21 #Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 #Python
Python 查看文件的编码格式方法
Dec 21 #Python
You might like
PHP防注入安全代码
2008/04/09 PHP
php浏览历史记录的方法
2015/03/10 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
解析window.open的使用方法总结
2013/06/19 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
详解python tcp编程
2020/08/24 Python
python 决策树算法的实现
2020/10/09 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
计算机系统管理员求职信
2014/06/20 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers