机器学习之朴素贝叶斯二、情感分析实践

news2024/11/27 3:41:01

目录标题

  • 一、什么是朴素贝叶斯?
  • 二、利用朴素贝叶斯进行情感分析
    • 1. 数据类别说明
    • 2. 什么是词袋模型
    • 3. 数据展示
    • 4. 利用词袋模型进行词表构建
    • 5. 到了这一步,我们的前期工作都已经准备好了,有了样本的向量化数据,开始进行 `朴素贝叶斯分类器构造`:
    • 6. 进行测试使用
  • 三、完整源码

一、什么是朴素贝叶斯?

朴素贝叶斯公式推导

二、利用朴素贝叶斯进行情感分析

结合之前的公式推导,进行代码编程,以情感分析为例,进行实践操作。
感受:都说算法离不开数学,真的是深有体会,就拿朴素贝叶斯来说,基于贝斯公式思想来进行算法处理,在进行训练和测试的时候,只要明白公式的推导,就能很清晰明白训练和测试过程。
本质上还是计算,根据先验概率条件概率求后验概率的操作。
不得不感慨数学真的神奇!!!

1. 数据类别说明

在这里插入图片描述

2. 什么是词袋模型

我们这里为了简化工作进行样本数据向量化使用的词袋模型

词袋模型是一种文本表示方法,将文本看作由单个词语组成的集合(即“袋子”),忽略其语法和顺序仅保留每个词出现的频率。在词袋模型中,文本可以表示为一个向量,其中每个维度对应一个词,向量的值表示该词在文本中出现的次数权重

具体来说,词袋模型包含以下几个步骤:

a. 分词:将文本划分为一个个单独的词语。

b. 构建词表:统计所有文本中出现过的不同的词语,并构建一个词表。

c. 编码:将每个文本表示为一个向量,向量的长度等于词表中词语的数量,每个维度表示一个词语,向量的值表示该词在文本中出现的次数或权重。

d. 应用机器学习算法:使用词袋模型表示的文本向量作为特征输入到机器学习算法中进行训练和预测。

e. 词袋模型的优点是简单有效,能够捕捉词语之间的共现关系,并且适用于各种自然语言处理任务,如文本分类、情感分析、信息检索等。缺点是忽略了词语之间的顺序和上下文关系,无法处理多义词和歧义词,并且不具备解释性。

3. 数据展示

这里使用简单代码进行说明数据的样式,和,数据打标情况
在这里插入图片描述

看下打印结果

在这里插入图片描述
可以看到,我们的样本中总共5条样本,打标情况分别为1,1,1,0,0,

4. 利用词袋模型进行词表构建

这一步是我们的重中之重,需要将我们的所有样本进行词表构建。
这词表中,每一个词都是唯一,具备唯一的ID,后面会说到,这种方式的一个重大缺陷:当我们的词表内容不丰富的时候,也就是说在我们进行模型测试的时候,测试语料的情感词在词表中不存在,就会导致,模型捕获不到样本的情感信息
因此,词表的构建十分重要!!!应尽可能丰富,但是过于庞大,那么在进行计算的时候将是一件十分恐怖的事情。这个问题随后再说。

在这里插入图片描述

在这里插入图片描述
构造词表后的结果打印:

在这里插入图片描述

结果如下:

在这里插入图片描述

5. 到了这一步,我们的前期工作都已经准备好了,有了样本的向量化数据,开始进行 朴素贝叶斯分类器构造

在这里插入图片描述

首先进行公式操作

在这里插入图片描述
接着传入数据进行计算

def train(data,label):
    '''
    :param data: 这里的数据是样本经过向量化后的向量信息
    :param label:  样本所对应的标签信息
    :return:
    1. vec_0 --- 开心的条件概率组
    2. vec_1 --- 伤心的条件概率组
    3. simple_1 --- 样本数据属于伤心的概率
    '''
    num_simple = len(data) #样本的数量
    num_words = len(data[0]) #统计每个样本的词的数据量

    simple_1 = sum(label)/float(num_simple)  #计算的是伤心的
    '''
    这里说明一下,为什么使用的是sum(label) 来进行计算:
    正常这里应该是,属于伤心的样本数据/总的样本数
    那么我们这里用sum的效果就是,伤心样本的数量,因为伤心
    的label为1,开心为0,所有label的和就是,伤心的数量
    这里取巧了。
    '''
    # 进行条件概率数组初始化
    array_0,array_1 = np.zeros(num_words),np.zeros(num_words)
    _0 = 0.0
    _1 = 0.0 #这里是多求条件概率的分母进行初始化,至于怎么用后面说

    #todo 对所有伤心的样本进行计算条件概率
    for i in range(num_simple):
        if label[i] == 1: #伤心
            array_1 += data[i]
            _1 += sum(data[i])
        else: #开心
            array_0 += data[i]
            _0 += sum(data[i])

    vec_0 =  array_0/_0
    vec_1 =  array_1/_1
	'''
	在计算样本 x 属于某个类别 C 的后验概率时,朴素贝叶斯假设各个特征之间相互独立,即 
	p(x|C) = p(x1|C)p(x2|C)...p(xn|C),其中 x1, x2, ..., xn 分别是特征向量的不同维
	度。这个假设简化了计算过程,但是忽略了特征之间的相关性。	
	根据贝叶斯公式,朴素贝叶斯可表示为: p(C|x) = p(x|C)p(C)/p(x) 其中,p(x|C) 表示在类
	别 C 下特征向量 x 出现的概率,p(C) 表示类别 C 的先验概率,p(x) 表示特征向量出现的概
	率。由于对于所有类别都是相同的,所以可以省略分母 p(x)

	可以看到vec_0 =  array_0/_0计算的就是p(x|C) = p(x1|C)p(x2|C)...p(xn|C)
	也就是当是开心样本的时候,是特征 X 的概率。
	array_0,中的每一个维度就是一个特征,那么array_0将所有开行样本中的数据相加,也就计算出了,每个特征发生次数。那么就可以计算,当开心label时候,特征X发生的概率。即 每个特征发生次数/总的样本发生次数
	_0 计算的就是,开心样本数据中,总的样本发生次数。
	'''

    return vec_0,vec_1,simple_1

