ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列
文章目录
- 0. 首先聊聊什么是RNN
- 1. 理解LSTM,从数据如何喂给 LSTM开始
- 2. LSTM每个门是如何处理序列数据的?
- 2.1 遗忘门(Forget Gate):该忘掉哪些信息?
- 2.2 输入门(Input Gate):该记住哪些新信息?
- 2.3 输出门(Output Gate):此刻该吐露什么?
- 3. 用代码实现文本情感识别
- **数据预处理**
- **构建LSTM模型**
- 4. 总结:LSTM如何发掘情感?
- 5. 内容延展
- 6.参考资料
想象这样一个任务:你希望训练一个模型,它能说出一段文字的情感是“正面”还是“负面”,比如:
- “这部电影简直太棒了!” → 正面情感
- “糟糕透顶,浪费了两个小时的时间。” → 负面情感
这就是一个典型的文本情感识别任务,而LSTM(长短期记忆网络)特别适合这种顺序依赖的数据。
接下来,我们通过这个具体的例子,从输入文本到情感分类,逐步剖析LSTM的内部机制,结合每一个“门”的作用,帮助你理解它是如何工作的。
0. 首先聊聊什么是RNN
思考问题时,人类不是每一时刻都是从零开始的。当你阅读这篇短文时,对于每一个词的理解都是基于这个词之前的词的含义。你不会把前面看到的丢弃,然后从零开始。你的思考是连贯的。
传统的神经网络无法做到这一点,并且这是它的一个主要的缺点。例如,假如你想清楚地知道在一个电影的每一个片段发生了什么样的事情。现在,还不能确定,传统的神经网络如何能够基于已知的事件推断出将要发生的事件。
循环神经网络致力于解决该问题。这样的网络通过环回链接,保持信息的连贯性。

