竞赛 GRU的 电影评论情感分析 - python 深度学习 情感分类

1 前言

🔥学长分享优质竞赛项目,今天要分享的是

🚩 GRU的 电影评论情感分析 - python 深度学习 情感分类

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

这是一个较为新颖的竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 项目介绍

其实,很明显这个项目和微博谣言检测是一样的,也是个二分类的问题,因此,我们可以用到学长之前提到的各种方法,即:

朴素贝叶斯或者逻辑回归以及支持向量机都可以解决这个问题。

另外在深度学习中,我们可以用CNN-Text或者RNN以及LSTM等模型最好。

当然在构建网络中也相对简单,相对而言,LSTM就比较复杂了,为了让不同层次的同学们可以接受,学长就用了相对简单的GRU模型。

如果大家想了解LSTM。以后,学长会给大家详细介绍。

2 情感分类介绍

其实情感分析在自然语言处理中,情感分析一般指判断一段文本所表达的情绪状态,属于文本分类问题。一般而言:情绪类别:正面/负面。当然,这就是为什么本人在前面提到情感分析实际上也是二分类问题的原因。

3 数据集

学长本次使用的是非常典型的IMDB数据集。

该数据集包含来自互联网的50000条严重两极分化的评论,该数据被分为用于训练的25000条评论和用于测试的25000条评论,训练集和测试集都包含50%的正面评价和50%的负面评价。该数据集已经经过预处理:评论(单词序列)已经被转换为整数序列,其中每个整数代表字典中的某个单词。

查看其数据集的文件夹:这是train和test文件夹。

在这里插入图片描述

接下来就是以train文件夹介绍里面的内容
在这里插入图片描述

然后就是以neg文件夹介绍里面的内容,里面会有若干的text文件:
在这里插入图片描述

4 实现

4.1 数据预处理

    #导入必要的包import zipfile
​    import os
​    import io
​    import random
​    import json
​    import matplotlib.pyplot as plt
​    import numpy as np
​    import paddle
​    import paddle.fluid as fluid
​    from paddle.fluid.dygraph.nn import Conv2D, Pool2D, Linear, Embedding
​    from paddle.fluid.dygraph.base import to_variable
​    from paddle.fluid.dygraph import GRUUnit
​    import paddle.dataset.imdb as imdb


​    
​    
​    #加载字典def load_vocab():
​        vocab = imdb.word_dict()return vocab
​    #定义数据生成器class SentaProcessor(object):def __init__(self):
​            self.vocab = load_vocab()
   def data_generator(self, batch_size, phase='train'):
        if phase == "train":
            return paddle.batch(paddle.reader.shuffle(imdb.train(self.vocab),25000), batch_size, drop_last=True)
        elif phase == "eval":
            return paddle.batch(imdb.test(self.vocab), batch_size,drop_last=True)
        else:
            raise ValueError(
                "Unknown phase, which should be in ['train', 'eval']")

步骤

  1. 首先导入必要的第三方库

  2. 接下来就是数据预处理,需要注意的是:数据是以数据标签的方式表示一个句子,因此,每个句子都是以一串整数来表示的,每个数字都是对应一个单词。当然,数据集就会有一个数据集字典,这个字典是训练数据中出现单词对应的数字标签。

4.2 构建网络

这次的GRU模型分为以下的几个步骤

  • 定义网络
  • 定义损失函数
  • 定义优化算法

具体实现如下

    #定义动态GRU
    class DynamicGRU(fluid.dygraph.Layer):
        def __init__(self,
                     size,
                     param_attr=None,
                     bias_attr=None,
                     is_reverse=False,
                     gate_activation='sigmoid',
                     candidate_activation='relu',
                     h_0=None,
                     origin_mode=False,
                     ):
            super(DynamicGRU, self).__init__()
            self.gru_unit = GRUUnit(
                size * 3,
                param_attr=param_attr,
                bias_attr=bias_attr,
                activation=candidate_activation,
                gate_activation=gate_activation,
                origin_mode=origin_mode)
            self.size = size
            self.h_0 = h_0
            self.is_reverse = is_reverse
        def forward(self, inputs):
            hidden = self.h_0
            res = []
            for i in range(inputs.shape[1]):
                if self.is_reverse:
                    i = inputs.shape[1] - 1 - i
                input_ = inputs[ :, i:i+1, :]
                input_ = fluid.layers.reshape(input_, [-1, input_.shape[2]], inplace=False)
                hidden, reset, gate = self.gru_unit(input_, hidden)
                hidden_ = fluid.layers.reshape(hidden, [-1, 1, hidden.shape[1]], inplace=False)
                res.append(hidden_)
            if self.is_reverse:
                res = res[::-1]
            res = fluid.layers.concat(res, axis=1)
            return res


