ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列

news2025/7/11 6:18:11

文章目录

    • 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接收的数据要求是一个序列型输入,因此我们需要以下预处理步骤:

  1. 分词和索引化
    将句子分割成单词并用数值表示。例如:
    "This movie is fantastic and I love it!" → [1, 2, 3, 4, 5, 6, 7]
    (假设 “This” 对应索引 1,“movie” 对应索引 2,依此类推。)

  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} ht1),决定过去哪些记忆应该被“遗忘”。

公式如下:

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[ht1,xt]+bf)

  • x t x_t xt:当前时间步的输入(如 “This” 的向量表示)。
  • h t − 1 h_{t-1} ht1:上一时间步的隐藏状态(尚未产生)。
  • 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):该记住哪些新信息?

遗忘了无关信息后,输入门决定哪些新信息需要记住。两个核心过程:

  1. 生成候选记忆内容 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[ht1,xt]+bC)

    例如,“fantastic” 强烈关联到积极情感,候选记忆向量 C ~ t \tilde{C}_t C~t 的值可能表示强正面情感。

  2. 输入门决定记忆的权重 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[ht1,xt]+bi)

    输入门输出 i t i_t it 决定该候选记忆的比重。

  3. 更新记忆单元 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=ftCt1+itC~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):此刻该吐露什么?

最后,输出门决定当前记忆中哪些信息需要释放给下一层或时间步,用于接续处理或最终的分类。

  1. 计算输出门权重 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[ht1,xt]+bo)

  2. 生成隐藏状态 h t h_t ht
    h t = o t ⋅ tanh ⁡ ( C t ) h_t = o_t \cdot \tanh(C_t) ht=ottanh(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:

  1. Transformer
    Transformer模型通过自注意力机制建模长距离依赖,极大提升了序列数据的建模能力。在自然语言处理任务(如机器翻译)中,Transformer已成为主流。

  2. Conformer
    在语音识别任务中,Conformer结合了卷积网络和Transformer的优势,是处理语音序列的强大模型。

  3. 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).


感谢各位读者耐心看到这里!如果这篇文章对您有所启发,请收藏、点赞和分享给更多的朋友,让我们一起交流人工智能的魅力。如果您有任何问题或想法,欢迎在评论区留言,我会尽量回复每一条评论!

期待我们在学习之路上的共同成长!🎉

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

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

相关文章

springboot和vue配置https请求

项目场景: 代码发布到线上使用https请求需要配置ssl证书,前后端都需要修改。 问题描述 如图,我们在调用接口时报如下错误,这就是未配置ssl但是用https请求产生的问题。 解决方案: 前端:在vite.config.js文…

软件工程期末整理(二)

快速原型开发模型是(适用于客户需求难以清楚定义、规模较小的系统)。(编写系统实施计划)不是系统设计阶段的主要活动 解释:系统实施计划”更侧重于后续的实施与部署阶段,属于项目管理层面的内容 协作性不属于构件的特性在类图中…

filebeat、kafka

elk的架构 es数据库:非关系型数据库,json格式 logstash:收集日志 kibana:图形化的工具 ↓ 以上三种结合起来即为日志收集系统 filebeat 作用:filebeat是一款轻量级的日志收集工具,不依赖java环境&…

vue3使用vue3-video-play播放m3u8视频

1.安装vue3-video-play npm install vue3-video-play --save2.在组件中使用 import vue3-video-play/dist/style.css; import VideoPlay from vue3-video-play;// 视频配置项 const options reactive({src: https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8, //视频源mute…

项目代码第8讲:Socket和OPC UA客户端通信;数据库的表格内容谁填的?(OPC Client和Web);在Program.cs中单独开启一个线程

一、Socket:用于和OPC UA客户端通信 1、Socket和OPC UA的定义 1>Socket:只是一个API,提供了一个使用 TCP(以及其他协议)的方式,用于在同一台计算机上的进程之间或不同计算机之间的进程通信 一个API Socket 是一种应用程序编程接口(API),它提供了一系列函数…

离线录制激光雷达数据进行建图

目前有一个2D激光雷达,自己控制小车运行一段时间,离线获取到激光雷达数据后运行如下代码进行离线建图。 roslaunch cartographer_ros demo_revo_lds.launch bag_filename:/home/firefly/AutoCar/data/rplidar_s2/2025-01-08-02-08-33.bag实际效果如下 d…

