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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python科学计算环境推荐——Anaconda
Jun 30 Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python3字符串学习教程
Aug 20 Python
django 删除数据库表后重新同步的方法
May 27 Python
TensorFlow的权值更新方法
Jun 14 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
Python中正则表达式的用法总结
Feb 22 Python
python如何调用php文件中的函数详解
Dec 29 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 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常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
js+FSO遍历文件夹下文件并显示
2007/03/07 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
Python之循环结构
2019/01/15 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
容易被忽略的Python内置类型
2020/09/03 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
商务主管岗位职责
2013/12/08 职场文书
给医务人员表扬信
2014/01/12 职场文书
2014年教师节寄语
2014/04/03 职场文书
财务工作失职检讨书
2014/11/21 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
JVM钩子函数的使用场景详解
2021/08/23 Java/Android