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

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

  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模型性能还有进一步提高的空间。

  • 3
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
嗨!对于使用PyTorch进行IMDB情感分类的任务,你可以按照以下步骤进行操作: 1. 数据预处理:首先,需要将IMDB数据集加载到你的程序中。可以使用`torchtext`库来下载和处理数据集。将数据集分为训练集和测试集,并进行标记化和分词等预处理操作。 2. 构建词汇表:使用训练集创建一个词汇表,将单词映射到唯一的整数标识符。可以使用`torchtext.vocab`中的`build_vocab_from_iterator`函数来构建词汇表。 3. 创建数据加载器:使用`torch.utils.data.Dataset`和`torch.utils.data.DataLoader`来创建训练集和测试集的数据加载器。可以使用`torchtext.data.Field`来定义数据的预处理方式。 4. 定义模型:使用PyTorch的`nn.Module`来定义你的LSTM模型。可以使用`nn.Embedding`层将整数标识符转换为词嵌入向量,并将其输入到一个或多个LSTM层中。 5. 训练模型:使用训练集数据加载器迭代训练模型。在每个批次中,将输入数据传递给模型,计算损失函数并进行反向传播优化。 6. 评估模型:使用测试集数据加载器评估模型的性能。计算模型在测试集上的准确率或其他评估指标。 7. 进行预测:使用经过训练的模型对新的文本进行情感分类预测。将文本输入模型并解码输出的类别标签。 以上是一个基本的框架,你可以根据需要进行调整和改进。希望对你有所帮助!如果有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cucjing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值