机器学习进行情感分析(上)

news2025/1/15 12:49:41

目录

  • 一、 绪论
  • 二、 数据处理
    • 1. 构建CSV文档
    • 2. 构建模型前的思考
      • 2.1. 问题
      • 2.2. 解决方法
    • 3. 读取数据
    • 4. 用正则表达式来进行对特定符号的剔除
    • 5. 使用口袋模型进行文本处理和特征提取
  • 三、 数据划分

一、 绪论

        近年来,随着互联网和社交媒体的快速发展,人们在网络上表达情感的方式变得更加多样和频繁。在这样的背景下,情感分析成为一项重要的研究领域,旨在通过分析文本、语音和图像等数据来判断人们的情感状态。情感分析在众多领域中具有广泛的应用,包括市场营销、舆情监测、产品评价、心理健康等。

        传统的情感分析方法主要基于规则和词典,通过人工定义的规则和情感词汇来判断文本的情感倾向。然而,这种方法往往面临词汇覆盖不全、主观性强和适应性差等问题。为了解决这些挑战,机器学习技术成为情感分析研究中的重要手段。
机器学习是一种从数据中自动学习模式和规律的方法。在情感分析中,机器学习算法可以通过训练数据来学习情感表达的特征,并构建模型来对新的文本进行情感分类。

        在机器学习情感分析中,关键的一步是特征提取。特征提取是将原始文本数据转化为机器学习算法能够理解和处理的数值表示。常用的特征提取方法包括词袋模型(Bag-of-Words)、TF-IDF(Term Frequency-Inverse Document Frequency)和词嵌入(Word Embedding)等。这些方法可以将文本转化为向量形式,保留了词汇的语义信息。

        一旦特征提取完成,机器学习模型可以通过训练数据进行训练和优化。在训练过程中,模型学习从输入文本中学习情感特征,并尝试准确地预测情感类别。通过不断调整模型参数和优化算法,可以提高模型的性能和泛化能力。

        然而,机器学习情感分析也存在一些挑战和限制。首先,训练数据的质量和规模对模型的性能有重要影响。缺乏标注的大规模训练数据可能导致模型的泛化能力不足。其次,情感分析在不同的语境和领域中具有很大的变化性,模型的泛化能力需要通过合适的特征选择和模型设计来提高。此外,情感分析还需要解决多语言、多模态和主观性判断等问题。

        总的来说,机器学习在情感分析中具有重要的应用价值。通过利用机器学习算法和技术,可以实现对大规模文本数据的情感倾向分析,从而为各种实际应用提供决策依据和洞察力。

二、 数据处理

1. 构建CSV文档

        首先,我们构建模型需要数据集,我们使用一个互联网电影数据库中的大量电影评论数据。下载链接:https://ai.stanford.edu/~amaas/data/sentiment/

        观察我们下载的数据集,test和train目录下都有25000个数据集,分别在neg 与 pos文件夹下,代表消极(6分以下)和积极(6分以上)的评论。

        为了更好的对数据集进行处理,得到方便我们进行机器学习的CSV文件。所以需要构建一个CSV文档,我觉得每一个样例应该有一个特征(比如说评论),还有一个标签,我用1代表积极,用0代表消极。

        首先我读取aclImdb文件夹中的文本文件,并将它们的内容和对应的情感标签存储到一个DataFrame中,并将数据保存为CSV文件:
在这里插入图片描述

        这里是使用pyprind.ProgBar创建了一个进度条对象,总共有50000个进度。出现的进度条,用于显示处理进度。

        最后打乱顺序,以防影响学习效果。然后输出到我们想要的位置,然后读取CSV文件并打印前三行的数据,检查是否正常运行:
在这里插入图片描述

2. 构建模型前的思考

2.1. 问题

        我们有了原始的数据集了,可以开始构建模型了,但是在构建模型的时候我们遇到了几个问题:

  • 问题1:我们的文本中含有大量的HTML符号,影响我们的学习过程。
  • 问题2:我们处理的特征是一个文本,但是我们机器学习的过程中只能由数字数据构成。

