机器学习---朴素贝叶斯分类器的实现(对文本进行侮辱性言论和非侮辱性言论的分类)

news2024/11/27 20:40:04

1. loadDataSet函数

import numpy as np

# 构造loadDataSet函数用于生成实验样本
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

简单的数据加载函数,用于生成一个实验样本。函数 loadDataSet 返回两个列表,postingList 包含

了一些文本数据,classVec 包含了这些文本数据对应的类别标签。postingList 包含了6个子列表,

每个子列表代表一条文本数据,而 classVec 包含了这些文本数据对应的类别标签,其中1表示侮辱

性言论,0表示正常言论。

2. 词汇表生成函数creatVocabList

#构建词汇表生成函数creatVocabList
def createVocabList(dataSet):
    vocabSet=set([]) # 1 1 1 1 和1 1
    for document in dataSet:
        vocabSet=vocabSet|set(document) #取两个集合的并集
    return list(vocabSet)

函数首先创建了一个空集合 vocabSet,然后遍历输入的文本数据集 dataSet 中的每个文档

document。对于每个文档,它将文档中的单词转换为集合,并将这个集合与 vocabSet 取并集,这

样就能逐步地将所有文档中出现的单词整合到 vocabSet 中。最后,函数将 vocabSet 转换为列表

并返回,这样就得到了整个文本数据集中出现的所有单词构成的词汇表。

3. 词集模型setOfWords2Vec

#词集模型
def setOfWords2Vec(vocabList,inputSet):
    returnVec=np.zeros(len(vocabList)) #生成零向量的array
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]=1 #有单词,则该位置填充0
        else: print('the word:%s is not in my Vocabulary!'% word)
    return returnVec #返回全为0和1的向量

函数接受两个参数,vocabList 是词汇表,inputSet 是待转换的文本数据。首先,函数创建了一个

长度为词汇表长度的全零数组 returnVec,用于存储文本数据的词向量。然后,函数遍历输入的文

本数据 inputSet 中的每个单词 word,如果这个单词在词汇表 vocabList 中,就将 returnVec 中对

应位置的值设为1,表示该单词在文本数据中出现了。如果单词不在词汇表中,就打印一条警告信

息。最后,函数返回生成的词向量 returnVec,它是一个由0和1组成的向量,表示了文本数据中每

个单词在词汇表中的出现情况。这种词集模型的词向量表示方法只记录了每个词是否出现,不考虑

词出现的次数。

4. 词袋模型

#词袋模型
def bagOfWords2VecMN(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]+=1
    return returnVec #返回非负整数的词向量

函数接受两个参数,vocabList 是词汇表,inputSet 是待转换的文本数据。首先,函数创建了一个

长度为词汇表长度的全零列表 returnVec,用于存储文本数据的词向量。然后,函数遍历输入的文

本数据 inputSet 中的每个单词 word,如果这个单词在词汇表 vocabList 中,就将 returnVec 中对

应位置的值加1,表示该单词在文本数据中出现了一次。如果单词不在词汇表中,则忽略。最后,

函数返回生成的词袋模型的词向量 returnVec,它是一个由非负整数组成的向量,表示了文本数据

中每个单词在词汇表中的出现次数。

listPosts,listClasses=loadDataSet()
myVocabList=createVocabList(listPosts)
print(myVocabList) # 输出词表
returnVec = setOfWords2Vec(myVocabList, listPosts[0])
print(returnVec) # 对输入的词汇表构建词向量,使用词集模型
returnVec = bagOfWords2VecMN(myVocabList, listPosts[0])
print(returnVec) # 对输入的词汇表构建词向量,使用词袋模型

5. 运用词向量计算概率trainNB1

