当前位置: 首页 > news >正文

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 

学堂在线 - 精品在线课程学习平台 (xuetangx.com)

代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主

有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~

案例简介

情感分析旨在挖掘文本中的主观信息,它是自然语言处理中的经典任务。在本次任务中,我们将在影评 文本数据集(Rotten Tomato)上进行情感分析,通过实现课堂讲授的模型方法,深刻体会自然语言处 理技术在生活中的应用。 同学们需要实现自己的情感分析器,包括特征提取器(可以选择词袋模型、词向量模型和预训练模 型)、简单的线性分类器以及梯度下降函数。随后在数据集上进行训练和验证。我们提供了代码框架, 同学们只需补全 model.py 中的两个函数。

数据说明

我们使用来自Rotten Tomato的影评文本数据。其中训练集 data_rt.train 和测试集 data_rt.test 均 包含了3554条影评,每条影评包含了文本和情感标签。示例如下:

其中, +1 表示这条影评蕴涵了正面感情,后面是影评的具体内容。

文本特征提取 

 TODO:补全 featureExtractor 函数 在这个步骤中,同学们需要读取给定的训练和测试数据集,并提取出文本中的特征,输出特征向量。同学们需要实现词袋模型、词向量模型和预训练模型(选做)来生成句子表示,并对比不同方法的表现有何差异。

Bag of Words得到句子的0-1向量(选做:用TFIDF计算句子向量)

Word2Vec词向量求和/取平均(选做:实现Doc2Vec[1])

使用BERT得到[CLS]向量/词的隐状态取平均(选做)

训练分类器 

TODO:补全 learnPredictor 函数 我们提供的训练数据集中,每句话的标签在文本之前,其中 +1 表示这句话蕴涵了正面感情, -1 表示这 句话蕴涵了负面感情。因此情感分析问题就成为一个分类问题。

同学们需要实现一个简单的线性分类器,并推导出相应的梯度下降函数。

实验与结果分析

在训练集上完成训练后,同学们需要在测试集上测试分类器性能。本小节要求同学们画出训练集上的损 失函数下降曲线和测试集的最终结果(损失函数、准确率),并对结果进行分析。 

评分要求

同学们需要提交源代码和实验报告。实验报告中应包含以下内容: 对hinge loss反向传播的理论推导,请写出参数的更新公式。 对实验结果的分析,请描述采用的模型结构、模型在训练集上的损失函数下降曲线和测试集的最终 结果,并对结果进行分析。分析可以从模型的泛化能力、参数对模型性能的影响以及不同特征的影 响等方面进行。 

[1] Distributed Representations of Sentences and Documents. https://arxiv.org/pdf/1405.4053.pdf

实验结果

1,反向传播推导

2,文本特征提取 

2.1 使用 BOW 作为特征

从 loss 图来看训练的 loss 下降比测试的 loss 快很多,但是相同点就是都在下降,虽然中间测试的 loss 随着周期增大突然有个小的升高,但是最终仍然总体趋势是下降的。然后再从训练准确率来看 train 的训练最终几乎饱满了,测试的正确率也是最终达到最高,所以开始我前面对于最佳学习率和迭代次数的精准把控做的很好,才能得出最优结果,最终测试错误值来到了 0.263

2.2 使用 N-gram 作为特征

 从图中可以看出 loss 曲线不管是训练还是训练的 loss 都在下降,跟前面的情况类似,也是训练的 loss 下降很快,而测试的 loss 下降较为平缓。从准确率图来看训练的也几乎饱满,测试也是随着周期变大达到最高,最终 test 的错误值为 0.238,达到新低。可以看出我们调参的方法非常有效,通过对多个学习率的运行,找出了对于每个级别的最佳超参数,并且精准把控训练轮数达到最优结果。

2.3 使用 BERT 得到[CLS]向量作为特征

首先从 loss 图可以看出训练和测试的 loss 的曲线非常接近,没有出现前两个特征提取方法中差别较大的情况,总体趋势也是训练的 loss 下降更快,测试的 loss 紧跟其后。从准确率图来看,训练和测试的准确率曲线几乎是同趋势变化,特别已经很平稳,说明训练基本已经充分了。最终测试的错误率来到了新底,达到了约为 0.197 这个相比于前 面两种方法更好的结果。

3,总结三种方法对比差异

这三种方法使用了不同的特征提取方式,导致最终结果的差异。让我详细解释一下可能的区别和影响。

