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常用正则表达式符号浅析
Aug 13 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
在Python中用split()方法分割字符串的使用介绍
May 20 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
python format 格式化输出方法
Jul 16 Python
django如何通过类视图使用装饰器
Jul 24 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
pytorch forward两个参数实例
Jan 17 Python
Python 调用有道翻译接口实现翻译
Mar 02 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.ini 中文版
2006/10/28 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
Javascript实现的分页函数
2007/02/07 Javascript
ExtJS 入门
2010/10/29 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
AngularJS语法详解
2015/01/23 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
2019/03/07 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
Python用input输入列表的实例代码
2020/02/07 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
党员违纪检讨书
2014/02/18 职场文书
模具专业自荐信
2014/05/29 职场文书
买房协议书范本
2014/10/23 职场文书
老龙头导游词
2015/02/11 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
Python pygame实现中国象棋单机版源码
2021/06/20 Python