基于IMDB评论数据集的情感分析/LSTM/Pytorch

1 研究任务一介绍

1.1 研究任务

给定IMDB影评数据集,采用全连接层网络和LSTM模型两种机器学习算法进行二元情感分类,以准确率为评测指标,进行分类算法性能评估与结果分析。数据集官方网址:Sentiment Analysis

代码:链接:https://pan.baidu.com/s/1AECOPQugB4F54T5hvy7B2w?pwd=gw2i 
提取码:gw2i

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

  1. 读入文本ImdbDataset();
  2. 分词dataset_train.tokenlize();
  3. 建立字典,将每个词映射到唯一索引build_vocab();
  4. 将文本从词序列转换为索引序列,方便输入模型。

构造字典:vocab.py

  1. 词语存入字典dict(),根据次数对词语进行过滤,并统计词频fit();
  2. 实现文本转数字序列的方法transform();
  3. 实现数字序列转文本的方法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模型性能还有进一步提高的空间。

猜你喜欢

转载自blog.csdn.net/weixin_47546087/article/details/126652417