来看下打印结果的展示

在这里插入图片描述

可以看到,计算的结果,我都用红色箭头指向了,结果还是明确的。

:return:
1. vec_0 --- 开心的条件概率组
2. vec_1 --- 伤心的条件概率组
3. simple_1 --- 样本数据属于伤心的概率

这三者就是我们最终训练的产物,用于我们后续的测试:

6. 进行测试使用

#todo  对测试样例进行向量化并且进行使用
def test():
    postingList, classVec = loadData()
    #词表
    my_voc = createVocabList(postingList)
    #训练数据
    train_data = []
    for i in postingList:
        train_data.append(wordVec(my_voc,i))
    vec_0,vec_1,simple_1 = train(train_data,classVec)

    test_01 = ["中奖","了","开心"]
    #todo 开始进行测试
    test_simple_01 = np.array(wordVec(my_voc,test_01))
    res = prod_fun(test_simple_01, vec_0, vec_1, simple_1)
    if prod_fun(test_simple_01,vec_0,vec_1,simple_1):
        print(f"{test_01}预测标签为:开心{res}")
    else:
        print(f"{test_01}预测标签为:伤心{res}")

    test_02 = ["表白","失败","很","痛苦"]

    #todo 开始进行测试
    test_simple_02 = np.array(wordVec(my_voc,test_02))
    res = prod_fun(test_simple_02, vec_0, vec_1, simple_1)
    if prod_fun(test_simple_02,vec_0,vec_1,simple_1):

        print(f"{test_02}预测标签为:开心{res}")
    else:
        print(f"{test_02}预测标签为:伤心{res}")

最后的打印结果

在这里插入图片描述
最后我们看到,在进行分类的时候没有,准确的进行分类,这里还需要进行进一步优化。这里先不讨论,下篇文章我在学习使用。

三、完整源码

完整源码

参考

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

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

相关文章

2023年北京.NET线下技术沙龙来了!大咖分享,还有精品好礼等你

MASA技术团队来北京啦! 为了与北京的.NET开发者们更深入的交流学习,我们将在北京市举办一场.NET线下技术沙龙。同时也是希望通过举办这样的线下沙龙,让更多的.NET开发者了解我们,加入.NET开源技术生态,向更多的.NET开…

SpringCloud-服务间通信OpenFeignRibbon

服务间通信&OpenFeign&Ribbon 一、服务间通信1.创建两个服务并注册到服务中心1.1.服务添加相关依赖1.2.编写配置文件application.yml1.3.入口类加上注解启动Eureka Client 2.Product服务中提供调用方法3.User服务中使用RestTemplate调用 二、负载均衡及Ribbon组件1.负载…

《三》包管理工具

包管理工具 npm: npm:Node Package Manager,Node 包管理器,目前已经不仅仅作为 Node 的包管理工具,也作为前端的包管理工具来管理包。 npm 管理的包是存放在一个名为 registry 的仓库中的,发布一个包时是…

AI歌手——超简单一键运用ACE Studio来训练模拟真人唱歌

