做网站网关备案,网站设计实训心得,如何创建网页链接,购买域名后用wordpress建站1 前言
#x1f525;学长分享优质竞赛项目#xff0c;今天要分享的是
#x1f6a9; GRU的 电影评论情感分析 - python 深度学习 情感分类
#x1f947;学长这里给一个题目综合评分(每项满分5分)
难度系数#xff1a;3分工作量#xff1a;3分创新点#xff1a;4分
这…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, phasetrain):if phase train:return paddle.batch(paddle.reader.shuffle(imdb.train(self.vocab),25000), batch_size, drop_lastTrue)elif phase eval:return paddle.batch(imdb.test(self.vocab), batch_size,drop_lastTrue)else:raise ValueError(Unknown phase, which should be in [train, eval])步骤 首先导入必要的第三方库 接下来就是数据预处理需要注意的是数据是以数据标签的方式表示一个句子因此每个句子都是以一串整数来表示的每个数字都是对应一个单词。当然数据集就会有一个数据集字典这个字典是训练数据中出现单词对应的数字标签。
4.2 构建网络
这次的GRU模型分为以下的几个步骤
定义网络定义损失函数定义优化算法
具体实现如下
#定义动态GRUclass DynamicGRU(fluid.dygraph.Layer):def __init__(self,size,param_attrNone,bias_attrNone,is_reverseFalse,gate_activationsigmoid,candidate_activationrelu,h_0None,origin_modeFalse,):super(DynamicGRU, self).__init__()self.gru_unit GRUUnit(size * 3,param_attrparam_attr,bias_attrbias_attr,activationcandidate_activation,gate_activationgate_activation,origin_modeorigin_mode)self.size sizeself.h_0 h_0self.is_reverse is_reversedef forward(self, inputs):hidden self.h_0res []for i in range(inputs.shape[1]):if self.is_reverse:i inputs.shape[1] - 1 - iinput_ inputs[ :, i:i1, :]input_ fluid.layers.reshape(input_, [-1, input_.shape[2]], inplaceFalse)hidden, reset, gate self.gru_unit(input_, hidden)hidden_ fluid.layers.reshape(hidden, [-1, 1, hidden.shape[1]], inplaceFalse)res.append(hidden_)if self.is_reverse:res res[::-1]res fluid.layers.concat(res, axis1)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_attrfluid.ParamAttr(learning_rate30), is_sparseFalse) h_0 np.zeros((self.batch_size, self.hid_dim), dtype“float32”) h_0 to_variable(h_0) self._fc1 Linear(input_dimself.hid_dim, output_dimself.hid_dim*3)self._fc2 Linear(input_dimself.hid_dim, output_dimself.fc_hid_dim, actrelu)self._fc_prediction Linear(input_dimself.fc_hid_dim,output_dimself.class_dim,actsoftmax)self._gru DynamicGRU(sizeself.hid_dim, h_0h_0)def forward(self, inputs, labelNone):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_embemb 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, dim1)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, labellabel)return prediction, accelse:return prediction4.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_sizetrain_parameters[“batch_size”], phase‘train’) model GRU()sgd_optimizer fluid.optimizer.Adagrad(learning_ratetrain_parameters[lr],parameter_listmodel.parameters())steps 0Iters, total_loss, total_acc [], [], []for eop in range(train_parameters[epoch]):for batch_id, data in enumerate(train_data_generator()):steps 1doc 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 moviedata 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