机器学习实战4.2 朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论

参考地址:https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html

一、引子

很久没更新机器学习实战了 应该是很久没看这本书了 最近上课需要准备各种论文来讲 今天刚上了一节课 给大家伙讲了讲深度学习 效果感觉不错 老师也很支持我们组织一起来做这个公众号(计算机视觉这件小事)和github开源笔记 瞬间感觉自己做的东西是有目标有效果的 劲头大增 我们会一直坚持下去的~ 上次做的是朴素贝叶斯的基本概念 这次在概念的基础上做一个例子 加深一下对朴素贝叶斯的理解

二、朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论

现在进入我们的实战阶段.
完整代码地址:https://github.com/aimi-cn/AILearners/tree/master/src/py2.x/ml/jqxxsz/4.NaiveBayes/NaiveBayesDemo01.py

1、项目概述

为了不影响社区的发展,我们要屏蔽侮辱性的言论,所以要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标志为内容不当。过滤这类内容是一个很常见的需求。对此问题建立两个类型:侮辱类和非侮辱类,使用1和0分别表示。

2、开发流程

  1. 收集数据: 可以使用任何方法
  2. 准备数据: 从文本中构建词向量
  3. 分析数据: 检查词条确保解析的正确性
  4. 训练算法: 从词向量计算概率
  5. 测试算法: 根据现实情况修改分类器
  6. 使用算法: 对社区留言板言论进行分类

3、代码开发流程

收集数据: 可以使用任何方法

首先我们构造自己的词表:带有侮辱性的词表我们把他的标签设置为1 反之为1 这个上面我们定义了六个词表(假设已经将本文切分完毕) 把他们以词条的形式展示 三个是侮辱类 三个不是侮辱类

'''
@description: 创建实验样本
@param {None}
@return: postingList - 实验样本切分的词条classVec - 类别标签向量 0代表非侮辱类 1代表侮辱类
'''
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代表侮辱性词汇,0代表不是return postingList,classVecif __name__ == '__main__':postingLIst, classVec = loadDataSet()for each in postingLIst:print(each)print(classVec)

从运行结果可以看出,我们已经将postingList是存放词条列表中,classVec是存放每个词条的所属类别,1代表侮辱类 ,0代表非侮辱类。

准备数据: 从文本中构建词向量 & 分析数据: 检查词条确保解析的正确性

我们现在已经把句子转化为向量了 接着我们要先创建一个词汇表,并将切分好的词条转换为词条向量

代码如下:

