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

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 函数,对测试样本进行分类,并

打印出分类结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JDK8升级11常见问题

JDK8升级11常见问题 1. 使用rt.jar/jce.jar情况 原代码&#xff1a; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><targe…

计算机网络入侵检测技术研究

摘 要 随着网络技术的发展&#xff0c;全球信息化的步伐越来越快&#xff0c;网络信息系统己成为一个单位、一个部门、一个行业&#xff0c;甚至成为一个关乎国家国计民生的基础设施&#xff0c;团此&#xff0c;网络安全就成为国防安全的重要组成部分&#xff0c;入侵检测技术…

CUDA简介——For循环并行化

1. 引言 前序博客&#xff1a; CUDA简介——基本概念CUDA简介——编程模式 kernel相关语法定义为&#xff1a; kernel函数定义&#xff0c;与常规C函数定义类似。不同之处在于&#xff0c;有__global__关键字。 为说明符&#xff0c;告诉编译器该函数应编译运行在device上&a…

Understanding Computer Hardware

文章目录 I. Input Devices1. Keyboard&#xff08;1&#xff09;Layout&#xff08;2&#xff09;Key Types&#xff08;3&#xff09;Functionality&#xff08;4&#xff09;Connectivity&#xff08;5&#xff09;Ergonomics&#xff08;6&#xff09;Multimedia Keys&…

伯俊软件CTO陈雨陆:R3全渠道业务中台的OceanBase落地实践

11 月 16 日&#xff0c;OceanBase 在京顺利举办 2023 年度发布会&#xff0c;正式宣布&#xff1a;将持续践行“一体化”产品战略&#xff0c;为关键业务负载打造一体化数据库。其中&#xff0c;“数字化转型升级实践专场”我们有幸邀请到伯俊软件 CTO 陈雨陆进行《OceanBase …

java easyPOI导出一对多数据,设置边框,字体,字体大小

java easyPOI导出一对多数据&#xff0c;设置边框&#xff0c;字体&#xff0c;字体大小 需求总是千奇百怪&#xff0c;解决的方式也可以是多种多样。 今天碰到导出excel是一对多结构的&#xff0c;以往导出的数据都是一条一条的&#xff0c;所以采用的是比较方便简单的方法eas…

全网最新最全面的Appium自动化:Appium常用操作之设备操作

设备基本操作 前置条件&#xff1a; 示例代码&#xff1a; from appium import webdriver # 导入appium 驱动包 # 1、定义一个DesiredCapabilities配置的字典 des {automationName:appium,platformName:Android, # 平台的名称&#xff0c;iOS,Android,FirefoxOSplatformV…

打开游戏提示缺少(或找不到)XINPUT1_3.DLL怎么解决

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是xinput1_3.dll丢失。那么&#xff0c;xinput1_3.dll是什么文件&#xff1f;它对电脑有什么影响&#xff1f;本文将详细介绍xinput1_3.dll丢失的原因以及五个详细的解决方法&#xff0c;帮助大家…

初识Protobuf与Protobuf的安装

目录 一、Protobuf 1.回顾序列化 2.Protobuf的特性 3.Protobuf的下载 ①ProtoBuf 在 window 下的安装 ②ProtoBuf 在 Linux 下的安装 一、Protobuf 1.回顾序列化 我们在先前的学习中也遇到过序列化。所谓序列化我的理解是&#xff0c;将复杂的对象以特定的方式转换以便于…

vue3-vite-ts:编写Rollup插件并使用 / 优化构建过程

一、vue3-vite-ts项目&#xff0c;编写Rollup插件并使用的意义 在使用Vue3 Vite TypeScript这种技术栈时&#xff0c;可以使用Rollup插件来优化构建过程&#xff0c;例如使用rollup-plugin-typescript2插件来编译TypeScript代码&#xff0c;使用rollup-plugin-vue插件来处理…

go-fastfds部署心得

