朴素贝叶斯算法:按照概率分类的算法。

我们在豆瓣上经常能看到一些书籍和电影评价,有好的评价,也有差评。

关于影评好坏的结果是怎么来的呢?后台小姐姐一条条的看,然后进行分类吗?利用我们的朴素贝叶斯算法, 可以实现对文本的分类

在上代码之前先来进行一下数学预热:

概率基础复习

定义:概率定义为一件事发生的可能性,扔出一个硬币,结果头像朝上

P(X):取值在[0,1]

联合概率、条件概率与相互独立:

联合概率:包含多个条件,且所有条件同时成立的概率

记作:P(A,B)

条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率

记作:P(A|B)

相互独立:如果P(A,B) = P(A)P(B),则称事件A与事件B相互独立

朴素贝叶斯公式:

朴素贝叶斯,简单理解,就是假定了特征与特征之间相互独立的贝叶斯公式。

也就是说,朴素贝叶斯,之所以朴素,就在于假定了特征与特征相互独立。

在这个案例中,需要用到的包:numpy

import numpy as npdef loadDataSet():"""加载训练数据, postingList是所有的训练集, 每一个列表代表一条言论, 一共有6条言论 classVec代表每一条言论的类别,0是正常, 1是有侮辱性 返回 言论和类别:return:"""# 步骤的缺失,和正常的比较,此处省略了文本的切割,都是直接弄好的,直接切割成单词用了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]return postingList,classVecdef createVocabList(dataSet):"""创建词汇表, 就是把这个文档中所有的单词不重复的放在一个列表里面:param dataSet::return:"""vocabSet = set([])for data in dataSet:# 此处的|表示合并两个集合vocabSet = vocabSet | set(data)return list(vocabSet)def setofword(vacablist,inputdata):"""制作词向量矩阵将每一个文档转换为词向量, 然后放入矩阵中:param vocabSet::param dataSet::return:"""vectors=[]# 两个向量相乘,一开始默认都是0vectors = [0] * len(vacablist)for word in inputdata:if word in vacablist:vectors[vacablist.index(word)] = 1else:print(f'没有{word}这个词')# print('没有 {} 这个词'.format(word))return vectorsdef trainNB1(trainMat,trainCategory):"""根据上面set集合提取出来,一共有32个特征trainMat是文档矩阵[]32位0,1,trainCategory是每篇文档类别标签所构成的向量[0,1,0,1,0,1]"""# 总的训练语句数=文档矩阵的条数6numTrainDocs = len(trainMat)# 总的词数 此处为32numWords = len(trainMat[0])# 矩阵的sum是所有元素相加,此处是0+1+0+1+0+1=3sumOfCate1 = sum(trainCategory)# 6-3 = 3sumOfCate0 = len(trainCategory) - sumOfCate1# 侮辱性词汇的概率 = 3/6 =0.5pAbusive = sumOfCate1/float(numTrainDocs)# 创建一个32位的1矩阵,表示初始的p0,为了避免出现零的情况,根据拉普拉斯公式创建1填充的矩阵p0Num = np.ones(numWords)# 创建一个32位的1矩阵,表示初始的p1,为了避免出现零的情况,根据拉普拉斯公式创建1填充的矩阵p1Num = np.ones(numWords)# 创建一个变量p0Denom 非侮辱性词汇总数,为了避免出现零的情况,根据拉普拉斯公式设置为2.0p0Denom = 2.0# 创建一个变量p1Denom 侮辱性词汇总数,为了避免出现零的情况,根据拉普拉斯公式设置为2.0p1Denom = 2.0#计算每个词在对应类别中出现的样本数量for i in range(numTrainDocs):if trainCategory[i] == 1:# 最终得到一个侮辱性的32位矩阵p1Num += trainMat[i]p1Denom += sum(trainMat[i])else:# 最终得到一个非侮辱性的32位矩阵p0Num += trainMat[i]p0Denom += sum(trainMat[i])# log不能直接对矩阵进行操作,np.log# 词出现的样本数与一个分类样本所有样本数量的比# 得到侮辱性词汇概率矩阵 (矩阵除以一个浮点数)# 为了防止下溢出的问题,把矩阵转化成对数的形式,f(x)与ln(f(x))趋势和极值点相同p1Vect = np.log(p1Num/p1Denom)# 得到非侮辱性词汇概率矩阵 (矩阵除以一个浮点数)p0Vect = np.log(p0Num/p0Denom)return p0Vect,p1Vect,pAbusive# 用得到的概率分类
def classfyNB(vec2Classify, p0Vect, p1Vect, pAbusive):"""参数包括要分类的向量vec2Classify以及使用函数trainNB1()计算得到的三个概率"""# 使用numpy数组来计算两个向量相乘的结果,这里的相乘是指对应元素相乘,# 即先将两个向量中的第一个元素相乘,然后将第二个元素相乘,以此类推p1 = sum(vec2Classify * p1Vect) + np.log(pAbusive)p0 = sum(vec2Classify * p0Vect) + np.log(1.0 - pAbusive)if p1 > p0:return 1else:return 0#测试代码
def testingNB():print('数字0表示没有侮辱性,数字1表示有侮辱性:')dataSet, listClasses = loadDataSet()myVocabList = createVocabList(dataSet)# print(f'我是词袋长度{len(myVocabList)}')# print(f'我是词袋{dataSet}')trainMat = []for data in dataSet:trainMat.append(setofword(myVocabList,data))# print(f'我是矩阵{trainMat}')p0V,p1V,pAb = trainNB1(trainMat, listClasses)# print(f'我是概率{p0V,p1V}')testEntry = ['love','my','dalmation']thisDOc =setofword(myVocabList,testEntry)p1 = classfyNB(thisDOc,p0V,p1V,pAb)print(f'当前词条{testEntry}的结果为:{p1}')testEntry = ['dog','stupid']thisDOc =setofword(myVocabList, testEntry)p2 = classfyNB(thisDOc, p0V, p1V, pAb)print(f'当前词条{testEntry}的结果为:{p2}')testingNB()