# 运用词向量计算概率
def trainNB1(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWord=len(trainMatrix[0])
    pAbusive=sum(trainCategory)/len(trainCategory) # 3/6
    p0Num=np.ones(numWord);p1Num=np.ones(numWord)# 初始化为1
    p0Demon=2;p1Demon=2 #初始化为2
    for i in range(numTrainDocs):
        if trainCategory[i]==0:
            p0Num+=trainMatrix[i]
            p0Demon+=sum(trainMatrix[i])
        else:
            p1Num+=trainMatrix[i]
            p1Demon+=sum(trainMatrix[i])
    p0Vec=np.log(p0Num/p0Demon) #对结果求自然对数
    p1Vec=np.log(p1Num/p1Demon) #对结果求自然对数
    return p0Vec,p1Vec,pAbusive

首先,我们统计了训练集中的文档数目 numTrainDocs 和词汇表的长度 numWord。然后,我们计

算了侮辱性言论的概率 pAbusive,即侮辱性言论所占的比例。接下来,我们初始化了两个向量

p0Num 和 p1Num,它们的长度都是词汇表的长度,并且将所有元素初始化为1。同时,我们初始

化了两个变量 p0Demon 和 p1Demon,它们的初始值都是2。然后,我们遍历训练集中的每个文

档,统计了属于侮辱性言论和非侮辱性言论的词向量分别出现的次数,并分别累加到 p0Num 和

p1Num 中,同时也统计了属于侮辱性言论和非侮辱性言论的词向量总数,并分别累加到 p0Demon

和 p1Demon 中。最后,我们计算了属于非侮辱性言论和侮辱性言论的条件概率向量 p0Vec 和

p1Vec,并对结果取了自然对数。最终,函数返回了 p0Vec、p1Vec 和 pAbusive,它们分别表示

了属于非侮辱性言论的条件概率向量、属于侮辱性言论的条件概率向量和侮辱性言论的先验概率。

6. 构建分类函数classifyNB 

# 计算文档在各类中的概率,取较大者作为该文档的分类,所以构建分类函数classifyNB
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    # 说明: p1=sum(vec2Classify*p1Vec)+log(pClass1) 的数学原理是ln(a*b)=ln(a) +ln(b)
    p1=sum(vec2Classify*p1Vec)+np.log(pClass1) 
    p0=sum(vec2Classify*p0Vec)+np.log(1-pClass1)
    if p1>p0:
        return 1
    else:
        return 0

首先,代码计算了给定文档向量属于侮辱性言论的概率 p1,这里使用了朴素贝叶斯分类器的数学

原理,通过求取对数的方式将连乘转换为累加,避免了浮点数下溢问题。接着,代码计算了给定文

档向量属于非侮辱性言论的概率 p0,同样使用了对数的方式进行计算。最后,代码比较了 p1 和

p0 的大小,如果 p1 大于 p0,则返回1,表示文档属于侮辱性言论;否则返回0,表示文档属于非

侮辱性言论。

贝叶斯定理:

7. 测试分类函数testingNB 

# 构造几个样本,来测试分类函数
def testingNB():
    listPosts,listClasses=loadDataSet() # listPosts:feature, listClasses:label
    myVocabList=createVocabList(listPosts) # 转换 I am a Chinese  构造词典
    trainMat=[]
    for postinDoc in listPosts:
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc)) # 转换后的词表
    p0V,p1V,pAb=trainNB1(trainMat,listClasses) # 训练
    testEntry=['love','my','dalmation']
    thisDoc=setOfWords2Vec(myVocabList,testEntry)# 转换测试语句词表
    print(testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb)) # 预测
    testEntry=['stupid','garbage']
    thisDoc=np.array(setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))

testingNB()

首先,代码调用了 loadDataSet 函数加载数据集,得到了文本数据列表 listPosts 和类别标签列表

listClasses。接着,代码调用了 createVocabList 函数,将文本数据列表转换为词汇表

myVocabList。然后,代码初始化了一个空列表 trainMat,用于存储训练集的词向量表示。接着,

代码遍历文本数据列表 listPosts,将每条文本数据转换为词向量,并添加到 trainMat 中。接下

来,代码调用了 trainNB1 函数,对训练集进行训练,得到了分类器的参数 p0V、p1V 和 pAb。然

后,代码构造了两个测试样本 testEntry,分别是 ['love','my','dalmation'] 和 ['stupid','garbage'],并

将它们转换为词向量表示 thisDoc。最后,代码调用了 classifyNB 函数,对测试样本进行分类,并

打印出分类结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1286807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计)

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计) 1、时间:2005-2021年 2、指标:省、市、年份、一级指标、关键词、关键词词频、总词频 3、范围:270个地级市 4、来源:地级市政府工作报告…

卡通渲染总结《二》

关于技术的方面,一方面就是其轮廓边缘检测: 主要的方法可以被分为基于图片空间和对象空间,对象空间比图片空间会多一些立体坐标位置的信息。 轮廓类型分类 首先我们顶一下轮廓是什么,从一个视角看去如果一条边相邻的两个面其恰…

python自动化测试之破解滑动验证码

在Web自动化测试的过程中,经常会被登录的验证码给卡住,不知道如何去通过验证码的验证。 一般的情况下遇到验证码我们可以都可以找开发去帮忙解决,关闭验证码,或者给一个万能的验证码! 那么如果开发不提供帮助的话&…

金蝶云星空单据编辑界面,不允许批量填充操作

文章目录 金蝶云星空单据编辑界面,不允许批量填充操作案例演示开发设计测试 金蝶云星空单据编辑界面,不允许批量填充操作 案例演示 售后单,明细信息单据体,物料编码字段禁止批量填充。 开发设计 编写表单插件,在Be…

【C++】POCO学习总结(九):网络

【C】郭老二博文之:C目录 1、Poco::Net::IPAddress IP地址 Poco::Net::IPAddress类存储IPv4或IPv6主机地址。 Poco::Net::IPAddress可以从字符串解析,也可以格式化为字符串。支持IPv4格式(d.d.d.d)和IPv6格式(x: x: x: x: x: x: x: x)。 常用函数&…

行业内卷严重到什么程度了?