我是windows系统安装 Docker Desktop部署 docker run --name go-fastdfs&#xff08;任意的一个名称&#xff09; --privilegedtrue -t -p 3666:8080 -v /data/fasttdfs_data:/data -e GO_FASTDFS_DIR/data sjqzhang/go-fastdfs:lastest docker run&#xff1a;该命令用于运…

基于深度学习YoloV8的火焰烟雾检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介YoloV8模型火焰烟雾检测系统模型训练实时检测 应用领域 二、功能三、系统四. 总结 一项目简介 # 基于深度学习YoloV8的火焰烟雾检测系统介绍 简介 深…

【Unity3D】Android打包报错AAPT2:xxx Linkxxx

Gradle Plugin 与Gradle版本不匹配问题 或 相关依赖库下载不完全问题&#xff1b; 使用镜像即可解决 也可以离线&#xff08;离线过于复杂 你能找到方法那最好是离线Maven) 仓库服务 找最新可用的镜像url&#xff0c;替换google()和jcenter()&#xff0c; 可以直接使用publ…

StoneDB-8.0-V2.2.0 企业版正式发布!性能优化,稳定性提升,持续公测中!

​ 11月&#xff0c;StoneDB 新版本如期而至&#xff0c;这一个月来我们的研发同学加班加点&#xff0c;持续迭代&#xff1a;在 2.2.0 版本中&#xff0c;我们针对用户提出的需求和做出了重量级更新&#xff0c;修复了一些已知和用户反馈的 Bug&#xff0c;同时对部分代码进行…

如何计算光伏电站的发电量?

光伏电站的发电量是衡量其性能和经济效益的关键指标。准确地预测和计算光伏电站的发电量对于投资决策、系统设计和优化至关重要。以下是一些计算光伏电站发电量的主要步骤和方法&#xff1a; 1、确定光伏电站的规模和配置 了解光伏电站的组件数量、类型、功率等级以及安装位置…

Win10点关机后马上又进入桌面解决方法

Win10点了关机&#xff0c;马上闪一下就又重新进入了桌面&#xff0c;关不了机怎么办&#xff1f;强制关机虽然是可行&#xff0c;但不能每一次都强制关机。下面给大家带来的win10不能关机的解决方法&#xff0c;希望能帮助到大家。 速印机&#xff08;理想、荣大等&#xff09…

用php和mysql制作一个网站

当使用PHP和MySQL制作网站时&#xff0c;我们可以利用PHP的强大功能来与MySQL数据库进行交互&#xff0c;从而实现动态网页的创建和数据存取。下面是一个关于如何使用PHP和MySQL制作网站的简单说明&#xff0c;以及一些示例代码。 ​ 1、R5Ai智能助手 chatgpt国内版本 :R5Ai智…

集成测试如何做?

今天学习下如何进行集成测试。 什么是集成测试? 集成测试被定义为一种测试类型&#xff0c;其中软件模块在逻辑上集成并作为一个组进行测试。一个典型的软件项目由多个软件模块组成&#xff0c;由不同的程序员编码。此级别测试的目的是在集成这些软件模块时&#xff0c;暴露…

羊大师带大家探寻,南北地区冬季饮食的差异

羊大师带大家探寻&#xff0c;南北地区冬季饮食的差异 南北地区的冬季饮食有着明显的不同。随着气温的骤降&#xff0c;人们的餐桌上也逐渐变得丰盛起来。精心准备的美食不仅温暖了身心&#xff0c;更能带来满满的幸福感。接下来&#xff0c;让小编羊大师带大家一起走进南北饮…

软件测试,缺少项目实战怎么办?

解决办法 你可以进行一个简单的web测试。 以我目前的认知和经验&#xff0c;悄悄告诉你&#xff1a;政府网站大概率会有bug。 在著此文时&#xff0c;我随便找了个地方政府网站&#xff0c;点了进去。 http://www.yibin.gov.cn/en/ybsq/201905/t20190513_976652.html 大家…