15.1. 情感分析及数据集 — 动手学深度学习 2.0.0 documentation (d2l.ai)
代码
import os
import torch
from torch import nn
from d2l import torch as d2l
#@save
d2l.DATA_HUB['aclImdb'] = (
'http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz',
'01ada507287d82875905620988597833ad4e0903')
data_dir = d2l.download_extract('aclImdb', 'aclImdb')
#@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])
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));
num_steps = 500 # 序列长度
train_features = torch.tensor([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,
torch.tensor(train_data[1])), 64)
for X, y in train_iter:
print('X:', X.shape, ', y:', y.shape)
break
print('小批量数目:', len(train_iter))
#@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 = torch.tensor([d2l.truncate_pad(
vocab[line], num_steps, vocab['<pad>']) for line in train_tokens])
test_features = torch.tensor([d2l.truncate_pad(
vocab[line], num_steps, vocab['<pad>']) for line in test_tokens])
train_iter = d2l.load_array((train_features, torch.tensor(train_data[1])),
batch_size)
test_iter = d2l.load_array((test_features, torch.tensor(test_data[1])),
batch_size,
is_train=False)
return train_iter, test_iter, vocab
代码解析
这段代码使用PyTorch框架和d2l(Dive into Deep Learning)库,加载并处理IMDb影评数据集——一组用于情感分析的文本数据集。代码执行的主要步骤如下:
1. 下载并提取IMDb评论数据集:`d2l.DATA_HUB`字典用来存放数据集以及它们的URL和SHA-1哈希,以确保下载文件的完整性。`d2l.download_extract`函数接收数据集的名称(这里是`'aclImdb'`)和一个子目录标识符,并下载并解压数据。
2. 读取IMDb评论数据集:`read_imdb`函数被定义来读取IMDb评论和它们的标签。标签为'pos'表示积极的评论,使用1表示;标签为'neg'表示消极的评论,使用0表示。
3. 解析训练集:读取训练集数据并打印标签和前60个字符的评论片段来展示数据是如何被加载的。
4. 分词:使用`d2l.tokenize`函数在训练数据上进行分词操作,切分出每个单词。
5. 建立词汇表:`d2l.Vocab`用来根据分词结果建立词汇表,至少出现5次的词会被加入词汇表。
6. 绘制评论长度直方图:这部分代码绘制了一个直方图,用于展示数据集中评论的词汇数量分布。
7. 准备数据迭代器:数据被截断或填充至指定的序列长度(这里是500个单词),然后使用`d2l.load_array`函数将处理后的数据和标签封装成小批量的数据迭代器。
8. 定义数据加载函数:最后,`load_data_imdb`函数被定义来加载训练和测试数据集、建立词汇表并返回小批量数据迭代器。这个函数可以在后续进行情感分析模型训练时被调用。
整体来看,该代码段主要聚焦于数据预处理的环节,包括下载、读取、分词、建立词汇表和创建数据迭代器等,以便于模型在随后的步骤中使用处理好的数据进行训练和评估。
这段代码是用于情感分析的,它使用了IMDb的电影评论数据集。情感分析是自然语言处理领域的一个任务,目的是判断文本(如评论、推文等)所表达的情绪倾向(正面或负面)。请看以下对代码的中文解析:
1. 导入所需的包和模块,如`os`、`torch`、`nn`以及一个定制的深度学习库`d2l`。
2. d2l.DATA_HUB是一个字典,用于存储数据集的URL及其校验码。这里存储了IMDb评论数据集的信息。
3. data_dir变量用于存储下载并解压后的数据集目录。
4. 另外定义了`read_imdb`函数,用于读取特定的数据集子集(训练集或测试集),并根据分类(politive'或'negative')读取正面或负面评论。
5. 然后,代码读取了训练集数据,并打印了数据的数量以及前三条评论和其标签。
6. 接着使用`d2l.tokenize`函数对评论进行分词处理,并利用`d2l.Vocab`建立词汇表,忽略出现频率低于5的词语。
7. 之后,使用直方图可视化评论中的词语数量分布。
8. 定义了序列长度`num_steps`为500,长序列将被截短,短序列将被填充。
9. 将处理后的文本转换为张量`train_features`,形状表示(样本数量, 序列长度)。
10. 创建一个小批量数据迭代器`train_iter`,其批量大小为64,并打印一个批次的X和y的形状。
11. 最后定义了一个函数`load_data_imdb`,它下载数据集、读取数据、分词、建立词汇表、处理文本为固定长度的序列,并返回训练和测试的数据迭代器以及词汇表供后续的神经网络模型使用。
在这个代码示例中,输入数据(评论)被转换成词索引序列,这些词索引将用于训练情感分析模型。这是构建基于文本的深度学习模型的一个典型步骤,包括预处理、建立词汇表、制作成批的数据等。