《昇思25天学习打卡营第23天|RNN实现情感分类》

使用RNN进行情感分类:基于IMDB数据集的LSTM应用

引言

情感分析是自然语言处理(NLP)中的一个重要应用,广泛用于电影评论、社交媒体等文本数据的情感分类任务。本文将介绍如何使用递归神经网络(RNN)实现情感分类,重点讲解LSTM(长短期记忆网络)如何解决梯度消失问题,并以IMDB电影评论数据集为例。
实现如下的效果:

输入: This film is terrible
正确标签: Negative
预测标签: Negative

输入: This film is great
正确标签: Positive
预测标签: Positive

RNN简介

递归神经网络(RNN)是一种用于处理序列数据的神经网络,它通过隐藏状态(hidden state)将前一个时间步的信息传递到下一个时间步,从而捕捉序列中的依赖关系。尽管RNN在理论上可以处理任意长度的序列,但在实践中往往会遇到梯度消失和梯度爆炸问题,特别是在处理长序列时。

RNN(循环神经网络)
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的神经网络。下图为RNN的一般结构:
请添加图片描述

图示左侧为一个RNN Cell循环,右侧为RNN的链式连接平铺。实际上不管是单个RNN Cell还是一个RNN网络,都只有一个Cell的参数,在不断进行循环计算中更新。

由于RNN的循环特性,和自然语言文本的序列特性(句子是由单词组成的序列)十分匹配,因此被大量应用于自然语言处理研究中。下图为RNN的结构拆解:

请添加图片描述

RNN单个Cell的结构简单,因此也造成了梯度消失(Gradient Vanishing)问题,具体表现为RNN网络在序列较长时,在序列尾部已经基本丢失了序列首部的信息。为了克服这一问题,LSTM(Long short-term memory)被提出,通过门控机制(Gating Mechanism)来控制信息流在每个循环步中的留存和丢弃。下图为LSTM的结构拆解:

请添加图片描述

本节我们选择LSTM变种而不是经典的RNN做特征提取,来规避梯度消失问题,并获得更好的模型效果。下面来看MindSpore中nn.LSTM对应的公式:

ℎ0:𝑡,(ℎ𝑡,𝑐𝑡)=LSTM(𝑥0:𝑡,(ℎ0,𝑐0))

这里nn.LSTM隐藏了整个循环神经网络在序列时间步(Time step)上的循环,送入输入序列、初始状态,即可获得每个时间步的隐状态(hidden state)拼接而成的矩阵,以及最后一个时间步对应的隐状态。我们使用最后的一个时间步的隐状态作为输入句子的编码特征,送入下一层。

LSTM如何解决梯度消失问题

LSTM是一种特殊的RNN结构,通过引入门控机制(gating mechanism),有效地缓解了梯度消失问题。LSTM的核心是其单元状态(cell state),以及三个门(输入门、遗忘门和输出门),分别用于控制信息的写入、保留和输出:

  1. 输入门:决定当前输入信息有多少被写入单元状态。
  2. 遗忘门:决定当前单元状态有多少被保留。
  3. 输出门:决定单元状态的哪一部分输出到隐藏状态。

这些门控机制使LSTM能够在较长时间跨度上保留和利用重要信息,避免梯度在反向传播过程中过早消失。

IMDB数据集

IMDB数据集是一个广泛用于情感分析任务的标准数据集,包含来自IMDB的25,000条电影评论,每条评论都被标记为正面或负面情感。

RNN与LSTM的应用原理

在情感分类任务中,我们将每条电影评论作为一个序列输入到LSTM模型中,模型会学习每个单词在序列中的位置和作用,从而根据整条评论的内容预测其情感标签。

具体步骤

  1. 数据预处理:将文本数据转化为数值表示,例如使用词嵌入(word embedding)将单词转化为向量。
  2. 模型构建:使用LSTM构建模型,将评论的向量序列输入到LSTM层,然后通过全连接层和BCEWithLogitsLoss函数输出情感分类结果。
  3. 训练模型:使用带标签的评论数据训练模型,调整模型参数以最小化分类误差。
  4. 预测与评估:使用训练好的模型对新评论进行情感预测,并评估模型的性能。

在这里插入图片描述

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用RNN实现情感分类的代码示例: ``` import numpy as np import pandas as pd import tensorflow as tf from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Embedding, LSTM, SpatialDropout1D from sklearn.model_selection import train_test_split # 读取数据集 data = pd.read_csv('sentiment_analysis.csv') data = data[['text', 'sentiment']] data = data[data.sentiment != "Neutral"] data['text'] = data['text'].apply(lambda x: x.lower()) data['text'] = data['text'].apply((lambda x: re.sub('[^a-zA-z0-9\s]', '', x))) # 获取文本和标签 texts = data['text'].values labels = pd.get_dummies(data['sentiment']).values # 对文本进行分词,并将每个词转换为数字 tokenizer = Tokenizer(num_words=2000, split=' ') tokenizer.fit_on_texts(texts) X = tokenizer.texts_to_sequences(texts) X = pad_sequences(X) # 划分数据集 X_train, X_test, Y_train, Y_test = train_test_split(X, labels, test_size=0.33, random_state=42) # 构建RNN模型 embed_dim = 128 lstm_out = 196 model = Sequential() model.add(Embedding(2000, embed_dim, input_length=X.shape[1])) model.add(SpatialDropout1D(0.4)) model.add(LSTM(lstm_out, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 batch_size = 32 model.fit(X_train, Y_train, epochs=10, batch_size=batch_size, verbose=2) # 评估模型 score, acc = model.evaluate(X_test, Y_test, verbose=2, batch_size=batch_size) print("score: %.2f" % (score)) print("acc: %.2f" % (acc)) ``` 在这个示例中,我们首先读取数据集并对文本进行预处理。然后,我们使用Tokenizer将文本转换为数字,并使用pad_sequences将每个序列填充到相同的长度。然后,我们将数据集划分为训练集和测试集。 接下来,我们构建RNN模型。我们使用Embedding层将每个数字转换为向量,然后添加SpatialDropout1D层和LSTM层。最后,我们添加一个Dense层,并使用softmax激活函数对输出进行分类。我们使用categorical_crossentropy作为损失函数,使用adam优化器进行训练,并使用accuracy作为评估指标。 最后,我们训练模型并评估其性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值