IMDB电影评论情感分析(一)——数据导入与探索

举报
tengyun 发表于 2019/10/27 11:00:09 2019/10/27
【摘要】 情感分析是自然语言处理中很常见的场景,比如酒店评价,餐饮外卖评价等,目的是让计算机理解文本中包含的情感信息,这里通过将IMDB收集的电影评论数据集,分析某部电影的好坏,数据集由IMDB(http://www.imdb.com/interfaces)提供。

情感分析是自然语言处理中很常见的场景,比如酒店评价,餐饮外卖评价等,目的是让计算机理解文本中包含的情感信息,这里通过将IMDB收集的电影评论数据集,分析某部电影的好坏,数据集由IMDB(http://www.imdb.com/interfaces)提供。包含了25000部电影的评价信息。该数据集是由斯坦福大学的研究院整理的。

一、数据的导入与探索

1、导入数据

Keras提供了导入IMDB数据集的函数imdb.load_data( ),我们可以直接使用

from keras.datasets import imdb

import numpy as np

from matplotlib import pyplot as plt


(x_train, y_train), (x_validation, y_validation) = imdb.load_data()


我在导入数据时出现了错误提示,最后一行如下:

ValueError: Object arrays cannot be loaded when allow_pickle=False

参考错误信息中的解决方案,找到所在imdb.py中文件(我的路径是:D:\Anaconda3\envs\tensorflow\Lib\site-packages\keras\datasets\imdb.py)

找到第58行,with np.load(path) as f:

将np.load(path) 改为np.load(path, allow_pickle=True)

保存,重启Kernel,问题解决。

后来查找资料,发现还有一种解决办法:

因为在Numpy 1.16.3版本中,“函数np.load()和np.lib.format.read_array()采用allow_pickle关键字,现在默认为False以响应CVE-2019-6446 < nvd.nist.gov/vuln/detail / CVE-2019-6446 >“。

因为错误发生在一些library内部,

直接将numpy降回到1.16.2版本也可以解决

conda install numpy=1.16.2  或者

pip installpip install numpy=1.16.2


导入数据后,将训练数据集和评估数据集进行合并,并查看相关统计信息,如中值、标准差等,并通过

箱线图和直方图进行展示。

# 合并训练集和评估数据集

x = np.concatenate((x_train, x_validation), axis=0)

y = np.concatenate((y_train, y_validation), axis=0)

print('x shape is %s, y shape is %s' % (x.shape, y.shape))

print('Classes: %s' % np.unique(y))

print('Total words: %s' % len(np.unique(np.hstack(x))))

result = [len(word) for word in x]

print('Mean: %.2f words (

STD: %.2f)' %(np.mean(result), np.std(result)))

# 图表展示

plt.subplot(121)

plt.boxplot(result)

plt.subplot(122)

plt.hist(result)

plt.show()

执行代码,可以看到数据的离散状态和分布状态,结果如下:

1.jpg



3.jpg


我们来看一下训练集中的第一条数据和标签

4.jpg

为了便于在模型训练中使用数据集,Keras提供的数据集已经过预处理,每个样本都是一个整数数组,表示影评中的字词。这个整数代表单词在整个数据集中的流行程度。

每个标签都是整数值 0 或 1,其中 0 表示负面影评,1 表示正面影评。

数据处理:将整数转换文本

如果我们想看一下影评的具体内容,可以创建一个辅助函数来查询包含整数到字符串映射的字典对象

# A dictionary mapping words to an integer index

word_index = imdb.get_word_index()

# The first indices are reserved

word_index = {k:(v+3) for k,v in word_index.items()}

word_index["<PAD>"] = 0

word_index["<START>"] = 1

word_index["<UNK>"] = 2  # unknown

word_index["<UNUSED>"] = 3

reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

def decode_review(text):

return ' '.join([reverse_word_index.get(i, '?') for i in text])

在执行word_index = imdb.get_word_index()

出现imdb_word_index.json无法下载的情况,这是由于网络的问题,或者国内的防火墙有时对会对这些数据库网站的下载进行了屏蔽。

为了解决这一问题,可以将imdb_word_index.json下载到本地路径(自行百度),

用下面语句加载:

word_index=imdb.get_word_index(path="c:/imdb_word_index.json")

最后,我们来看训练集中第一条的影评:

decode_review(x_train[0])


5.jpg




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。