'''
@description: 创建实验样本
@param {None}
@return: postingList - 实验样本切分的词条classVec - 类别标签向量 0代表非侮辱类 1代表侮辱类
'''
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代表侮辱性词汇,0代表不是return postingList,classVec'''
@description: 将切分的实验样本词条整理成不重复的词条列表,也就是词汇表
@param dataSet - 整理的样本数据集
@return: vocabSet - 返回不重复的词条列表,也就是词汇表
'''
def createVocabList(dataSet):vocabSet = set([])                      #创建一个空的不重复列表for document in dataSet:               vocabSet = vocabSet | set(document) #取并集return list(vocabSet)'''
@description: 根据vocabList词汇表,将inputSet向量化,向量的每个元素为1或0 1存在 0不存在
@param: vocabList - createVocabList返回的列表
inputSet - 切分的词条列表
@return: returnVec - 文档向量,词集模型
'''
def setOfWords2Vec(vocabList, inputSet):returnVec = [0] * len(vocabList)                                    #创建一个其中所含元素都为0的向量for word in inputSet:                                                #遍历每个词条if word in vocabList:                                            #如果词条存在于词汇表中,则置1returnVec[vocabList.index(word)] = 1else: print("the word: %s is not in my Vocabulary!" % word)return returnVec                                                    #返回文档向量if __name__ == '__main__':postingList, classVec = loadDataSet()print('postingList:\n',postingList)myVocabList = createVocabList(postingList)print('myVocabList:\n',myVocabList)trainMat = []for postinDoc in postingList:trainMat.append(setOfWords2Vec(myVocabList, postinDoc))print('trainMat:\n', trainMat)

从运行结果可以看出,postingList是原始的词条列表,myVocabList是词汇表。myVocabList是所有单词出现的集合,没有重复的元素。词汇表是用来干什么的?没错,它是用来将词条向量化的,一个单词在词汇表中出现过一次,那么就在相应位置记作1,如果没有出现就在相应位置记作0。trainMat是所有的词条向量组成的列表。它里面存放的是根据myVocabList向量化的词条向量。

训练算法: 从词向量计算概率

我们已经得到了词条向量。接下来,我们就可以通过词条向量训练朴素贝叶斯分类器。

'''
@description: 朴素贝叶斯分类器训练函数
@param {type}
@return:
'''
def trainNB0(trainMatrix,trainCategory):#计算训练的文档数目 本文中6个numTrainDocs = len(trainMatrix)  #计算每篇文档的词条数   32个  也就是不重复的词条数numWords = len(trainMatrix[0])  #文档属于侮辱类的概率   0.5  --->  (0+1+0+1+0+1)/6   pAbusive = sum(trainCategory)/float(numTrainDocs)  #创建numpy.zeros数组,词条出现数初始化为0 表示每个词条出现的个数p0Num = np.zeros(numWords); p1Num = np.zeros(numWords)  #分母初始化为0  词条总数p0Denom = 0.0; p1Denom = 0.0                            for i in range(numTrainDocs):#统计属于侮辱类的条件概率所需的数据,即P(w0|1),P(w1|1),P(w2|1)···if trainCategory[i] == 1:                            p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else: #统计属于非侮辱类的条件概率所需的数据,即P(w0|0),P(w1|0),P(w2|0)···              p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])p1Vect = p1Num/p1Denom       p0Vect = p0Num/p0Denom    #返回属于侮辱类的条件概率数组,属于非侮辱类的条件概率数组,文档属于侮辱类的概率     return p0Vect,p1Vect,pAbusive

运行结果如下,p0V存放的是每个单词属于类别0,也就是非侮辱类词汇的概率。比如p0V的倒数第6个概率,就是stupid这个单词属于非侮辱类的概率为0。同理,p1V的倒数第6个概率,就是stupid这个单词属于侮辱类的概率为0.15789474,也就是约等于15.79%的概率。我们知道stupid的中文意思是蠢货,难听点的叫法就是傻逼。显而易见,这个单词属于侮辱类。pAb是所有侮辱类的样本占所有样本的概率,从classVec中可以看出,一用有3个侮辱类,3个非侮辱类。所以侮辱类的概率是0.5。因此p0V存放的就是P(him | 非侮辱类) = 0.0833,P(is | 非侮辱类) = 0.0417,一直到P(dog | 非侮辱类) = 0.0417,这些单词的条件概率。同理,p1V存放的就是各个单词属于侮辱类的条件概率。pAb就是先验概率。

然后对于这个算法我们提出一个新的优化算法 因为在正常情况下概率很难为0,所以我们对初始值进行一些改变 这一会对我们算法效果更好一些

def trainNB1(trainMatrix, trainCategory):"""训练数据优化版本:param trainMatrix: 文件单词矩阵:param trainCategory: 文件对应的类别:return:"""# 总文件数numTrainDocs = len(trainMatrix)# 总单词数numWords = len(trainMatrix[0])# 侮辱性文件的出现概率pAbusive = sum(trainCategory) / float(numTrainDocs)# 构造单词出现次数列表# p0Num 正常的统计# p1Num 侮辱的统计p0Num = ones(numWords)#[0,0......]->[1,1,1,1,1.....]p1Num = ones(numWords)# 整个数据集单词出现总数,2.0根据样本/实际调查结果调整分母的值(2主要是避免分母为0,当然值可以调整)# p0Denom 正常的统计# p1Denom 侮辱的统计p0Denom = 2.0p1Denom = 2.0for i in range(numTrainDocs):if trainCategory[i] == 1:# 累加辱骂词的频次p1Num += trainMatrix[i]# 对每篇文章的辱骂的频次 进行统计汇总p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])p1Vect = log(p1Num / p1Denom)p0Vect = log(p0Num / p0Denom)return p0Vect, p1Vect, pAbusive

使用算法: 对社区留言板言论进行分类 并且测试

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):# 将乘法转换为加法 使用优化算法 之前的乘法换成log之后直接用加法就可以#乘法:P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C)/P(F1F2...Fn)#加法:P(F1|C)*P(F2|C)....P(Fn|C)P(C) -> log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C))# p1 = reduce(lambda x,y:x*y, vec2Classify * p1Vec) * pClass1                #对应元素相乘# p0 = reduce(lambda x,y:x*y, vec2Classify * p0Vec) * (1.0 - pClass1)p1 = sum(vec2Classify * p1Vec) + log(pClass1) # P(w|c1) * P(c1) ,即贝叶斯准则的分子p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) # P(w|c0) * P(c0) ,即贝叶斯准则的分子·print('p0:',p0)print('p1:',p1)if p1 > p0:return 1else: return 0

我们测试了两个词条,在使用分类器前,也需要对词条向量化,然后使用classifyNB()函数,用朴素贝叶斯公式,计算词条向量属于侮辱类和非侮辱类的概率。运行结果如下:

机器学习实战4.2 朴素贝叶斯案例:屏蔽社区留言板的侮辱性言论相关推荐

  1. 《机器学习实战》-04 朴素贝叶斯

    说明: 作业的所有代码都要基于Python3 学习大纲:https://blog.csdn.net/qq_34243930/article/details/84669684 (所有计划均在学习大纲里) ...

  2. 机器学习实战3(朴素贝叶斯篇)

    目录 1.朴素贝叶斯 2.朴素贝叶斯算法实例1--文档分类 3.朴素贝叶斯算法实例2--过滤垃圾邮件 1.朴素贝叶斯 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资. ...

  3. 机器学习实战读书笔记--朴素贝叶斯

    1.朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法, 最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model, ...

  4. 【python和机器学习入门3】朴素贝叶斯1——过滤恶意留言

    参考博客:朴素贝叶斯基础篇之言论过滤器 (po主Jack-Cui,<--大部分内容转载自 参考书籍:<机器学习实战>--第四章4.5 一 朴素贝叶斯理论 二 demo:过滤网站恶意留 ...

  5. 《机器学习实战》基于朴素贝叶斯算法实现垃圾邮件分类

    import random import sys import numpy as np import pandas as pd from pandas import Series, DataFrame ...

  6. 六、朴素贝叶斯案例分析

    1.朴素贝叶斯案例分析 朴素贝叶斯案例分析的内容有: 项目概述:屏蔽社区留言板的侮辱性言论 项目实战:朴素贝叶斯案例的实现 数据集信息 朴素贝叶斯案例的数据包含6条样本,具体有3个正样本和3个负样本, ...

  7. 【阿旭机器学习实战】【11】文本分类实战:利用朴素贝叶斯模型进行邮件分类

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文主要介绍如何使用朴素贝叶斯模型进行邮件分类,置于朴素贝叶斯模型的原理及分类,可以参考我的上一篇 ...

  8. 【机器学习入门】(2) 朴素贝叶斯算法:原理、实例应用(文档分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍python机器学习中的朴素贝叶斯算法.内容有:算法的基本原理:案例实战--新闻文档的分类预测. 案例简介:新闻数据有20个主题,有10万多篇文章,每篇文章对应不同的主题, ...

  9. 【机器学习入门】(3) 朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)附python完整代码及数据集

    各位同学好,今天我和大家分享一下朴素贝叶斯算法中的三大模型.在上一篇文章中,我介绍了朴素贝叶斯算法的原理,并利用多项式模型进行了文本分类预测. 朴素贝叶斯算法 -- 原理,多项式模型文档分类预测,附p ...

最新文章

  1. win10键盘全部没反应_Win10笔记本键盘失灵怎么办 Win10键盘失灵解决方法【详解】...
  2. LSPCI具体解释分析
  3. 基础的互联网连接词汇—Vecloud微云
  4. git Rebase 变基 教程
  5. mysql类 php100_PHP100中,制作自己的PHP.MYSQL类中:Access denied for user ''@'localhost' (using password: NO)...
  6. imageio.ffmpeg.download() has been deprecated. Use 'pip install im ageio-ffmpeg' instead.'
  7. k8s服务器修改ip,[转载][K8S] Kubernetes 集群变更IP地址
  8. FPGA异步复位设计代码
  9. rf连oracle版本一致,Navicat premium连不上Oracle的问题解决
  10. 武魂觉醒s系列服务器,斗罗大陆武魂觉醒斗罗大陆9服开服时间表_斗罗大陆武魂觉醒新区开服预告_第一手游网手游开服表...
  11. NSIS:强制结束软件进程
  12. DDoS 攻击次数和攻击流量
  13. C++中的LPVOID数据类型
  14. 最新搜狗收录提交工具分享
  15. Ubuntu18.04 Deb 包安装方法
  16. wamp mysql使用方法_wamp使用方法【总】
  17. Vim指令对应的英语全称
  18. 对数の学习笔记(一)
  19. IDEAidea背景设置
  20. Android 讯飞离线语音听写/离线语音识别SDK

热门文章

  1. 微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
  2. 权限管理设计之菜单权限
  3. 三星watch3测量血压和心电图
  4. 公司企业常见部门名称英译
  5. jss基础ximnd导图(思维导图)
  6. 高效教练培训员工的十六字箴言
  7. Electron 添加桌面图标
  8. 3个月时间,5名黑客找出苹果55个漏洞,赚了5万多美元,还写了篇博客记录全程
  9. 物联网让建筑更“聪明”
  10. java实验报告4继承与多态_接口与继承系列教材 (四)- 什么是Java的多态?