hisi mipi yuv422数据异常问题记录解决

问题解决,海思原厂提供支持后解决方式,适用于dv500和928系列: YUV422输入时,mask[1]使用0x00FFC000得配置。 问题现象就是mask[1]配置的0xFF0000时,YUV值收到后UV的会向下做一个4对齐的操作,导致色度UV数据…

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot(1)基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot(2)解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot(3)教你手工搭建Spring Boot项目纯手工玩法…

VS2022 安装和配置 vcpkg

vs2022使用vcpkg最全版本_vs2022 vcpkg-CSDN博客 Visual Studio 2022 安装和配置 vcpkg_vs2022 vcpkg-CSDN博客 GitHub - microsoft/vcpkg: C Library Manager for Windows, Linux, and MacOS vcpkg 文档 | Microsoft Learn 没有详细教程写出来,先大概看看&#x…

深度学习与计算机视觉 (博士)

文章目录 零、计算机视觉概述一、深度学习相关概念1.学习率η2.batchsize和epoch3.端到端(End-to-End)、序列到序列(Seq-to-Seq)4.消融实验5.学习方式6.监督学习的方式(1)有监督学习(2)强监督学习(3)弱监督学习(4)半监督学习(5)自监督学习(6)无监督学习(7)总结:不同…

5G学习笔记之PNI-NPN

目录 1. 概述 2. CAG 2.1 CAG ID 2.2 CAG信息配置 3. 网络选择/网络重选,小区选择/小区重选 4. 接入和拥塞控制 1. 概述 PNI-NPN,Public Network Integrated NPN,公共网络集成的非公共网络,依赖于PLMN网络,使用 CAG&am…

学习threejs,导入babylon格式的模型

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.BabylonLoader babyl…

计算机网络——网络层—IP数据报与分片

一、IP 数据报的格式 • 一个 IP 数据报由首部和数据两部分组成。 • 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。 • 在首部的固定部分的后面是一些可选字段,其长度是可变的。 IP 数据报首部的固定部分中的各字段 版…

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝,又进来偷我源码啦👊👊👊。欢迎偷源码 🔥🔥🔥 获取免费源码以及更多源码,可以私信联系我 我们常常…

React快速上手到项目实战总篇

React核心价值与前置知识 时刻保持对知识的渴望 家人们 开学!!! 核心价值 组件化(易开发易维护) 数据驱动视图 :定义好数据和ui的显示规则 即UIf(state) 只关注业务数据修改,不在操作DOM 增加开发效率 使用vite创建Recat项目 …

采用标准化的方式开展设计-研发中运用设计模式

概述 实现规范化、标准化的引导式设计,以业务需求为输入,识别业务特点,并通过引导式设计,找到最适合的设计模式、具体方案,汇总成为应用的设计,拉齐各应用的设计一的致性。 采用标准化的方式开展设计…

Web无障碍

文章目录 🟢Web Accessibility-Web无障碍🟢一、Web Accessibility-Web1. web无障碍设计2. demo3.使用相关相关开源无障碍工具条(调用可能会根据网络有点慢) 如有其他更好方案,可以私信我哦✒️总结 🟢Web Accessibility-Web无障碍…

计算机网络 (26)互联网的路由选择协议

一、路由选择协议的基本概念 路由选择协议是计算机网络中用于确定数据包在网络中传输路径的一种协议。它帮助路由器构建和维护路由表,以便根据目的地址将数据包转发到正确的下一跳路由器。路由选择协议分为静态路由选择协议和动态路由选择协议两大类。 二、静态路由…

江科大STM32入门——UART通信笔记总结

wx:嵌入式工程师成长日记 1、简介 简单双向串口通信有两根通信线(发送端TX和接收端RX)TX与RX要交叉连接当只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片 传输模式:全双工;时钟&…

分布式主键ID生成方式-snowflake雪花算法

这里写自定义目录标题 一、业务场景二、技术选型1、UUID方案2、Leaf方案-美团(基于数据库自增id)3、Snowflake雪花算法方案 总结 一、业务场景 大量的业务数据需要保存到数据库中,原来的单库单表的方式扛不住大数据量、高并发,需…