news 2026/5/2 9:23:03

【自然语言处理】应用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/5/2 2:55:10

【MCP SC-400量子加密深度解析】:揭秘下一代数据安全防护核心技术

第一章:MCP SC-400量子加密深度解析MCP SC-400是一种前沿的量子加密通信协议,专为高安全等级的数据传输设计。其核心机制基于量子密钥分发(QKD),利用光子的量子态实现不可破解的密钥协商过程。该协议在金融、国防和关键…

作者头像 李华
网站建设 2026/5/1 10:22:24

零样本目标检测实战指南:用语言指令解锁图像理解新维度

零样本目标检测实战指南:用语言指令解锁图像理解新维度 【免费下载链接】GroundingDINO 论文 Grounding DINO: 将DINO与基于地面的预训练结合用于开放式目标检测 的官方实现。 项目地址: https://gitcode.com/GitHub_Trending/gr/GroundingDINO 在计算机视觉…

作者头像 李华
网站建设 2026/4/30 20:31:11

Mac百度网盘加速工具:解锁高速下载权限终极指南

还在为百度网盘的龟速下载而抓狂吗?😫 每次看到"剩余时间超过1天"的提示,是不是都想摔键盘?今天我要为你介绍一个能彻底改变这种困境的解决方案——BaiduNetdiskPlugin-macOS,这个开源插件能让你的下载速度直…

作者头像 李华
网站建设 2026/4/18 21:43:22

5个Lucide图标状态管理技巧,让你的UI交互更专业

5个Lucide图标状态管理技巧,让你的UI交互更专业 【免费下载链接】lucide Beautiful & consistent icon toolkit made by the community. Open-source project and a fork of Feather Icons. 项目地址: https://gitcode.com/GitHub_Trending/lu/lucide 在…

作者头像 李华
网站建设 2026/4/18 17:08:43

申硕成功!理工学院,将更名大学

点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号:CVer2233,小助手拉你进群!扫描下方二维码,加入CVer学术星球!可以获得最新顶会/顶…

作者头像 李华