在代码测试完以后,可以调用sklearn中自带的byes的API验证一下自己写的代码准确性,MultinomialNB(alpha = 1.0),默认拉普拉斯公式为1;

注:上述代码是把所有特征放到一个矩阵中进行运算的,利用numpy的array格式进行计算,速度远远快于循环遍历(它不经过python的解释器,numpy的底层是c代码)

朴素贝叶斯算法——文本分类(离散型)相关推荐

  1. 基于朴素贝叶斯的文本分类算法

    基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机.K-近邻算法和朴素贝叶斯.其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用.本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模 ...

  2. 朴素贝叶斯基于朴素贝叶斯的文本分类算法

    朴素贝叶斯 以及 基于朴素贝叶斯的文本分类算法 参考文章: https://www.cnblogs.com/jorbin/articles/1915888.html

  3. 朴素贝叶斯文本分类java_基于朴素贝叶斯的文本分类算法

    基于朴素贝叶斯的文本分类算法 摘要:常用的文本分类方法有支持向量机.K-近邻算法和朴素贝叶斯.其中朴素贝叶斯具有容易实现,运行速度快的特点,被广泛使用.本文详细介绍了朴素贝叶斯的基本原理,讨论多项式模 ...

  4. 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战

    基于朴素贝叶斯的文本分类方法 一.朴素贝叶斯原理的介绍 二.朴素贝叶斯分类器的代码实现 分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时会给出这个猜测的概率估计值.朴素贝叶 ...

  5. k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优

    k近邻算法,朴素贝叶斯算法,分类模型评估,模型调优 k近邻算法 k近邻算法概述 k近邻算法代码实现 k近邻算法的评价 朴素贝叶斯算法 朴素贝叶斯算法概述 朴素贝叶斯代码实现 朴素贝叶斯的评价 分类模型 ...

  6. 七、朴素贝叶斯中文文本分类

    1.朴素贝叶斯中文文本分类 中文分词 停用词 朴素贝叶斯中文分类举例:新闻文档分类 朴素贝叶斯中文分类的具体过程:加载停用词.中文分词.文本向量化.模型训练和保存.模型的加载和预测. 2 中文分词 2 ...

  7. 基于朴素贝叶斯实现文本分类

    基于朴素贝叶斯实现文本分类 数据集介绍 数据集为网上公开的新闻数据,其中数据集包含10个类别. 模型选择 贝叶斯分类 贝叶斯公式 朴素贝叶斯 拉普拉斯平滑引入 某个属性的条件概率为0,则会导致整体概率 ...

  8. python朴素贝叶斯的文本分类_自给自足,完全手写一个朴素贝叶斯分类器,完成文本分类...

    Part 1: 本文解决的问题: 我在有这样的一个数据集,里面存放了人们对近期播放电影的评价,当然评价也就分成两部分,好评和差评.我们想利用这些数据训练一个模型,然后可以自动的对影评做出判断,到底是好 ...

  9. HanLP 基于朴素贝叶斯 训练 文本分类

    一.HanLP 朴素贝叶斯分类器 HanLP 针对文本分类算法已经帮我们实现 朴素贝叶斯法 ,用户可以无需关心内部细节,HanLP 也提供了相关自定义训练接口,前提需要将数据集根据分类放到不同的目录中 ...

最新文章

  1. Nature: 人的肠道古细菌基因组集
  2. c语言测机器运行时间,C语言clock()测试函数运行时间
  3. 【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
  4. C++11 标准新特性: 右值引用与转移语义(点评)
  5. 线上CPU100%?看看这篇是怎么排查的!
  6. ES6新特性_ES6迭代器应用-自定义遍历数据---JavaScript_ECMAScript_ES6-ES11新特性工作笔记019
  7. 使用cdn和npm引入的区别_带你体验 Vue2 和 Vue3 开发组件有什么区别
  8. 教你如何弹好吉他-合理的安排你的练习时间
  9. js如何区分单击与双击(如何避免双击的时候触发单击事件)
  10. oracle开启em服务
  11. 蓝牙协议(bluetooth spec)
  12. 华为服务器销售怎么样,云服务器销售好做吗
  13. 连接型智能BPM引擎——雀书
  14. 伺服马达和步进马达的区别在哪里?
  15. java购物商城系统开题报告_开题报告-基于Java的网上购物商城的设计与实现.doc...
  16. 安卓手机MTK手机3d模型查看器源码APP下载
  17. TMS320F2812产生PWM波程序
  18. Ubuntu 16.04安装Intel显卡驱动(解决Intel HD Graphics 630显卡驱动问题)
  19. Wiegand 协议
  20. VGG Net、GoogLe Net、Squeezed Net、Mobile Net、Shuffle Net、Res Net梳理与网络优化

热门文章

  1. 伯恩光学再成被执行人:多次因劳动纠纷被起诉,曾冲刺港交所上市
  2. r730 虚拟磁盘不见了_戴尔服务器R730 无法分区安装解决办法
  3. Linux学习---shell脚本中的算术运算(加减乘除求余)
  4. 冲压线自动化改造必学资料
  5. 配置一套个人学习AI技术的计算机
  6. 钉钉2020电脑版 v5.1.39.10官方版
  7. 六步实现课程倍速播放
  8. nopcommerce mysql_基于nopcommerce b2c开源项目的精简版开发框架Nop.Framework
  9. 韩顺平html学习笔记2
  10. Advanced SWT Widegts 1st