news 2026/8/21 6:49:45

【自然语言处理】应用02:情感分析:使用循环神经网络

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【自然语言处理】应用02:情感分析:使用循环神经网络

【作者主页】Francek Chen
【专栏介绍】⌈ ⌈PyTorch深度学习⌋ ⌋深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。

文章目录

    • 一、使用循环神经网络表示单个文本
    • 二、加载预训练的词向量
    • 三、训练和评估模型
    • 小结

与词相似度和类比任务一样,我们也可以将预先训练的词向量应用于情感分析。由于情感分析及数据集中的IMDb评论数据集不是很大,使用在大规模语料库上预训练的文本表示可以减少模型的过拟合。作为图1中所示的具体示例,我们将使用预训练的GloVe模型来表示每个词元,并将这些词元表示送入多层双向循环神经网络以获得文本序列表示,该文本序列表示将被转换为情感分析输出。对于相同的下游应用,我们稍后将考虑不同的架构选择。

图1 将GloVe送入基于循环神经网络的架构进行情感分析
importtorchfromtorchimportnnfromd2limporttorchasd2l batch_size=64train_iter,test_iter,vocab=d2l.load_data_imdb(batch_size)

一、使用循环神经网络表示单个文本

在文本分类任务(如情感分析)中,可变长度的文本序列将被转换为固定长度的类别。在下面的BiRNN类中,虽然文本序列的每个词元经由嵌入层(self.embedding)获得其单独的预训练GloVe表示,但是整个序列由双向循环神经网络(self.encoder)编码。更具体地说,双向长短期记忆网络在初始和最终时间步的隐状态(在最后一层)被连结起来作为文本序列的表示。然后,通过一个具有两个输出(“积极”和“消极”)的全连接层(self.decoder),将此单一文本表示转换为输出类别。

classBiRNN(nn.Module):def__init__(self,vocab_size,embed_size,num_hiddens,num_layers,**kwargs):super(BiRNN,self).__init__(**kwargs)self.embedding=nn.Embedding(vocab_size,embed_size)# 将bidirectional设置为True以获取双向循环神经网络self.encoder=nn.LSTM(embed_size,num_hiddens,num_layers=num_layers,bidirectional=True)self.decoder=nn.Linear(4*num_hiddens,2)defforward(self,inputs):# inputs的形状是(批量大小,时间步数)# 因为长短期记忆网络要求其输入的第一个维度是时间维,# 所以在获得词元表示之前,输入会被转置。# 输出形状为(时间步数,批量大小,词向量维度)embeddings=self.embedding(inputs.T)self.encoder.flatten_parameters()# 返回上一个隐藏层在不同时间步的隐状态,# outputs的形状是(时间步数,批量大小,2*隐藏单元数)outputs,_=self.encoder(embeddings)# 连结初始和最终时间步的隐状态,作为全连接层的输入,# 其形状为(批量大小,4*隐藏单元数)encoding=torch.cat((outputs[0],outputs[-1]),dim=1)outs=self.decoder(encoding)returnouts

让我们构造一个具有两个隐藏层的双向循环神经网络来表示单个文本以进行情感分析。

embed_size,num_hiddens,num_layers=100,100,2devices=d2l.try_all_gpus()net=BiRNN(len(vocab),embed_size,num_hiddens,num_layers)
definit_weights(m):iftype(m)==nn.Linear:nn.init.xavier_uniform_(m.weight)iftype(m)==nn.LSTM:forparaminm._flat_weights_names:if"weight"inparam:nn.init.xavier_uniform_(m._parameters[param])net.apply(init_weights);

二、加载预训练的词向量

下面,我们为词表中的单词加载预训练的100维(需要与embed_size一致)的GloVe嵌入。

glove_embedding=d2l.TokenEmbedding('glove.6b.100d')

打印词表中所有词元向量的形状。

embeds=glove_embedding[vocab.idx_to_token]embeds.shape

我们使用这些预训练的词向量来表示评论中的词元,并且在训练期间不要更新这些向量。

