news 2026/7/21 16:22:02

【自然语言处理】应用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/7/19 11:29:08

霍尔电流传感器使用年限多久,到期后必须更换么?

在新能源发电、工业控制、汽车电子等核心领域,霍尔电流传感器的稳定运行直接关系到系统的安全与精度。不少用户对其使用年限存在困惑:究竟能用多久?是否到了标称年限就必须更换?过度提前更换会造成成本浪费,而忽视老化…

作者头像 李华
网站建设 2026/7/20 15:44:57

亲测!山东好用AI公司实践案例分享

亲测!山东好用AI公司实践案例分享行业痛点分析在山东AI公司领域,当前面临着诸多技术挑战。首先,数据处理与分析能力不足是一大难题。大量的市场数据、客户行为数据等如同一团乱麻,难以有效梳理和挖掘出有价值的信息。测试显示&…

作者头像 李华
网站建设 2026/7/20 15:12:50

Zotero文献格式修复:告别混乱标题的专业解决方案

Zotero文献格式修复:告别混乱标题的专业解决方案 【免费下载链接】zotero-format-metadata Linter for Zotero. An addon for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item language…

作者头像 李华
网站建设 2026/7/20 21:49:20

12、网络间谍软件、犯罪与防范全解析

网络间谍软件、犯罪与防范全解析 1. 网络安全工具介绍 在网络安全领域,有许多实用的工具可用于监测和分析网络状况,帮助我们及时发现潜在的威胁。 - Ourmon :它主要用于收集网络性能和异常信息,还能生成关于IRC流量和僵尸网络分析的定制报告。你可以在 http://Ourmon…

作者头像 李华
网站建设 2026/7/21 11:14:07

MCP DP-420图Agent查询性能提升:90%工程师忽略的3个关键优化点

第一章:MCP DP-420图Agent查询性能优化概述在处理大规模图数据时,MCP DP-420图Agent的查询性能直接影响系统的响应效率与用户体验。随着图谱规模的增长,传统查询机制可能面临延迟高、资源消耗大等问题,因此必须从架构设计、索引策…

作者头像 李华
网站建设 2026/7/21 6:58:22

Origin Private File System (OPFS):Web 上的高性能原生文件系统访问

Origin Private File System (OPFS):Web 上的高性能原生文件系统访问 大家好,欢迎来到今天的讲座。我是你们的技术讲师,今天我们将深入探讨一个近年来在 Web 开发领域引起广泛关注的新特性 —— Origin Private File System(简称…

作者头像 李华