在上图中,A是一个神经网络的一部分,输入 x t x_t xt得到输出 h t h_t ht。环回链接控制信息被从网络的一层传递到下一层。
这些环回链接使得循环神经网络看起来有些神秘。但是,如果你更进一步地思考,它与普通的神经网络没有太大的区别。一个循环神经网络可以被认为是一个网络的多个拷贝,每一个把信息传递给下一个。对循环神经网络做循环展开后,它就是下面的样子:
这种链式的本质说明了循环神经网络本质上与序列和链表相关。它天生就是要应用到这样的数据上。
RNNs最令人着迷的是,它也许能够将当前的任务与之前的信息联系起来。例如,通过视频以播放过的帧来理解当前的这一帧。如果RNNs能做到,它的作用是巨大的。RNNs能做到吗?在某些条件下是的。
有些时候,当前的任务是可以依据最近的信息推测出来的。例如,依据前面已经出现的词推测下一个词的语言模型。当我们推测“the clouds are in the sky,”这句话的最后一个词时,已经不需要其他的上下文了;非常明显这个词是“sky”或者"mountain"。在这种情况下,相关联的词汇间的距离很短,RNNs能够学习如何使用这些信息。
但是在某些情况下需要更多的上下文。例如预测这句话 - “I grew up in France… I speak fluent French.” - 的最后一个词。与目标词最近的相关信息表明这个词很可能指某个语言。但是如果把这个词缩小到某个具体的语言上,就需要与距离较远的France的上下文考虑到。
与目标点相关的信息与目标点之间的间隔非常的大,这是完全可能的。
不幸的是,随着距离的增加,RNNs就不能学习到这些关联信息。
在理论上,RNNs绝对能够处理长距离间的依赖关系。通过仔细挑选参数,能够在一些实验性的玩具项目上取得很好的效果。不幸的是,在现实中,RNNs不能学习使用这些信息。Hochreiter (1991) [German] 和 Bengio, et al. (1994), 在这方面做了深入的研究,他们的研究结果揭示了一些RNNs在这方面的本质上的缺陷。
令人欣慰的是,LSTMs能解决这个问题!
1. 理解LSTM,从数据如何喂给 LSTM开始
在情感识别中,输入是一段文本,比如:
输入句子:
“This movie is fantastic and I love it!”
LSTM接收的数据要求是一个序列型输入,因此我们需要以下预处理步骤:
-
分词和索引化
将句子分割成单词并用数值表示。例如:
"This movie is fantastic and I love it!" → [1, 2, 3, 4, 5, 6, 7]
(假设 “This” 对应索引 1,“movie” 对应索引 2,依此类推。) -
嵌入向量表示
每个单词会用一个固定长度的向量表示,例如通过**词嵌入(Embedding)**生成300维向量:[1, 2, 3, 4, 5, 6, 7] → [[0.5, 0.8, ...], [0.2, 0.9, ...], ..., [0.7, 0.4, ...]]
输入的数据就变成了一个二维矩阵,形状为:
(单词数, 每个单词的向量维度) = (7, 300)
2. LSTM每个门是如何处理序列数据的?
现在我们以这句输入 “This movie is fantastic and I love it!” 为例,逐步拆解 LSTM 的门机制,看看它是如何从文字序列中提取情感特征的。
2.1 遗忘门(Forget Gate):该忘掉哪些信息?
首先,遗忘门会接收当前单词的表示(如第一个单词 “This” 的嵌入向量)和上一时间步的信息(即隐藏状态 h t − 1 h_{t-1} ht−1),决定过去哪些记忆应该被“遗忘”。
公式如下:
f t = σ ( W f [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f[h_{t-1}, x_t] + b_f) ft=σ(Wf[ht−1,xt]+bf)
- x t x_t xt:当前时间步的输入(如 “This” 的向量表示)。
- h t − 1 h_{t-1} ht−1:上一时间步的隐藏状态(尚未产生)。
- f t f_t ft:遗忘门输出向量(值在 0 和 1 之间)。接近1的值会保留过去信息,接近0的值会遗忘。
在解读句子的时候,“This”和情感无关,因此模型可能输出低遗忘比例,例如 f t = [ 0.3 , 0.1 , 0.2 , . . . ] f_t = [0.3, 0.1, 0.2, ...] ft=[0.3,0.1,0.2,...],表示对当前单词(“This”)相关的记忆会部分清除。
2.2 输入门(Input Gate):该记住哪些新信息?
遗忘了无关信息后,输入门决定哪些新信息需要记住。两个核心过程:
-
生成候选记忆内容 C ~ t \tilde{C}_t C~t
当前单词向量(如"fantastic")经过权重变换和激活函数处理,生成可能的记忆内容:C ~ t = tanh ( W C [ h t − 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C[h_{t-1}, x_t] + b_C) C~t=tanh(WC[ht−1,xt]+bC)
例如,“fantastic” 强烈关联到积极情感,候选记忆向量 C ~ t \tilde{C}_t C~t 的值可能表示强正面情感。
-
输入门决定记忆的权重 i t i_t it
i t = σ ( W i [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i[h_{t-1}, x_t] + b_i) it=σ(Wi[ht−1,xt]+bi)输入门输出 i t i_t it 决定该候选记忆的比重。
-
更新记忆单元 C t C_t Ct
最终,记忆单元的更新公式为:C t = f t ⋅ C t − 1 + i t ⋅ C ~ t C_t = f_t \cdot C_{t-1} + i_t \cdot \tilde{C}_t Ct=ft⋅Ct−1+it⋅C~t
在处理"fantastic"时,输入门可能输出 i t = [ 0.9 , 0.8 , 0.7 , . . . ] i_t = [0.9, 0.8, 0.7, ...] it=[0.9,0.8,0.7,...],表示“要记住这个强正面情感的单词”。然后结合候选记忆单元 C ~ t \tilde{C}_t C~t,将它添加到记忆中。
2.3 输出门(Output Gate):此刻该吐露什么?
最后,输出门决定当前记忆中哪些信息需要释放给下一层或时间步,用于接续处理或最终的分类。
-
计算输出门权重 o t o_t ot:
o t = σ ( W o [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o[h_{t-1}, x_t] + b_o) ot=σ(Wo[ht−1,xt]+bo) -
生成隐藏状态 h t h_t ht:
h t = o t ⋅ tanh ( C t ) h_t = o_t \cdot \tanh(C_t) ht=ot⋅tanh(Ct)h t h_t ht 是 LSTM 的输出,会直接用于下一时间步的计算,或通过全连接层参与情感分类。
在处理到句子最后的 “it” 时,LSTM 的隐藏状态已经累积了上下文信息。此时的 h t h_t ht 可能非常接近“正面情感”的特征表示。
3. 用代码实现文本情感识别
以下代码演示如何用 TensorFlow 构建一个简单的 LSTM 模型,用于情感分类任务。
数据预处理
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences# 样本数据
texts = ["This movie is fantastic and I love it!", # 正面情感"This film is horrible, I hate it!" # 负面情感
]# 标签 (1 表示正面, 0 表示负面)
labels = [1, 0]# 分词与索引化
tokenizer = Tokenizer(num_words=10000)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)# 填充序列到固定长度
maxlen = 10
X = pad_sequences(sequences, maxlen=maxlen, padding='post')
y = labels
print("输入形状:", X.shape)
构建LSTM模型
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense# 定义LSTM情感分类模型
model = Sequential([Embedding(input_dim=10000, output_dim=300, input_length=maxlen),LSTM(128, return_sequences=False),Dense(1, activation='sigmoid')
])model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()# 假设使用训练数据进行训练
model.fit(X, y, batch_size=2, epochs=10)
4. 总结:LSTM如何发掘情感?
结合我们的例子可以看到:
- 遗忘门:过滤掉“无关”单词对情感的影响,比如 “This”。
- 输入门:捕捉关键情感词汇,比如 “fantastic”、“horrible”。
- 输出门:输出情感特征,逐步累积句子的情感信息。
最后,通过分类器,我们得到了精准的情感判断:
“This movie is fantastic and I love it!” → Positive
从这一任务中,可以感受到 LSTM 对时间序列建模的强大能力,它让机器逐步理解了句子的情感含义!
5. 内容延展
虽然LSTM在处理文本、音频和其他序列数据时表现十分优秀,但它也有一定的局限性,例如当序列非常长时,仍然可能有信息丢失的问题。近年来,更加先进的模型正在逐渐取代LSTM:
-
Transformer
Transformer模型通过自注意力机制建模长距离依赖,极大提升了序列数据的建模能力。在自然语言处理任务(如机器翻译)中,Transformer已成为主流。 -
Conformer
在语音识别任务中,Conformer结合了卷积网络和Transformer的优势,是处理语音序列的强大模型。 -
Mamba
Mamba 是一种由斯坦福大学研究团队在 2023 年底提出的新型状态空间模型架构,它专为信息密集型任务(如长序列数据或高维数据)而生。与LSTM相比,Mamba使用选择性状态空间模型(Selective State Space Model, SSM),能够以线性时间复杂度处理长序列数据。
在后续内容中,我们将逐步介绍这些更现代、更强大的模型,敬请期待!
6.参考资料
[1] 理解LSTM网络 (https://colah.github.io/posts/2015-08-Understanding-LSTMs/).
[2] 深入理解LSTM (https://xiaohutou.github.io/2018/05/01/understanding-lstm-networks/).
[3] LSTM情绪识别实战 (https://github.com/lukasgarbas/nlp-text-emotion).
感谢各位读者耐心看到这里!如果这篇文章对您有所启发,请收藏、点赞和分享给更多的朋友,让我们一起交流人工智能的魅力。如果您有任何问题或想法,欢迎在评论区留言,我会尽量回复每一条评论!
期待我们在学习之路上的共同成长!🎉
相关文章:

ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列
文章目录 0. 首先聊聊什么是RNN1. 理解LSTM,从数据如何喂给 LSTM开始2. LSTM每个门是如何处理序列数据的?2.1 遗忘门(Forget Gate):该忘掉哪些信息?2.2 输入门(Input Gate)ÿ…...
测试开发之面试宝典
目录 session和cookie的区别 session和cookie的区别 1.session和cookie都是鍵值对应的 2.session和cookie都是服务器生成的,session的ID,即服各器用来识别读取session对象的一把钥匙 3.session是保存在服各器端,而cookie是返回給客戶端的&…...
399. 除法求值【 力扣(LeetCode) 】
文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路3.1 图的路径搜索3.2 路径压缩 四、参考代码4.1 图的路径搜索4.2 路径压缩 零、LeetCode 原题 399. 除法求值 一、题目描述 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,…...

算法日记1:洛谷p2678跳石头(二分答案)
1、题目 二、题解: 2.1解题思路: 1.题目要求求出最小值最大,明显的二分答案题目,所以我们可以二分可以跳跃距离int l-1,rL1; 2.此时我们思考lmid和rmid的处理,当我们的check(mid)为true时候 表明我们此时的mid是符合要求的, 那么…...

Unity shader中真的可以动态关闭Stencil Test吗?
这个问题很多年前就有人问了: https://discussions.unity.com/t/how-to-disable-the-stencil-block-via-shader-properties/600273/1 最后的答案是: set [_StencilComp] to CompareFunction.Disabled to disable the Stencil Op completely. 但是我测试…...

YOLOv9改进,YOLOv9自研检测头融合HyCTAS的Self_Attention自注意力机制,2024,适合目标检测、分割任务
摘要 论文提出了一种新的搜索框架,名为 HyCTAS,用于在给定任务中自动搜索高效的神经网络架构。HyCTAS框架结合了高分辨率表示和自注意力机制,通过多目标优化搜索,找到了一种在性能和计算效率之间的平衡。 # 理论介绍 自注意力(Self-Attention)机制是HyCTAS框架中的一个…...

计算机网络 (36)TCP可靠传输的实现
前言 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过多种机制实现可靠传输,这些机制主要包括连接管理、序列号和确认应答机制、重传机制、流量控制、拥塞控制等。 一、连接管理 TCP使用三次握手࿰…...

Git版本控制 - 创建使用Repository
Git版本控制 – 创建使用Repository Version Control with Git - Create and Use Repository By JacksonML 上文提到,Git是一种分布式版本控制系统。作为全球范围内广泛使用的工具,如何将项目分步骤运用到其中呢? 本文简要介绍如何用Git工…...

MySQL —— 在CentOS9下安装MySQL
MySQL —— 在CentOS9下安装MySQL 1.查看自己操作系统的版本2.找到对应的安装源3.上传我们在windows下,下载的文件,解压4.执行rpm命令,启用MySQL8仓库5.执行dnf install -y mysql-community-server6.设置开机自启动7.获得初始密码8.登录MySQL…...

LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))
LeetCode 热题 100_腐烂的橘子(52_994) 题目描述:输入输出样例:题解:解题思路:思路一(广度优先遍历(队列)): 代码实现代码实现(思路一…...

Nginx 可观测性最佳实践
Nginx 介绍 Nginx 是一个开源、轻量级、高性能的 HTTP 和反向代理服务器,也可以用于 IMAP/POP3 代理服务器。Nginx 因其采用的异步非阻塞工作模型,使其具备高并发、低资源消耗的特性。高度模块化设计也使得 Nginx 具备很好的扩展性,在处理静…...

LabVIEW光流跟踪算法
1. 光流跟踪算法的概述 光流(Optical Flow)是一种图像处理技术,用于估算图像中像素点的运动。通过比较连续帧图像,光流算法可以分析图像中的运动信息,广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…...
Jira用例自动去除summary重复用例
title: Jira用例自动去除summary重复用例 tags: - jira - python categories: - python一、背景与需求二、解决方案思路三、实施步骤本文永久更新地址: 在使用 Jira 进行项目管理时,测试用例的维护至关重要。随着项目推进,用例数量增多,可能…...
基于openEuler22.03SP4部署Prometheus+Grafana
测试环境 Virtual Box,openEuler-22.03-LTS-SP4-x86_64-dvd.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 sed -ri…...

泛目录和泛站有什么差别
啥是 SEO 泛目录? 咱先来说说 SEO 泛目录是啥。想象一下,你有一个巨大的图书馆,里面的书架上摆满了各种各样的书,每一本书都代表着一个网页。而 SEO 泛目录呢,就像是一个超级图书管理员,它的任务就是把这些…...
css 布局及动画应用(flex+transform+transition+animation)
文章目录 css 布局及动画应用animationtransform,transition,animation 综合应用实例代码实例解释 css 布局及动画应用 Display用法 作用:用于控制元素的显示类型,如块级元素、内联元素、无显示等。常见属性值及示例:…...

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)
线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…...
lombok在高版本idea中注解不生效的解决
环境: IntelliJ IDEA 2024.3.1.1 Spring Boot Maven 问题描述 使用AllArgsConstructor注解一个用户类,然后调用全参构造方法创建对象,出现错误: java: 无法将类 com.itheima.pojo.User中的构造器 User应用到给定类型; 需要:…...

跨境电商领域云手机之选:亚矩阵云手机的卓越优势
在跨境电商蓬勃发展的当下,云手机已成为众多企业拓展海外市场的得力助手。亚矩阵云手机凭借其独特优势,在竞争激烈的云手机市场中崭露头角。不过,鉴于市场上云手机服务供应商繁多,企业在抉择时需对诸多要素予以审慎考量。 跨境电商…...

Linux第二课:LinuxC高级 学习记录day02
2.4、shell中的特殊字符 2.4.4、命令置换符 或者 $() 反引号:esc下面的按键,英文状态下直接按 功能:将一个命令的输出作为另一个命令的参数 echo 不会认为hostname是一个命令 加上 之后,先执行hostname,拿到主机名…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...