词袋特征提取(第一个方法)
这个方法简单地对文本进行词级别的计数,每个单词作为一个特征,记录其出现的次数。缺点:忽略了单词之间的顺序和上下文信息。如果两个句子有相似的单词分布,但是顺序不同,这种方法就不能捕捉到它们的相似性。
N-Gram 特征提取(第二个方法)
这个方法根据指定的 N 值(可以是单词级别或字符级别)提取 N-Gram 特征,可以是词级别的 N-Gram 或字符级别的 N-Gram 还可以是混合级别的 N-Gram。
优点 :能够更全面地考虑到文本中的不同信息,从而提高了对文本特征的表示能力。词级别的 N-Gram 能够捕捉单词之间的关系,而字符级别的 N-Gram 则能够捕捉到更细小的特征和局部模式,这样结合起来可以在一定程度上弥补彼此的不足,提高特征提取的效果。因此,混合级别的 N-Gram 特征提取方法可能比单一级别的 N-Gram 提取更有效,能够更全面地表示文本特征
缺点 :对于大量的文本数据,特征空间可能会变得非常大,导致稀疏性增加,同时可能引入一些噪音特征。
BERT 特征提取(第三个方法)
使用预训练的 BERT 模型提取文本的特征向量,提取 [CLS] token 对应的隐藏状态作为整个句子的表示。
优点 :BERT 模型在训练中学习到了大量语言表示,能够捕捉更高级别、更全局的语义和句子系。
缺点 :计算成本较高,即使是对于轻量化版本的 BERT 模型,也需要更多的计算资源,比如在我的实验里运行 20 轮即使使用 GPU 也需要 40 分钟才能跑完,相对于其他两种方法非常耗时。
当综合考虑时 ,BERT 特征提取方法表现更出色,因为它能够捕捉更加丰富和高级别的语义信息。相比之下,传统的词袋模型和 N-Gram 方法有时可能忽视句子的语义和上下文信息,在表现上稍显不足。然而,混合级别的 N-Gram 方法则能够在一定程度上弥补这些传统方法的缺陷。结合了词级别和字符级别的信息,这种方法更全面地考虑了文本的局部模式和全局特征,使得其能够更有效地提取特征。至于为什么 BERT 特征提取方法更为优越,我认为原因在于 BERT 模型经过大规模训练,具备了对语言表示更全面的学习能力。它能够理解和捕捉到文本中更深层次、更复杂的语义关系,因此在处理这次情感分析实验时具有更好的表现。

相关文章:

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢…...

2.12日学习打卡----初学RocketMQ(三)

2.12日学习打卡 目录: 2.12日学习打卡一. RocketMQ高级特性(续)消息重试延迟消息消息查询 二.RocketMQ应用实战生产端发送同步消息发送异步消息单向发送消息顺序发送消息消费顺序消息全局顺序消息延迟消息事务消息消息查询 一. RocketMQ高级特…...

<网络安全>《35 网络攻防专业课<第一课 - 网络攻防准备>》

