赞
踩
由于情感可以被分类为离散的极性或尺度(例如,积极的和消极的),我们可以将情感分析看作一项文本分类任务,它将可变长度的文本序列转换为固定长度的文本类别。这里,我们将使用斯坦福大学的大型电影评论数据集进行情感分析。它由一个训练集和一个测试集组成,其中包含从IMDb下载的25000个电影评论。在这两个数据集中,“积极”和“消极”标签的数量相同,表示不同的情感极性。
- import os
- from mxnet import np, npx
- from d2l import mxnet as d2l
-
- npx.set_np()
首先,下载并提取路径../data/aclImdb中的IMDb评论数据集。
- #@save
- d2l.DATA_HUB['aclImdb'] = (
- 'http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz',
- '01ada507287d82875905620988597833ad4e0903')
-
- data_dir = d2l.download_extract('aclImdb', 'aclImdb')
接下来,读取训练和测试数据集。每个样本都是一个评论及其标签:1表示“积极”,0表示“消极”。
#@save def read_imdb(data_dir, is_train): """读取IMDb评论数据集文本序列和标签""" data, labels = [], [] for label in ('pos', 'neg'): folder_name = os.path.join(data_dir, 'train' if is_train else 'test', label) for file in os.listdir(folder_name): with open(os.path.join(folder_name, file), 'rb') as f: review = f.read().decode('utf-8').replace('\n', '') data.append(review) labels.append(1 if label == 'pos' else 0) return data, labels train_data = read_imdb(data_dir, is_train=True) print('训练集数目:', len(train_data[0])) for x, y in zip(train_data[0][:3], train_data[1][:3]): print('标签:', y, 'review:', x[0:60])
将每个单词作为一个词元,过滤掉出现不到5次的单词,我们从训练数据集中创建一个词表。
- train_tokens = d2l.tokenize(train_data[0], token='word')
- vocab = d2l.Vocab(train_tokens, min_freq=5, reserved_tokens=['<pad>'])
在词元化之后,让我们绘制评论词元长度的直方图。
- d2l.set_figsize()
- d2l.plt.xlabel('# tokens per review')
- d2l.plt.ylabel('count')
- d2l.plt.hist([len(line) for line in train_tokens], bins=range(0, 1000, 50));
正如我们所料,评论的长度各不相同。为了每次处理一小批量这样的评论,我们通过截断和填充将每个评论的长度设置为500。这类似于对机器翻译数据集的预处理步骤。
- num_steps = 500 # 序列长度
- train_features = np.array([d2l.truncate_pad(
- vocab[line], num_steps, vocab['<pad>']) for line in train_tokens])
- print(train_features.shape)
现在可以创建数据迭代器了。在每次迭代中,都会返回一小批量样本。
- train_iter = d2l.load_array((train_features, train_data[1]), 64)
-
- for X, y in train_iter:
- print('X:', X.shape, ', y:', y.shape)
- break
- print('小批量数目:', len(train_iter))
最后,将上述步骤封装到load_data_imdb函数中。它返回训练和测试数据迭代器以及IMDb评论数据集的词表。
#@save def load_data_imdb(batch_size, num_steps=500): """返回数据迭代器和IMDb评论数据集的词表""" data_dir = d2l.download_extract('aclImdb', 'aclImdb') train_data = read_imdb(data_dir, True) test_data = read_imdb(data_dir, False) train_tokens = d2l.tokenize(train_data[0], token='word') test_tokens = d2l.tokenize(test_data[0], token='word') vocab = d2l.Vocab(train_tokens, min_freq=5) train_features = np.array([d2l.truncate_pad( vocab[line], num_steps, vocab['<pad>']) for line in train_tokens]) test_features = np.array([d2l.truncate_pad( vocab[line], num_steps, vocab['<pad>']) for line in test_tokens]) train_iter = d2l.load_array((train_features, train_data[1]), batch_size) test_iter = d2l.load_array((test_features, test_data[1]), batch_size, is_train=False) return train_iter, test_iter, vocab
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。