2.2. 解决方法

  • 对于问题一,可以用正则表达式来进行对特定符号的剔除。

        正则表达式就是利用特殊符号构建的一种规则,将文本中符合这种规则的字符串提取或者消除的一种方式,在这里我们构建了符合HTML符号的一种规则,将HTML符号在我们的文本数据中进行剔除。

  • 对于问题二,可以用一种在文本处理中常见的模型——词袋模型

        模型简单来说就是将一个大整体数据(在本项目中是50000条评论)中出现过的所有词汇进行逐一编号,比如一个数据集中一共出现了10个词,第一条中出现了其中的5个,它的矩阵可能就是[0 0 0 0 1 1 0 1 1 1] ,第i个位置表示第i号单词出现的次数。通过这一模型,一篇文档可以通过统计所有单词的数目来表示,这种方法不考虑语法和单词出现的先后顺序。

        但是这样会衍生出一个问题,我们日常用语中会出现大量的“无意义”词汇,比如英文中的 is he she are am等等,这样的词汇在我们的向量中会多次出现,对我们的学习过程会产生不确定的影响。为此可以提前准备好一个集合,里面是所有我们预先规定的停用词,也就是在句子中一般无意义的词汇,将他们在我们的数据集中进行剔除。

3. 读取数据

        构思完后,我们使用pandas库中的read_csv函数从名为’movie_data.csv’的CSV文件中读取数据,并将读取的数据存储在名为df的DataFrame对象中。

4. 用正则表达式来进行对特定符号的剔除

        定义了一个名为delete_html的函数,作用是使用正则表达式删除文本中的HTML标签和表情符号,同时将文本转换为小写,最后返回处理后的文本。

        将其应用于数据集的’review’列,文本数据中的HTML标签和表情符号被删除,并且文本被转换为小写形式,方便后续的文本处理和分析。
在这里插入图片描述

5. 使用口袋模型进行文本处理和特征提取

        导入了相关的库和定义了几个函数,用于进行文本分词、词干提取和停用词处理,以准备文本数据进行进一步的特征提取和建模。

        导入PorterStemmer类,用于词干提取。

        导入了nltk库,用于自然语言处理任务。

        从nltk.corpus模块中导入stopwords类,用于获取停用词列表。

        tokenizer函数:将文本按空格分割成单词列表。

        stem_tokenizer函数:对列表中的每个单词进行词干提取,返回词干化后的单词列表。
在这里插入图片描述

三、 数据划分

        从DataFrame中提取训练集和测试集的特征和标签数据。

        我们一开始对训练集和测试集进行了1:1的划分。
在这里插入图片描述

        但是在后面我们发现划分训练集和测试集的比例为1:1可能会导致一些问题:

  1. 训练数据不足:如果将数据集几乎均匀地分为训练集和测试集,每个集合中的样本数量都会减少。在训练集中有较少的数据可用时,模型可能无法充分学习数据集中的模式和特征,从而影响模型的性能。
  2. 不可靠的性能评估:测试集的样本数量过少可能导致评估模型性能时的不稳定性。模型在一个小规模的测试集上的表现可能无法准确地反映其在整个数据集或真实场景中的表现。
  3. 随机性的影响:在数据集较小的情况下,随机性对模型性能的影响更为显著。划分为1:1的比例可能导致测试集中的样本在分布上与整个数据集存在较大的差异,这可能导致模型在测试集上的性能评估不够准确。

        训练集和测试集的比例选择通常取决于具体的应用场景和数据集大小。将数据集划分为训练集和测试集的目的是评估模型在未见过的数据上的性能表现,并检验模型的泛化能力。

        常见的划分比例包括 7:3、8:2 或者 9:1 等。选择适当的比例可以在一定程度上平衡训练集和测试集之间的数据量,确保有足够的数据用于模型的训练和评估。所以我们后面将训练集和测试集比例修改为了7:3。
在这里插入图片描述

        数据集被分为训练集和测试集,其中训练集包含索引0到索引17500的数据,而测试集包含索引17500到索引25000之间的数据。这样可以将数据用于模型的训练和评估,其中训练集用于训练模型,而测试集用于评估模型在未见过的数据上的性能。


更多详细内容可看
在这里插入图片描述

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

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

相关文章

python自动化登录(测试篇)

起初是想抓取下请求看能不能做模拟登录。无奈发现,目标网站的请求数据是加密过的,而且网站代码也是编译后的代码。要从编译后的代码中提取加密算法。我的第一想法是明知不可为而不为。但是转念一想,何不试试python大法。 1.前期准备 python我…

Android图片压缩、Drawable和Bitmap转换、bitmap和base64转换

1. Android图片压缩、Drawable和Bitmap转换、bitmap和base64转换 1.1. Drawable和Bitmap之间的转化 1.1.1. bitmap和Drawable间的区别 Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执…

【c++】深入剖析与动手实践:C++中Stack与Queue的艺术

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们来到STL新的内容,stack和queue 目录 1. stack的介绍与使用函数介绍例题一:最小栈例题二:栈的压入、弹出队列栈的模…

架构师系列- 消息中间件(15)-kafka业务实战

