当前位置: 首页 > news >正文

【自然语言处理】应用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')

小结

  • 预训练的词向量可以表示文本序列中的各个词元。
  • 双向循环神经网络可以表示文本序列。例如通过连结初始和最终时间步的隐状态,可以使用全连接的层将该单个文本表示转换为类别。
http://www.cnnetsun.cn/news/126304.html

相关文章:

  • 霍尔电流传感器使用年限多久,到期后必须更换么?
  • 亲测!山东好用AI公司实践案例分享
  • Zotero文献格式修复:告别混乱标题的专业解决方案
  • 12、网络间谍软件、犯罪与防范全解析
  • MCP DP-420图Agent查询性能提升:90%工程师忽略的3个关键优化点
  • Origin Private File System (OPFS):Web 上的高性能原生文件系统访问
  • 终极IDM使用指南:解锁完整版功能
  • PDF翻译效率革命:智能解析与格式无损转换技术深度解析
  • 5个必学技巧:在MacBook Pro上极致发挥AI图像放大潜力
  • springboot基于Java Web的虚拟实验室设备租赁管理系统的设计与实现_x69d6kd5
  • springboot基于SSM框架的家庭个人收支管理系统_za55mo75
  • Diff Checker:高效文件差异对比工具完整指南
  • KlipperScreen终极部署指南:从零打造专业级3D打印机触控界面
  • 数智化不动产登记与地籍信息化建设方案
  • 【办公类-39-07】20251217通义万相动物图(万相2.6 数字人-对口型)
  • cursor-free-vip终极指南:一键突破AI工具限制的完整方案
  • MTK设备启动保护机制绕过实用教程:高效解锁工具深度解析
  • 20、毫米波(mmWave)介质访问控制综述
  • 42、LINQ查询表达式与.NET集合类型详解
  • vue+springboot社区外来务工人员管理系统_数据分析可视化大屏系统10vz9c0a_jz119
  • 53、多线程编程中的同步、存储、定时器与异步编程模型解析
  • 55、.NET 多线程与平台互操作性编程指南
  • 二十二、【鸿蒙 NEXT】扫码功能
  • 企业微信会话存档Go SDK架构深度解析:高性能消息处理实践指南
  • MetroFramework终极指南:快速将传统WinForms应用升级为现代UI
  • 5分钟搞定!智能代码提取神器让软件著作权申请不再头疼
  • JVM 调优工具深度指南:从监控到诊断的全流程实战
  • ScratchJr-Desktop终极安装配置指南:从零开始快速搭建免费儿童编程环境
  • 杜比大喇叭β版:5个步骤解锁网易云音乐专业音效体验
  • 5分钟快速上手:Vue-Flow-Editor可视化流程编辑器完整指南