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

news2024/11/17 5:36:51

目录标题

  • 一、什么是朴素贝叶斯?
  • 二、利用朴素贝叶斯进行情感分析
    • 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/504604.html

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

相关文章

电容笔哪个厂家的产品比较好?苹果平板的电容笔推荐

从目前来说,这个苹果的正版电容笔,售价真的是太贵了,一支就要接近上千元。事实上,对于那些没有很多预算的人来说,平替电容笔是一个很好的选择。一支苹果电容笔,价格是四支平替电容笔的四倍,但平…

机器人控制系统学习和研究中数学的重要性

其实具备科学思维的方式非常非常难,很多情况下脑海中并非客观事实,而是充满了幻觉。 如果在各种AI工具中问及这样的问题,会得到类似如下回复: 机器人控制系统学习和研究中数学的重要性主要体现在以下几个方面: 机器人运…

C961W扫描枪

影像解码技术,微米级条码,轻松扫描 百万像素引擎,擅长读取制造业遇到的高密度,微小尺寸条码。 ≥3mil读码密度,准确解码。 一、产品简介 C961W是一款基于先进影像解码技术和微功率无线跳频传输技术的无线高性能、高…

Java入门 - 内含Java基础,Java高级

Java基础入门 - 内含Java基础,Java高级 Java 基本介绍Java 学习须知Java 学习文档Java 基础Java 基础语法Java 对象与类Java 基本数据类型Java 变量类型Java 修饰符Java 运算符Java 循环结构Java 条件语句Java switch caseJava 数组Java 日期与时间Java 正则表达式J…

好的索引当然是要覆盖了!

如果你的查询中用到了索引,这是一个进步,如果能够更进一步,用到了覆盖索引,那么就更牛了!当我们设计一个索引的时候,如果能够从一个更加全面的角度去设计这个索引,不仅考虑到 where 中的条件&am…

大数据处理技术:从Hadoop到Spark的演进和比较

在过去的十年中,大数据技术的发展突飞猛进,各种开源大数据处理框架层出不穷,其中Hadoop和Spark是最受欢迎的两个框架。Hadoop是最早的开源大数据处理框架之一,而Spark则是在Hadoop之后出现的,它在内存计算和数据处理方…

for...in的用法

一、for…in的用法 1.用于对象的迭代,迭代除了Symbol属性外的可枚举的属性,包括继承的可枚举的属性(可以用于遍历数组,但不建议这么用); const obj {a: 1,b: 2,c: 3,fn: function () {} }obj[Symbol()] …

Vite 的安装和基本使用

注意:Vite 本身也是依赖 Node.js 的,所以也需要安装好 Node 环境,并且 Vite 要求 Node 的版本要大于等于 12 版本。 下面,我们不会按照 Vite 官方文档中那样直接用 Vite 的脚手架搭建出一个完整的项目(npm init vitela…

面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们,欢迎来到万猫学社!在这里,我将和大家分享ChatGPT提示词工程的系列文章,希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料,比如那些“每个人都必须知道的30个…

服务(第十八篇)mysql-索引、事务、存储引擎

索引: 相当于一本书的目录。 作用:①对字段进行升序排序 ②加快表的查询速度 副作用:①索引会额外占用磁盘空间 ②更新有索引的表效率很慢 使用场景: ①在没有索引查询某行数据,需要扫描全表定位到某行数据 ②有索…

【876. 链表的中间结点】

Leetcode 876. 链表的中间结点 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一…

第三章数据链路层

1.数据链路层的概述 1.0地位 数据链路层在网络体系结构中所处的地位 链路(Link)就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点。数据链路(Data Link)是指把实现通信协议的硬件和软件加到链路上,就构成了数据链路。数据链路层以帧…

Word中同一行文字 左边居左,右边居右,并且居右的文字加长也不换行

本文将的不是Java知识,是Word格式问题。 如图,想实现下面Word中,同一行文字红色框内的居左显示,蓝色框内的居右显示: 步骤: 1.选中要居右显示的文字,点击左上角的小直角标志,选择右…

FS2116A升压IC

FS2116A升压输出12V电流1.5A芯片IC,支持3.7V升压5V3.6A,3.7V升压9V2A,3.7V升压12V1.5A,和两串锂电池7.4V升压 6V3.6A,两串锂电池7.4V升压12V2.5A输出功率。支持宽输入电压,外围少,效率高。7.4V或者8.4V电压…

mysql的存储函数与存储过程

1. 存储过程概述 我们前面所学习的 MySQL 语句都是针对一个表或几个表的单条 SQL 语句,但是在数据库的实际操作中,经常会有需要多条 SQL 语句处理多个表才能完成的操作。例如,为了确认学生能否毕业,需要同时查询学生档案表、成绩…

什么是机房UPS?一文带您了解!

什么是机房UPS? 机房UPS是指专门为机房等大型计算机设施设计的不间断电源。它通常由高性能的电池组、充电器、逆变器、静态开关、监控系统和管理软件等组成,能够为计算机设备提供稳定、可靠的电源保障。 机房UPS的作用 机房UPS的作用主要是两方面: 1…

【负载均衡式的在线oj(2.oj_server模块)】

🎉实战项目:负载均衡式在线OJ 博主主页:桑榆非晚ᴷ 博主能力有限,如果有出错的地方希望大家不吝赐教 给自己打气:成功没有快车道,幸福没有高速路。所有的成功,都来自不倦地努力和奔跑&#xf…

rtl仿真器-verilator安装和测试

安装 查看官网安装说明页 https://verilator.org/guide/latest/install.html 1.ubuntu 源已经加好了,直接用命令安装 2. 编译源码安装: sudo apt-get install git perl python3 make autoconf g flex bison ccache sudo apt-get install libgoogle-perf…

FPN和PAN的内容及区别

FPN和PAN都是用于解决在目标检测中特征金字塔网络(FPN)在多尺度检测任务上的不足的方法。下面分别详细介绍一下它们的原理和区别。 FPN FPN全称Feature Pyramid Network,是由FAIR在2017年提出的一种处理多尺度问题的方法。FPN的主要思路是通过构建金字塔式的特征图…

Hadoop入门篇02---HDFS学习与简单使用

Hadoop入门篇02---HDFS学习与简单使用 存储系统概念认识硬盘,RAID小结 存储架构DAS,NAS,SAN对比 文件系统 大数据存储大数据存储面临的问题如何解决小结 HDFSHDFS的起源和发展HDFS的设计目标HDFS的应用场景HDFS的特性命令行实践常用命令 Java客户端API使…