imdb_CNN_LSTM

2018年5月17日 0 条评论 153 次阅读 0 人点赞

 

 

一、数据集简介

 

1.背景描述

电影上映之前,我们怎样得知它的好坏呢?这个问题很难回答,因为并没有一个普适的方法来判定电影的好坏。许多人依靠评分来测量一个电影质量的好坏,而另一些人则凭他们的直觉。但在电影上映后也需要时间来获取一个合理数量的评分反馈。同时,人们的直觉有时候是不可靠的。

给出每年生产出的数以千计的电影,在不依赖于评分或我们的直觉的前提下,有没有一个更好的方法来得知电影的好坏呢?为了解决以上问题,采用imdb数据集进行情感分析,得出有效可靠的结论。

2.数据描述

MDB情感分类数据集是Stanford整理的一套IMDB影评的情感数据,它含有25000个训练样本,25000个测试样本。以下是其中的一个正样本:

 

3.数据

本文中的Keras样例使用的是整理好已经符号化的pkl文件,其数据格式大致如下:

X_trian

X_test 与之类似,在此不做展示。

Y_train和y_test 为[0,1]组成的列表,代表正负情感。

 

解决方案和代码

  1. cnn

这个方案使用一维卷积来处理文本数据,提供了一种将擅长于图像处理的CNN引入到文本处理中的思路,使用 Convolution1D 对序列进行卷积操作,再使用 GlobalMaxPooling1D 对其进行最大池化操作,这个处理类似于CNN的特征提取过程,用以提升传统神经网络的效果。其详细代码如下:

模型构建

Embedding

给定一个输入序列,首先提取N gram特征得到N gram特征序列,然后对每个特征做词嵌入操作,加入dropout参数,它的存在意义是随机的丢弃一部分数据,将一定百分比的数据置为0,这样做有助于防止过拟合。

Convolution1D

在嵌入层之后,引入一个一维卷积操作,一维卷积的输入为[nb_samples, steps, input_dim],输出为[nb_samples, new_steps, output_dim],可见在这个卷积操作后词向量的维度会变为 nb_filters。

GlobalMaxPooling1D

对卷积后的序列做1维最大池化操作,以[10, 50]的序列为例,序列的长度为10即10行,每个特征50位即50列,最大池化操作取每一列的最大值,最后输出变为[50]的一个向量。

Dense

在1D池化操作完成之后,输出变成了向量,添加一个原始的全连接隐藏层进一步训练,以让CNN+MaxPooling得到的特征发挥更大作用。

整个模型的结构如下:

训练

结果如下

训练后,在验证集上得到了0.8788的准确率。

  1. LSTM

LSTM在NLP任务中已经成为了较为基础的工具,但是在这个任务中,由于数据集较小,所以无法发挥其巨大的优势,另外由于其训练速度较慢,所以有时候一些更快更简便的算法可能是个更好的选择。其详细代码如下:

模型构建

IMDB的LSTM模型构建非常简单:

输入先通过嵌入层转换为词向量序列表示,然后经过LSTM转换为128维的向量,然后直接接上sigmoid分类器。

整个模型的结构如下:

训练

结果如下

训练后,在验证集上得到了0.8108的准确率。

  1. CNN + LSTM

CNN+LSTM 是 CNN 和 LSTM 的结合模型,其详细代码如下:

模型构建

卷积之前的操作与CNN方法(包括卷积)类似,不再赘述。

 

池化层由 GlobalMaxPooling1D 换成了 MaxPooling1D,两者的区别在于,前者池化为一个向量,后者池化后为一个序列,但是规模缩小到原始的 1/ pool_length。

详细的,[100, 128]的序列(100为序列长度,50为词嵌入维度),经过 Convlution1D(nb_filters=64, filter_length=5) 后,变为 [96, 64],再经过 MaxPooling1D(pool_length=4) 后,变成了 [24, 64]。

从LSTM开始,接下来的操作就与 LSTM 方法类似,此处不再赘述。

整个模型的结构如下(注意观察维度变化):

训练

其结果如下:

完整代码请访问我的github:github.com/lyssom

总结

本文使用Keras框架,实现了三种训练IMDB文本情感分类的方法,借助这3个Python程序,可以对Keras的使用做一定的了解。

时序数据经常出现在很多领域中,在自然语言处理方面更是非常广泛。传统的时序问题通常首先需要人力进行特征工程,才能将预处理的数据输入到机器学习算法中。并且这种特征工程通常需要一些特定领域内的专业知识,因此也就更进一步加大了预处理成本。

然而随着深度学习的出现,卷积神经网络已经可以较为完美的进行预处理任务。使用 CNN 处理不需要任何手动特征工程,网络会一层层自动从最基本的特征组合成更加高级和抽象的特征,从而完成预处理任务。所以使用cnn+lstm模型会较大的提高工作效率。

通过实验可看到,虽然LSTM在NLP任务中已经成为了较为基础的工具,但是在这个任务中,由于数据集较小,所以无法发挥其巨大的优势。在今后的学习工作中,使用更为完善的数据集,对参数进行充分调整,增加迭代次数。相信cnn+lstm模型必能大放异彩。

lyssom

这个人太懒什么东西都没留下

文章评论(0)