news 2025/12/25 10:57:54

【自然语言处理】应用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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/18 9:36:02

5个高效方法优化二维码识别率

5个高效方法优化二维码识别率 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 二维码作为现代信息传递的重要载体,其识别效率直接影响用户体验。本文针对二维码识别率优化问题&…

作者头像 李华
网站建设 2025/12/21 16:33:48

5分钟掌握HIDDriver虚拟输入设备快速安装指南

5分钟掌握HIDDriver虚拟输入设备快速安装指南 【免费下载链接】HIDDriver 虚拟鼠标键盘驱动程序,使用驱动程序执行鼠标键盘操作。 项目地址: https://gitcode.com/gh_mirrors/hi/HIDDriver 想要实现毫秒级响应的虚拟鼠标键盘操作吗?HIDDriver作为…

作者头像 李华
网站建设 2025/12/18 9:35:35

基于mask-rcnn_regnetx的苹果成熟度检测系统实现与优化

本数据集为苹果成熟度检测数据集,采用YOLOv8格式标注,包含150张图像,分为新鲜苹果(fresh_apple)和腐烂苹果(rotten_apple)两个类别。数据集通过qunshankj平台于2024年11月1日创建,并于同年11月9日导出,遵循CC BY 4.0许…

作者头像 李华
网站建设 2025/12/18 9:35:06

【MCP续证冲刺班】:98%通过率背后的4大实战训练法

第一章:MCP续证考试全景解析微软认证专家(MCP)续证考试是维持技术资质有效性的重要环节,涉及知识更新、技能验证与实践能力评估。随着技术栈的快速演进,续证不仅考察原有知识点的掌握程度,更强调对新工具、…

作者头像 李华
网站建设 2025/12/25 9:56:47

匿名函数在 PHP 中是一个 Closure 类的实例的庖丁解牛

“匿名函数在 PHP 中是一个 Closure 类的实例”——这一陈述看似简单,却揭示了 PHP 如何将函数式编程的抽象概念(函数作为一等公民)落地为面向对象的内部实现。 这不仅是语言设计的巧妙妥协,更是其支持高阶函数、闭包、回调等现代…

作者头像 李华