![cover](https://img-blog.csdnimg.cn/b90e26e10f6f4b17b95a6dbd11327cee.png)
基于IMDB评论数据集的情感分析/LSTM/Pytorch
输入门决定当前输入有多少保留下来,因为在序列输入中,并不是每个时刻的输入信息都同等重要,当输入完全没有用时,输入门关闭,此刻输入信息被丢弃。输出门决定当前memroy的信息有多少被立即输出,输出门打开时,会被全部输出,关闭时,当前memory中的信息不会被输出。有评级标签的IMDB数据集包含5万篇IMDB影评,负面评论得分=7,其中2.5万篇影评用于训练数据集,2.5万篇影评用于用于测试数据集,训
1 研究任务一介绍
1.1 研究任务
给定IMDB影评数据集,采用全连接层网络和LSTM模型两种机器学习算法进行二元情感分类,以准确率为评测指标,进行分类算法性能评估与结果分析。数据集官方网址:Sentiment Analysis
代码:链接:https://pan.baidu.com/s/1rYrGXWpqmuiar-c9RXx08A?pwd=sa3s
提取码:sa3s
1.2 研究内容的具体描述
IMDB影评数据集简介
这是用于二元情感分类的数据集,在NLP任务中经常被使用。
1、IMDB结构组成
有评级标签的IMDB数据集包含5万篇IMDB影评,负面评论得分<=4,正面评论得分>=7,其中2.5万篇影评用于训练数据集,2.5万篇影评用于用于测试数据集,训练集和测试集电影不相交。此外,还有另外5万篇没有任何评级标签的IMDB影评,用于无监督学习。
2、IMDB文件夹组成
IMDB数据集主要包括train和test两个文件夹,分别存放训练数据集与测试数据集。每个文件夹都包含neg和pos两个子文件夹,分别是负样本和正样本,train还包含一个unsup是未标注的样本,可用于非监督训练。
3、IMDB文件命名规则
样本文件的命名规则为“序号_评级”。其中“评级”可以分为0~9级。
2 研究方法原理与步骤
2.1 文本预处理
文本数据预处理步骤:build_vocab.py
- 读入文本ImdbDataset();
- 分词dataset_train.tokenlize();
- 建立字典,将每个词映射到唯一索引build_vocab();
- 将文本从词序列转换为索引序列,方便输入模型。
构造字典:vocab.py
- 词语存入字典dict(),根据次数对词语进行过滤,并统计词频fit();
- 实现文本转数字序列的方法transform();
- 实现数字序列转文本的方法inverse_transform()。
2.2 word embedding
word embedding是机器学习中表示文本常用的一种方法,用于文本转化为向量,使用浮点型稠密矩阵表示token,根据词典大小num_embeddings,指定维度参数embedding dim。
代码实现:self.embedding = nn.Embedding(num_embeddings=len(vocab), embedding_dim=embedding_dim, padding_idx=vocab.PAD)
2.3 全连接层网络
全连接层(fully connected layers, FC)在整个卷积神经网络中起到”分类器“的作用,将学到的分布式特征表示映射到样本标记空间。在实际使用中,全连接层可由卷积操作实现。在RNN中,全连接用来把embedding空间拉到隐层空间,把隐层空间转回label空间等。
在pytorch中的nn.Linear表示线性变换: ,其中x是输入,A是权值,b是偏置,y是输出。
网络结构:
class ImdbModel(nn.Module):
def __init__(self):
super(ImdbModel, self).__init__()
self.embedding = nn.Embedding(num_embeddings=len(voc_model), embedding_dim=200, padding_idx=voc_model.PAD)
self.fc = nn.Linear(sequence_max_len * 200, 2)
def forward(self, input):
input_embeded = self.embedding(input)
# 变形
input_embeded_viewed = input_embeded.view(input_embeded.size(0), -1)
# 全连接
out = self.fc(input_embeded_viewed)
return F.log_softmax(out, dim=-1)
超参数设置:
表1 超参数设置
训练次数 | epoch | 6 |
每次训练数据大小 | train_batch_size | 512 |
每次测试数据大小 | test_batch_size | 128 |
句子最大长度 | sequence_max_len | 100 |
Embedding维度 | embedding_dim | 200 |
2.4 LSTM模型
2.4.1 研究方法选择原因
LSTM(Long-Short Term Memory RNN)模型是文本处理中最为常用的RNN循环神经网络。
2.4.2 方法原理与步骤
图1 LSTM模型逻辑图
图中LSTM有四个输入,分别是input(模型输入),forget gate(遗忘门),input gate(输入门),以及output gate(输出门)。相比,LSTM参数量是普通神经网络的4倍。遗忘门决定前一刻memory是否会被记住,遗忘门打开时,前一刻记忆会被保留,关闭时,前一刻记忆会被清空。输入门决定当前输入有多少保留下来,因为在序列输入中,并不是每个时刻的输入信息都同等重要,当输入完全没有用时,输入门关闭,此刻输入信息被丢弃。输出门决定当前memroy的信息有多少被立即输出,输出门打开时,会被全部输出,关闭时,当前memory中的信息不会被输出。
图2 LSTM模型结构图
网络结构:
class ImdbModel(nn.Module):
def __init__(self):
super(ImdbModel, self).__init__()
self.embedding = nn.Embedding(num_embeddings=len(voc_model), embedding_dim=200, padding_idx=voc_model.PAD).to()
self.lstm = nn.LSTM(input_size=200, hidden_size=64, num_layers=2, batch_first=True, bidirectional=True,dropout=0.5)
self.fc1 = nn.Linear(64 * 2, 64)
self.fc2 = nn.Linear(64, 2)
def forward(self, input):
input_embeded = self.embedding(input)
output, (h_n, c_n) = self.lstm(input_embeded)
# out :[batch_size,hidden_size*2]
out = torch.cat([h_n[-1, :, :], h_n[-2, :, :]], dim=-1)
# 进行全连接
out_fc1 = self.fc1(out)
# 进行relu
out_fc1_relu = F.relu(out_fc1)
# 全连接
out_fc2 = self.fc2(out_fc1_relu) # out :[batch_size,2]
return F.log_softmax(out_fc2, dim=-1)
2.4.3 模型训练超参设置
模型训练:
def train(imdb_model, epoch):
train_dataloader = get_dataloader(train=True)
optimizer = Adam(imdb_model.parameters())
for i in range(epoch):
bar = tqdm(train_dataloader, total=len(train_dataloader))
for idx, (data, target) in enumerate(bar):
optimizer.zero_grad()
data = data.to(device())
target = target.to(device())
output = imdb_model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
bar.set_description("epcoh:{} idx:{} loss:{:.6f}".format(i,
超参数设置:
表2 超参数设置
训练次数 | epoch | 6 |
每次训练数据大小 | train_batch_size | 512 |
每次测试数据大小 | test_batch_size | 128 |
句子最大长度 | sequence_max_len | 100 |
Embedding维度 | embedding_dim | 200 |
3 实验结果及分析
3.1 实验结果
3.1.1 开发环境介绍
系统:Win7
处理器:Intel(R) Core(TM)i5-5200U CPU
内存:4G
软件:Pytorch 1.10.2、Python 3.6.5
3.1.2 性能评估指标介绍
表3 识别结果
正类 | 负类 | |
被检索 | True Positive | False Positive |
未检索 | False Negative | True Negative |
TP:被检索到正样本,实际也是正样本(正确识别)
FP:被检索到正样本,实际是负样本(一类错误识别)
FN:未被检索到正样本,实际是正样本(二类错误识别)
TN:未被检索到正样本,实际也是负样本(正确识别)
指标计算:
准确率: 分类正确的样本数 与 样本总数之比
Accuracy = (TP + TN) / (TP + FN + FP + TN)
3.1.3 实验结果
表4 两种算法准确率
Accuracy | |
全连接层网络 | 66.0% |
LSTM | 80.7% |
3.2 实验结果分析
仅全连接层网络经过6个Epochs的训练,准确率达到了66.0%;LSTM模型经过6个Epochs的训练,准确率达到了80.7%。全连接层网络和LSTM模型随着训练次数的增多,准确率不断提高,Loss 不断降低。由准确率表3可知,LSTM模型比全连接层网络的准确率更高。
4 结论
在全连接层网络基础上增加LSTM网络准确率提高了14%,达到了十分显著的效果。LSTM模型性能还有进一步提高的空间。
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)