class GRU(fluid.dygraph.Layer):
def init(self):
super(GRU, self).init()
self.dict_dim = train_parameters[“vocab_size”]
self.emb_dim = 128
self.hid_dim = 128
self.fc_hid_dim = 96
self.class_dim = 2
self.batch_size = train_parameters[“batch_size”]
self.seq_len = train_parameters[“padding_size”]
self.embedding = Embedding(
size=[self.dict_dim + 1, self.emb_dim],
dtype=‘float32’,
param_attr=fluid.ParamAttr(learning_rate=30),
is_sparse=False)
h_0 = np.zeros((self.batch_size, self.hid_dim), dtype=“float32”)
h_0 = to_variable(h_0)

        self._fc1 = Linear(input_dim=self.hid_dim, output_dim=self.hid_dim*3)
        self._fc2 = Linear(input_dim=self.hid_dim, output_dim=self.fc_hid_dim, act="relu")
        self._fc_prediction = Linear(input_dim=self.fc_hid_dim,
                                output_dim=self.class_dim,
                                act="softmax")
        self._gru = DynamicGRU(size=self.hid_dim, h_0=h_0)
        
    def forward(self, inputs, label=None):
        emb = self.embedding(inputs)
        o_np_mask =to_variable(inputs.numpy().reshape(-1,1) != self.dict_dim).astype('float32')
        mask_emb = fluid.layers.expand(
            to_variable(o_np_mask), [1, self.hid_dim])
        emb = emb * mask_emb
        emb = fluid.layers.reshape(emb, shape=[self.batch_size, -1, self.hid_dim])
        fc_1 = self._fc1(emb)
        gru_hidden = self._gru(fc_1)
        gru_hidden = fluid.layers.reduce_max(gru_hidden, dim=1)
        tanh_1 = fluid.layers.tanh(gru_hidden)
        fc_2 = self._fc2(tanh_1)
        prediction = self._fc_prediction(fc_2)
        
        if label is not None:
            acc = fluid.layers.accuracy(prediction, label=label)
            return prediction, acc
        else:
            return prediction

4.3 训练模型

    def train():
        with fluid.dygraph.guard(place = fluid.CUDAPlace(0)): # # 因为要进行很大规模的训练,因此我们用的是GPU,如果没有安装GPU的可以使用下面一句,把这句代码注释掉即可
        # with fluid.dygraph.guard(place = fluid.CPUPlace()):


processor = SentaProcessor()
train_data_generator = processor.data_generator(batch_size=train_parameters[“batch_size”], phase=‘train’)

        model = GRU()
        sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=train_parameters["lr"],parameter_list=model.parameters())

        steps = 0
        Iters, total_loss, total_acc = [], [], []
        for eop in range(train_parameters["epoch"]):
            for batch_id, data in enumerate(train_data_generator()):

                steps += 1
                doc = to_variable(
                    np.array([
                        np.pad(x[0][0:train_parameters["padding_size"]], 
                              (0, train_parameters["padding_size"] - len(x[0][0:train_parameters["padding_size"]])),
                               'constant',
                              constant_values=(train_parameters["vocab_size"]))
                        for x in data
                    ]).astype('int64').reshape(-1))
                label = to_variable(
                    np.array([x[1] for x in data]).astype('int64').reshape(
                        train_parameters["batch_size"], 1))
        
                model.train()
                prediction, acc = model(doc, label)
                loss = fluid.layers.cross_entropy(prediction, label)
                avg_loss = fluid.layers.mean(loss)
                avg_loss.backward()
                sgd_optimizer.minimize(avg_loss)
                model.clear_gradients()
 
                if steps % train_parameters["skip_steps"] == 0:
                    Iters.append(steps)
                    total_loss.append(avg_loss.numpy()[0])
                    total_acc.append(acc.numpy()[0])
                    print("step: %d, ave loss: %f, ave acc: %f" %
                         (steps,avg_loss.numpy(),acc.numpy()))

                if steps % train_parameters["save_steps"] == 0:
                    save_path = train_parameters["checkpoints"]+"/"+"save_dir_" + str(steps)
                    print('save model to: ' + save_path)
                    fluid.dygraph.save_dygraph(model.state_dict(),
                                                   save_path)
    draw_train_process(Iters, total_loss, total_acc)