1 主要内容 认识黑客 认识端口 常见术语与命令 网络攻击流程 VMWare虚拟环境靶机搭建 2 认识黑客 2.1 白帽、灰帽和黑帽黑客 白帽黑客是指有能力破坏电脑安全但不具恶意目的黑客。 灰帽黑客是指对于伦理和法律态度不明的黑客。 黑帽黑客经常用于区别于一般(正面…...

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试?5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…...

蓝桥杯Java组备赛(二)

题目1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int max Integer.MIN_VALUE;int min Integer.MAX_VALUE;double sum 0;for(int i0;i<n;i) {int x sc.nextInt()…...

人力资源智能化管理项目(day10:首页开发以及上线部署)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 首页-基本结构和数字滚动 安装插件 npm i vue-count-to <template><div class"dashboard"><div class"container"><!-- 左侧内…...

Conda管理Python不同版本教程

Conda管理Python不同版本教程 目录 0.前提 1.conda常用命令 2.conda设置国内源&#xff08;以添加清华源为例&#xff0c;阿里云源同样&#xff09; 3.conda管理python库 4.其它 不太推荐 pyenv管理Python不同版本教程&#xff08;本人另一篇博客&#xff0c;姊妹篇&…...

free pascal:fpwebview 组件通过 JSBridge 调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr &#xff0c;编写 js_bind_speak.lpr 如下&#xff0c;通过 JSBridge 调用本…...

数据结构——单链表专题

目录 1. 链表的概念及结构2. 实现单链表初始化尾插头插尾删头删查找在指定位置之前插入数据在指定位置之后插入数据删除指定位之前的节点删除指定位置之后pos节点销毁链表 3. 完整代码test.cSList.h 4. 链表的分类 1. 链表的概念及结构 在顺序表中存在一定的问题&#xff1a; …...

Linux:开源世界的王者

在科技世界中&#xff0c;Linux犹如一位低调的王者&#xff0c;统治着开源世界的半壁江山。对于许多技术爱好者、系统管理员和开发者来说&#xff0c;Linux不仅仅是一个操作系统&#xff0c;更是一种信仰、一种哲学。 一、开源的魅力 Linux的最大魅力在于其开源性质。与封闭的…...

⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…...

文件上传漏洞--Upload-labs--Pass07--点绕过

一、什么是点绕过 在Windows系统中&#xff0c;Windows特性会将文件后缀名后多余的点自动删除&#xff0c;在网页源码中&#xff0c;通常使用 deldot()函数 对点进行去除&#xff0c;若发现网页源代码中没有 deldot() 函数&#xff0c;则可能存在 点绕过漏洞。通过点绕过漏洞&…...

MySQL高级特性篇(1)-JSON数据类型的应用

MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了多种数据类型&#xff0c;其中包括JSON数据类型。JSON&#xff08;JavaScript Object Notation&#xff09;是一种常用的数据交换格式&#xff0c;它以键值对的形式组织数据&#xff0c;并支持嵌套和数组结构。MySQL…...

如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口

在Qt框架中&#xff0c;要实现一个无标题栏、半透明、置顶&#xff08;悬浮&#xff09;的窗口&#xff0c;需要一些特定的设置和技巧。废话不多说&#xff0c;下面我将以DrawClient软件为例&#xff0c;介绍一下实现这种效果的四个要点。 要点一&#xff1a;移除标题栏&#…...

ViT: transformer在图像领域的应用

文章目录 1. 概要2. 方法3. 实验3.1 Compare with SOTA3.2 PRE-TRAINING DATA REQUIREMENTS3.3 SCALING STUDY3.4 自监督学习 4. 总结参考 论文&#xff1a; An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 代码&#xff1a;https://github.com…...

Sora 的工作原理(及其意义)

原文&#xff1a;How Sora Works (And What It Means) 作者&#xff1a; DAN SHIPPER OpenAI 的新型文本到视频模型为电影制作开启了新篇章 DALL-E 提供的插图。 让我们先明确一点&#xff0c;我们不会急急忙忙慌乱。我们不会预测乌托邦或预言灾难。我们要保持冷静并... 你…...

Java学习笔记2024/2/16

知识点 面向对象 题目1&#xff08;完成&#xff09; 定义手机类&#xff0c;手机有品牌(brand),价格(price)和颜色(color)三个属性&#xff0c;有打电话call()和sendMessage()两个功能。 请定义出手机类&#xff0c;类中要有空参、有参构造方法&#xff0c;set/get方法。 …...

XLNet做文本分类

import torch from transformers import XLNetTokenizer, XLNetForSequenceClassification from torch.utils.data import DataLoader, TensorDataset # 示例文本数据 texts ["This is a positive example.", "This is a negative example.", "Anot…...

Swift 5.9 新 @Observable 对象在 SwiftUI 使用中的陷阱与解决

概览 在 Swift 5.9 中&#xff0c;苹果为我们带来了全新的可观察框架 Observation&#xff0c;它是观察者开发模式在 Swift 中的一个全新实现。 除了自身本领过硬以外&#xff0c;Observation 框架和 SwiftUI 搭配起来也能相得益彰&#xff0c;事倍功半。不过 Observable 对象…...

分享一个学英语的网站

名字叫&#xff1a;公益大米网​​​​​​​ Freerice 这个网站是以做题的形式来记忆单词&#xff0c;题干是一个单词&#xff0c;给出4个选项&#xff0c;需要选出其中最接近题干单词的选项。 答对可以获得10粒大米&#xff0c;网站的创办者负责捐赠。如图 触发某些条件&a…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

「Java基本语法」变量的使用

变量定义 变量是程序中存储数据的容器&#xff0c;用于保存可变的数据值。在Java中&#xff0c;变量必须先声明后使用&#xff0c;声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例&#xff1a;声明与初始化 public class VariableDemo {publi…...

02-性能方案设计

需求分析与测试设计 根据具体的性能测试需求&#xff0c;确定测试类型&#xff0c;以及压测的模块(web/mysql/redis/系统整体)前期要与相关人员充分沟通&#xff0c;初步确定压测方案及具体的性能指标QA完成性能测试设计后&#xff0c;需产出测试方案文档发送邮件到项目组&…...

学习 Hooks【Plan - June - Week 2】

一、React API React 提供了丰富的核心 API&#xff0c;用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素&#xff0c;JSX 会被编译成该函数…...