一.内卷现状 最近大家都吐槽找工作难,确实很难。 不得不说,现在找工作的难度是以前的很多倍。甚至可以说地狱级都不为过。 以前只要简历一挂到网上,就有很多电话打过来。特别是在一线城市,各种类型企业的HR都来找,希…

《opencv实用探索·十》opencv双边滤波的简单理解

1、引言 OpenCV中的双边滤波(Bilateral Filtering)是一种保持边缘清晰的滤波方法,它考虑像素的空间关系和像素值之间的差异。双边滤波对于去除噪声的同时保持图像的边缘非常有效,它也是一种非线性滤波。 双边滤波采用了两个高斯滤…

获取网络ppt资源

背景: ​ 某度上有很多优质的PPT资源和文档资源,但是大多数需要付费才能获取。对于一些经济有限的用户来说,这无疑是个遗憾,因为我们更倾向于以免费的方式获取所需资源。 解决方案: ​ 然而,幸运的是&am…

vivado如何进行增量编译

情况1 如果是根据 placement 或者 routing 进行增量编译,直接右键点击要跑的 implement,,选择set incremental implement , 然后选第二项,指定 要参考的 routing.dcp 或者 placement.dcp 的路径即可 情况2 如果只参考 synthesis …

西工大计算机学院计算机系统基础实验一(环境配置)

首先,不要焦虑,稳住心态慢慢来,一点一点做,跟着作者把基础打好,比什么都重要。作者曾经经历过这份痛苦,知道它有多么不好受。当初的作者高中之前甚至都没有自己的一台笔记本,上了大学以后学C语言…

设计模式:装饰者模式

目录 一、定义 二、场景 三、例子 四、优缺点 优点: 缺点: 一、定义 在不改变已有对象结构的情况下,动态添加新的功能到对象上,是继承的一种替代方案。属于结构型模式。 二、场景 1.扩展一个类的功能,添加附加职责…

Python如何传递任意数量的实参及什么是返回值

Python如何传递任意数量的实参 传递任意数量的实参 形参前加一个 * ,Python会创建一个已形参为名的空元组,将所有收到的值都放到这个元组中: def make_pizza(*toppings):print("\nMaking a pizza with the following toppings: "…

【部署】预处理和后处理加速方案:CVCuda

预处理 和 后处理加速方案大概可以包括以下几种 (1)nvidia开源的CVCuda (2)使用opencv4的cuda加速模块 (3)手写cuda算子 这一章我们先从CVCuda开始 一.基本要求 1.1 何时可以使用CVcuda库 在模型的 预…

SpringBoot_02

Web后端开发_07 SpringBoot_02 SpringBoot原理 1.配置优先级 1.1配置 SpringBoot中支持三种格式的配置文件: application.propertiesapplication.ymlapplication.yaml properties、yaml、yml三种配置文件,优先级最高的是properties 配置文件优先级…

【前端开发】每一位高级Web工程师都应该掌握的10个Web API!

Photo by Hisu lee on Unsplash JavaScript中的某些API的使用率可能相对较低。下面我们将逐一介绍它们的使用和使用场景。 Blob API Blob API用于处理二进制数据,可以轻松地将数据转换为Blob对象或从Blob对象读取数据。 // Create a Blob object const myBlob …

【Vulnhub 靶场】【hacksudo: FOG】【简单 - 中等】【20210514】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hacksudo-fog,697/ 靶场下载:https://download.vulnhub.com/hacksudo/hacksudo-FOG.zip 靶场难度:简单 - 中等 发布日期:2021年05月14日 文件大小:1.3 GB 靶场作…

Centos7 制作Openssh9.5 RPM包

Centos7 制作Openssh9.5 RPM包 最近都在升级Openssh版本到9.3.在博客里也放了openssh 9.5的rpm包. 详见:https://blog.csdn.net/qq_29974229/article/details/133878576 但还是有小伙伴不停追问这个rpm包是怎么做的,怕下载别人的rpm包里被加了盐. 于是做了个关于怎么用官方的o…

15.(vue3.x+vite)组件间通信方式之默认插槽(匿名插槽)

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 默认插槽(匿名插槽) 插槽 slot 通常用于两个父子组件之间,最常见的应用就是我们使用一些 UI 组件库中的弹窗组件时,弹窗组件的内容是可以让我们自定义的,这就是使用了插槽的原理。 (1)slot 是 Vue中的内置标签…

vmware ubuntu22 访问github

1.虚拟机选NAT模式。 2.firefox找到下图setting。 3.选第四个,填主机ip和局域网代理的端口号。 4. 此时你应该能访问github了。

JAVA 线程池,及7大参数,4大拒绝策略详解

为什么要使用线程池 线程的生命周期:运行、就绪、运行、阻塞、死亡 下面是一个简单的创建多线程的方法。注意:工作中不可取。 创建线程的时候,我们避不开线程的生命周期。上面的方法虽然可以创建多线程,但是创建完成后&#xff0c…