在这里插入图片描述
在这里插入图片描述

4.4 模型评估

在这里插入图片描述

结果还可以,这里说明的是,刚开始的模型训练评估不可能这么好,很明显是过拟合的问题,这就需要我们调整我们的epoch、batchsize、激活函数的选择以及优化器、学习率等各种参数,通过不断的调试、训练最好可以得到不错的结果,但是,如果还要更好的模型效果,其实可以将GRU模型换为更为合适的RNN中的LSTM以及bi-
LSTM模型会好很多。

4.5 模型预测

train_parameters["batch_size"] = 1
with fluid.dygraph.guard(place = fluid.CUDAPlace(0)):

    sentences = 'this is a great movie'
    data = load_data(sentences)
    print(sentences)
    print(data)
    data_np = np.array(data)
    data_np = np.array(np.pad(data_np,(0,150-len(data_np)),"constant",constant_values =train_parameters["vocab_size"])).astype('int64').reshape(-1)
    infer_np_doc = to_variable(data_np)

    model_infer = GRU()
    model, _ = fluid.load_dygraph("data/save_dir_750.pdparams")
    model_infer.load_dict(model)
    model_infer.eval()
    result = model_infer(infer_np_doc)
    print('预测结果为:正面概率为:%0.5f,负面概率为:%0.5f' % (result.numpy()[0][0],result.numpy()[0][1]))

在这里插入图片描述

训练的结果还是挺满意的,到此为止,我们的本次项目实验到此结束。

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/473314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Excel使用VLOOKUP函数

VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) 释义: lookup_value:要查找的值,包括数字,文本等 table_array:要查找的值以及预期返回的内容所在的区域 col_index_num:查找的区域的列…

mysql配置

MySQL数据库的介绍 MySQL是一个关系型数据库管理系统,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件,它是由瑞典MySQL AB 公司开发,目前属于 Oracle 旗…

拿来就能用 | ESP AI音箱方案介绍

本案例使用ESP-BOX和OpenAI API开发一款语音控制的聊天机器人(chatbot)。 猜猜我是谁?ESP AI音箱方案体验 ESP-BOX AI音箱方案介绍 本案例将介绍如何使用ESP-BOX和OpenAI API开发一款语音控制的聊天机器人。该系统可以接收用户的语音指令,将其展示在屏幕…

敏捷开发最佳实践:学习与改进维度实践案例之会诊式培养敏捷教练

自组织团队能够定期反思并采取针对性行动来提升人效,但2022年的敏捷调研发现,70%的中国企业在学习和改进方面仍停留在团队级。本节实践案例将分享“会诊式培养敏捷教练”的具体做法,突出了敏捷以人为本的学习和改进,强调了通过人员…

阿里云轻量应用服务器和ECS服务器有啥区别?2024年整理对比表

阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…

简介:使用TensorFlow实现python简版神经网络模型

如果你想进一步深入AI编程的魔法世界,那么TensorFlow和PyTorch这两个深度学习框架将是你的不二之选。它们可以帮助你构建更加复杂的神经网络模型,实现图像识别、语音识别等高级功能。 模型原理:神经网络是一种模拟人脑神经元结构的计算模型&a…

抖音视频批量下载软件可导出视频分享链接|手机网页视频提取|视频爬虫采集工具

解锁抖音视频无水印批量下载新姿势! 在快节奏的生活中,抖音作为时下最热门的短视频平台之一,吸引着广大用户的目光。而如何高效地获取喜欢的视频内容成为了许多人关注的焦点。Q:290615413现在,我们推出的抖音视频批量下载软件&…