7.1 顺序性场景 7.1.1 场景概述 假设我们要传输一批订单到另一个系统,那么订单对应状态的演变是有顺序性要求的。 已下单 → 已支付 → 已确认 不允许错乱! 7.1.2 顺序级别 1)全局有序: 串行化。每条经过kafka的消息必须严格…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E(端到端)测试是一种软件测试方法,旨在模拟真实的用户场景,测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

uniapp获取当前位置及检测授权状态

uniapp获取当前位置及检测授权定位权限 文章目录 uniapp获取当前位置及检测授权定位权限效果图创建js文件permission.jslocation.js 使用 效果图 Android设备 点击 “设置”,跳转应用信息,打开“权限即可”; 创建js文件 permission.js 新建…

视频怎么批量压缩?5个好用的电脑软件和在线网站

视频怎么批量压缩?有时候我们需要批量压缩视频来节省存储空间,便于管理文件和空间,快速的传输发送给他人。有些快捷的视频压缩工具却只支持单个视频导入,非常影响压缩效率,那么今天就向大家从软件和在线网站2个角度介绍…

ProcessOn已凉,绘图就用谷歌云盘+draw.io达到了巅峰

神器draw.io 首先:对不起ProcessOn,无意冒犯,ProcessOn并没有凉,而且还一直在用。谁让你们火呢,借词一用,哈哈哈哈。 4年前我用谷歌云盘时就无意间发现了draw.io这个绘图工具。 先说下如何发现的&#x…

NumPy 1.26 中文官方指南(一)

NumPy 用户指南 原文:numpy.org/doc/1.26/user/index.html 本指南是一个概述,解释了重要特性;细节请参阅 NumPy 参考文档。 入门指南 什么是 NumPy? 安装 NumPy 快速入门 NumPy:初学者的绝对基础 基础知识和用法 NumPy 基础…

java数据结构泛型

泛型 一.了解包装类二.基本数据类型对应的包装类三.装箱与拆箱四.什么是泛型?五.语法六.泛型类使用七.泛型的上界八.泛型方法 在学习泛型之前,我们需要先了解一下包装类。 一.了解包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代…

爬虫的实战应用之短信炸弹playwright现代网页测试工具

不讲废话,先上原理: 短信炸弹,也就是说持续对一个手机进行发送短信,实现的方式就是,利用某些网站的登录 ,注册的时候,发送短信验证码来实现。 如下图,其中有一个id为phone的输入框&a…

golang beego结合wire依赖注入及自动路由

1 安装wire 1.1 通过命令直接安装 go install github.com/google/wire/cmd/wirelatest 1.2 通过go get方式安装 go get github.com/google/wire/cmd/wire进入目录编译 cd C:\Users\leell\go\pkg\mod\github.com\google\wirev0.6.0\cmd\wire go build 然后将wire.exe移动到…

代码随想录:二叉树22-24

目录 700.二叉搜索树的搜索 题目 代码(二叉搜索树迭代) 代码(二叉搜索树递归) 代码(普通二叉树递归) 代码(普通二叉树迭代) 98.验证二叉搜索树 题目 代码(中序递…

嵌入式全栈开发学习笔记---Linux基本命令2

目录 cp 源路径 目的路径 cp -r 源路径 目的路径 mv 源路径 目的路径 mv oldname newname 接下来我们继续介绍两个常用的命令 一个是拷贝文件,一个是剪切文件 ,或者也可以用来改名字。 cp 源路径 目的路径 “cp”用来拷贝文件或者目录,…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程,只是记录一下本人的操作,感兴趣的可以看下 一、默认地址 http://localhost:…

38-数组 _ 一维数组

38-1 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n是一个常量表达式,用来指定数组的大小 举例: int arr[10]; char ch[5]; double data[20]; 问&…

Vue基础:为什么要学Vue3,Vue3相较于Vue2有那些优势?

为什么要学Vue3? 1.框架层面 1.响应式底层API的变化 Proxy 数组下标的修改 对象动态添加属性 解释说明:1.vue2采用的是Object.definePrototype,它每次只能对单个对象中的单个数据进行劫持,所以在Vue2中data()中的数据一多就要进行…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日,香港嘉实国际资产管理有限公司(Harvest Global Investments)今天宣布,得到香港证监会的原则上批准,将推出两大数字资产(比特币及以太坊&#…

计算公式基础

文章目录 MASMAEXMPA加权移动平均线成交量换手率MACDKDJ MA 均线一般指移动平均线。 移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同…

RabbitMQ工作模式(5) - 主题模式

概念 主题模式(Topic Exchange)是 RabbitMQ 中一种灵活且强大的消息传递模式,它允许生产者根据消息的特定属性将消息发送到一个交换机,并且消费者可以根据自己的需求来接收感兴趣的消息。主题交换机根据消息的路由键和绑定队列的路…