IMDB电影评论情感分析(一)——数据导入与探索
情感分析是自然语言处理中很常见的场景,比如酒店评价,餐饮外卖评价等,目的是让计算机理解文本中包含的情感信息,这里通过将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()
执行代码,可以看到数据的离散状态和分布状态,结果如下:
我们来看一下训练集中的第一条数据和标签
为了便于在模型训练中使用数据集,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])
- 点赞
- 收藏
- 关注作者
评论(0)