目录 1.安装ACE Studio 2.打开ACE Studio 3.导入midi或音频 4.调试音频 5.调整人物音色音高 6.调整歌词 7.自动添加呼吸​编辑 8.成品演示(周杰伦の稻香——鲤阮) 1.安装ACE Studio 安装地址 ACE Studio | Create Limitless Vocals with AI (t…

如何用AI画56个民族的女孩!

大家好,我是菜鸟哥! 目前在带领600多个小伙伴一起玩AI!Chatgpt现在是最火最出圈的产品,而一旦文字和图像,声音,视频结合可以演化出很多很多的需求。前面我们公众号已经分享了很多很多关于chatgpt的使用和技…

大势智慧软硬件技术答疑第二期

1. 编辑模型视图为什么是空的呢?工程这里也选了obj数据位置。 答:CtrlT选择下瓦块就可以,或者点这个图标。 2. 支持编辑DSM 生成正射吗? 答:重建大师,模方,和dasview均支持直接生产正射和DSM&a…

idea-properties文件编码为iso-8859-1修改为utf-8

一、现状 idea中properties文件编码为iso-8859-1并且为灰色不可修改 二、修改成utf-8 command,打开preferences 如下图操作即可

机器学习——logit正则化

机器学习——logit正则化 文章目录 机器学习——logit正则化[toc]1 logit模型正则化2 logit回归求解器2.1 ℓ 1 \ell_1 ℓ1​和 ℓ 2 \ell_2 ℓ2​正则化2.2 e l a s t i c − n e t elastic-net elastic−net正则化 1 logit模型正则化 logit模型能实现分类,识别…

励志长篇小说《周兴和》书连载之四 屋漏偏遇连天雨

屋漏偏遇连天雨 周兴和的母亲就死于那个寒冷的冬天。 她死时是1969年农历正月十八的早晨。 这时,周兴和的大女儿刚出生40多天。 母亲的病其实已经拖了好长时间了。刚开始她还能起床给一家人做饭,干点轻微的家务事。渐渐地,她开始不能吞食东…

如何成为年薪70万的全栈开发和测试人员?必备技能一网打尽

目录 引言 什么是全栈开发人员? 为什么需要全栈开发人员? 成为Full Stack Developer所需的技能组合 什么是软件栈? LAMP栈 MERN是基于JavaScript的技术的集合: Full Stack Developer的职责 技术的准备 一、测试基础 二…

面试官常问的音视频技术点!

一、前言: 今天继续给大家分享最近星球上的星友音视频面试题目,希望对大家有用! 下面是具体面试问的问题: 二、面试题目: 1、请说下H264的两种形态: Annex B格式:这种格式常用于网络流媒体传输…

yum源下载,及安装本地rpm包

yum源下载: yumdownloader rpm包名 如 :要下载 关于 pcre2-devel的包, 发现需要 依赖: Downloading packages: (1/4): pcre2-10.23-2.el7.x86_64.rpm | 20…

架构师备战(一)-软考如何备考

我要备战的是系统架构设计师,那么软考有哪些可供我们选择的考试呢。 1、软考能考哪些 我们知道,软考的体系结构有很多,比如初级的程序员,中级的软件设计师,高级的系统架构师等。具体有哪些,大概有如下这些…

华硕ROG STRIX B760-G GAMING WIFI小吹雪D5评测:最能超的小主板 轻松提升14%

一、前言:华硕推出新版B760-G小吹雪主板 加入DDR5内存支持 和以往的每一代规格一样,DDR5内存上市初期的表现并不如人意,频率是高了,但延迟也高了,导致性能提升一般般。 经过一两年的演进,DDR5内存的时序延迟…

港联证券|熊市牛市出现的原因?出现时应该怎么办?

熊市和牛市是股市专业术语,都指的是股市的一种形式。那么熊市牛市出现的原因?出现时应该怎么办?下面就由港联证券为大家进行分析: 熊市牛市出现的原因? 熊市出现原因: 1、市场利空消息出现 比如公司业绩…

【Spring框架全系列】SpringBoot配置日志文件

🍧🍧哈喽,大家好,我是小浪。那么上篇博客我们学习了SpringBoot配置文件的相关操作,本篇博客我们将学习一个新的知识点,SpringBoot日志文件。🖥🖥 📲目录 一、日志是什么…

Git概念介绍,常用命令与工作流程整理 配图

首先附一张Git的cheat sheet 作为开始,方便查阅:https://education.github.com/git-cheat-sheet-education.pdf Git简介 Git大家肯定都不陌生了,象征性地再介绍一下:Git是一个版本控制系统,换句话说,它可…

TypeError: makedirs() got an unexpected keyword argument ‘exist_ok‘

背景: 自己在使用pyinstaller打包一个基于pyqt5的gan网络手写数字生成的项目的时候,打包过程中出现这个错误导致打包失败。 图示: 问题分析: 复制这个错误在百度上搜看到很多答案说是python版本的原因。2.7版本的python不支持…

Redis如何存储一个Java对象【内涵案例】

目录 Java原生序列化示例 GSON示例 使用fastjson存储Java对象到Redis时 Redis并不能直接存储Java对象,需要进行序列化或者转换成字符串等格式才可以进行存储。以下介绍两种常见的将Java对象存储到Redis的方案。 对象序列化,存储二进制数据 将对象进…

使用Chatglm-6b微调催收问答对的尝试

1.工作目录,如:mnt/d/work,下载源代码,并安装依赖 git clone https://github.com/THUDM/ChatGLM-6B cd ChatGLM-6B pip install -r requirement.txt 2. 从拥抱脸下载chatglm-6b-int4-qe到本地(GPU环境搭建参考浪潮服…