【概念】神马是分布式?

SueWakeup​​​​​ 个人主页:SueWakeup 系列专栏:学习Java框架 个性签名:保留赤子之心也许是种幸运吧 本文封面由 凯楠📷 友情赞助播出! 目录 前言 1. 系统架构的演变 2. SOA 与微服务的关系 3. 分布式核心知识…

元器件应用中的深力科推荐SZ1SMA5945BT3G 车规级齐纳二极管

SZ1SMA5945BT3G是一款1.5W齐纳二极管是为通用电压调节应用而设计的。 安森美深力科齐纳二极管专为稳压电路设计,提供广泛的工作电压和额定功率。 关于齐纳二极管基本知识: 齐纳二极管,又称稳压二极管。利用PN结的反向击穿状态,…

开发语言详解(python、java、Go(Golong)。。。。)

是语言决定行业,还是行业决定语言,说不清,只是觉得,当你做这一行的时候,如果你还有精力感兴趣的话,可以再做些了解,一下是自己个人见解以及官网做的整合。希望对大家有用。 目录 Python 概念&…

微软聘请了谷歌DeepMind的联合创始人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

C#中右键通过listview来控制datagridview字段值的是否显示、显示顺序,并存储到XML中。

最终显示效果,如下图所示: datagridview开始显示通过调用XML存储的字段值及顺序来显示,右键调出Tools来控制显示的顺序及是否显示,通过加号和减号进行调整顺序。 XML存储字段值及顺序 主要代码及事件: 获取datagridv…

前后端分离项目springsecurity实现用户登录认证快速使用

目录 1、引入依赖 2、创建类继承WebSecurityConfigurerAdapter (1)重写里面的configure(HttpSecurity http)方法 (2)重写AuthenticationManager authenticationManagerBean() (3)密码加密工具 3、继承…

支付宝手机网站支付,微信扫描二维码支付

支付宝手机网站支付 支付宝文档 响应示例 <form name"punchout_form" method"post" action"https://openapi.alipay.com/gateway.do?charsetUTF-8&methodalipay.trade.wap.pay&formatjson&signERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE…

【用法总结】Systrace使用基础

【用法总结】Systrace使用基础 一、systrace基本介绍被弃用了?二、快捷键用法二、systrace命令用法2.1 命令格式:2.2 option取值:2.3 category取值:2.4 命令用法举例:2.5 快捷键用法:三、systrace报告怎么看?3.1 CPU调度信息3.2 线程状态信息3.2.1 绿色 : 运行中(Runni…

MyBatis3源码深度解析(十七)MyBatis缓存(一)一级缓存和二级缓存的实现原理

文章目录 前言第六章 MyBatis缓存6.1 MyBatis缓存实现类6.2 MyBatis一级缓存实现原理6.2.1 一级缓存在查询时的使用6.2.2 一级缓存在更新时的清空 6.3 MyBatis二级缓存的实现原理6.3.1 实现的二级缓存的Executor类型6.3.2 二级缓存在查询时使用6.3.3 二级缓存在更新时清空 前言…

thresh:基于Flutter的移动跨平台动态UI框架

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;在移动应用开发的领域里&#xff0c;跨平台框架一直是一个热门话题。随着技术的不断发展&#xff0c;开发者们对于能够快速构建高质量、多平台兼容的应用的需求也越来越强烈。而Flutter&#xff0c;作为Google推出的一个高性能…

java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics

今天在使用springBoot连接influxdb报错 java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics 详细报错如下&#xff0c;提出我们缺少一个依赖 原因是由于创建influxdb客户端缺少Kotlin运行时库 解决办法就是 1.显示的添加okhttp的依赖 <dependency>…

华为综合案例-普通WLAN全覆盖配置(1)

适用范围和业务需求 适用范围 本案例适用于大多数场景&#xff0c;如办公室、普通教室、会议室等普通非高密场景。 业务需求 主要业务需求如下&#xff1a; 接入需求 随时、随地无线业务接入。无线覆盖需要做到覆盖均匀、无盲区。 无线漫游需求 多层网络、快速切换、网络…

【Vue】el-select下选组件

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…