net.embedding.weight.data.copy_(embeds)net.embedding.weight.requires_grad=False

三、训练和评估模型

现在我们可以训练双向循环神经网络进行情感分析。

lr,num_epochs=0.01,5trainer=torch.optim.Adam(net.parameters(),lr=lr)loss=nn.CrossEntropyLoss(reduction="none")d2l.train_ch13(net,train_iter,test_iter,loss,trainer,num_epochs,devices)


我们定义以下函数来使用训练好的模型net预测文本序列的情感。

#@savedefpredict_sentiment(net,vocab,sequence):"""预测文本序列的情感"""sequence=torch.tensor(vocab[sequence.split()],device=d2l.try_gpu())label=torch.argmax(net(sequence.reshape(1,-1)),dim=1)return'positive'iflabel==1else'negative'

最后,让我们使用训练好的模型对两个简单的句子进行情感预测。

predict_sentiment(net,vocab,'this movie is so great')

predict_sentiment(net,vocab,'this movie is so bad')

小结

  • 预训练的词向量可以表示文本序列中的各个词元。
  • 双向循环神经网络可以表示文本序列。例如通过连结初始和最终时间步的隐状态,可以使用全连接的层将该单个文本表示转换为类别。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 22:59:15

PyQt-Fluent-Widgets滚动区域终极指南:打造桌面应用流畅体验

PyQt-Fluent-Widgets滚动区域终极指南:打造桌面应用流畅体验 【免费下载链接】PyQt-Fluent-Widgets A fluent design widgets library based on C Qt/PyQt/PySide. Make Qt Great Again. 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Fluent-Widgets 想…

作者头像 李华
网站建设 2026/8/22 1:18:06

毕业设计 深度学习智慧农业yolo苹果采摘护理定位辅助系统(源码+论文)

文章目录0 前言1 项目运行效果2 课题背景2.1 农业智能化发展需求2.2 计算机视觉技术发展2.3 现有技术瓶颈2.4 本课题创新点2.5 应用价值预测3 设计框架3.1. 系统概述3.2. 技术架构3.2.1 核心技术栈3.2.2 系统架构图3.3. 系统组件详解3.3.1 模型推理组件3.3.1.1 YOLO模型特点3.3…

作者头像 李华
网站建设 2026/8/21 9:47:29

还在用传统测试工具?,MCP PL-600 Agent 6项智能功能彻底颠覆你的认知

第一章:MCP PL-600 Agent 功能测试概述MCP PL-600 Agent 是一款专为工业自动化控制系统设计的通信协议代理模块,用于实现上位机与现场设备之间的高效数据交互。其核心功能包括协议转换、数据缓存、故障诊断和安全加密传输。为确保系统在复杂工况下的稳定…

作者头像 李华
网站建设 2026/8/21 2:32:43

深度剖析:为何 `pthread_cond_wait` 必须置于 `while` 循环中?

各类资料学习下载合集 链接:https://pan.quark.cn/s/7c8c391011eb 在上一篇博客中,我们已经初步实现了基于条件变量的生产者-消费者模型。然而,当涉及到多消费者场景时,我们对代码的严谨性提出了更高的要求。本文将详细讲解 pthread_cond_wait 的正确使用姿势,特别是为什…

作者头像 李华
网站建设 2026/8/21 3:56:36

ARM Cortex嵌入式信号处理实战指南:从痛点诊断到性能突破

在ARM Cortex嵌入式开发中,你是否经常面临这样的困境:信号处理算法在PC上运行良好,移植到嵌入式环境却性能急剧下降?实时性要求难以满足,内存占用超出预期?CMSIS-DSP正是为解决这些痛点而生的专业信号处理库…

作者头像 李华
网站建设 2026/8/21 16:08:49

Chrome Tab Modifier完全指南:快速实现标签页智能管理

Chrome Tab Modifier完全指南:快速实现标签页智能管理 【免费下载链接】chrome-tab-modifier Take control of your tabs 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-tab-modifier Chrome Tab Modifier是一款功能强大的开源浏览器扩展,…

作者头像 李华