《动手学深度学习》Pytorch版学习笔记(三):Task06
课程背景
在疫情的影响下,不少学校已经做出了延迟开学的决定,:伯禹教育、Datawhale、和鲸科技牵头与多家AI企业合作,让在家的同学也能免费学习优质的付费课程,同时为学习者创建好的学习环境,提供就业绿色通道。
主修课程
《动手学深度学习》 代码讲解Pytorch版:该书是2019年国内最受欢迎的人工智能学习教材之一,是一本面向中文读者的能运行、可讨论的深度学习教科书,书籍作者之一亚马逊首席科学家李沐,毕业于上海交大。伯禹教育携手上海交通大学团队,基于此书籍,将其中的代码框架由MXNET迁移至PyTorch,并对这些代码制作了讲解视频。帮助大家边动手写代码边巩固理论知识,从原理到实践,上手深度学习。
1 任务
【第三次打卡】内容(2月18日-25日)
1.Task06:NLP和CV选做
打卡时间:【2020-02-18 08:00 -- 2020-02-25 22:00】
打卡链接:学习开始放出
2 NLP——文本情感分类
2.1 项目介绍
文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析,并有着广泛的应用。
同搜索近义词和类比词一样,文本分类也属于词嵌入的下游应用。在本节中,我们将应用预训练的词向量和含多个隐藏层的双向循环神经网络与卷积神经网络,来判断一段不定长的文本序列中包含的是正面还是负面的情绪。后续内容将从以下几个方面展开:
- 文本情感分类数据集
- 使用循环神经网络进行情感分类
- 使用卷积神经网络进行情感分类
#导入包
import collections
import os
import random
import time
from tqdm import tqdm
import torch
from torch import nn
import torchtext.vocab as Vocab
import torch.utils.data as Data
import torch.nn.functional as F
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
2.2 文本情感分类数据集
我们使用斯坦福的IMDb数据集(Stanford’s Large Movie Review Dataset) 作为文本情感分类的数据集。
- 读取数据
def read_imdb(folder='train', data_root="/home/kesci/input/IMDB2578/aclImdb_v1/aclImdb"):
data = []
for label in ['pos', 'neg']:
folder_name = os.path.join(data_root, folder, label)
for file in tqdm(os.listdir(folder_name)):
with open(os.path.join(folder_name, file), 'rb') as f:
review = f.read().decode('utf-8').replace('\n', '').lower()
data.append([review, 1 if label == 'pos' else 0])
random.shuffle(data)
return data
DATA_ROOT = "/home/kesci/input/IMDB2578/aclImdb_v1/"
data_root = os.path.join(DATA_ROOT, "aclImdb")
train_data, test_data = read_imdb('train', data_root), read_imdb('test', data_root)
# 打印训练数据中的前五个sample
for sample in train_data[:5]:
print(sample[1], '\t', sample[0][:50])
- 预处理数据:读取数据后,我们先根据文本的格式进行单词的切分,再利用
torchtext.vocab.Vocab
创建词典。
def get_tokenized_imdb(data):
'''
@params:
data: 数据的列表,列表中的每个元素为 [文本字符串,0/1标签] 二元组
@return: 切分词后的文本的列表,列表中的每个元素为切分后的词序列
'''
def tokenizer(text):
return [tok.lower() for tok in text.split(' ')]
return [tokenizer(review) for review, _ in data]
def get_vocab_imdb(data):
'''
@params:
data: 同上
@return: 数据集上的词典,Vocab 的实例(freqs, stoi, itos)
'''
tokenized_data = get_tokenized_imdb(data)
counter = collections.Counter([tk for st in tokenized_data for tk in st])
return Vocab.Vocab(counter, min_freq=5)
vocab = get_vocab_imdb(train_data)
print('# words in vocab:', len(vocab))
词典和词语的索引创建好后,就可以将数据集的文本从字符串的形式转换为单词下标序列的形式,以待之后的使用。
def preprocess_imdb(data, vocab):
'''
@params:
data: 同上,原始的读入数据
vocab: 训练集上生成的词典
@return:
features: 单词下标序列,形状为 (n, max_l) 的整数张量
labels: 情感标签,形状为 (n,) 的0/1整数张量
'''
max_l = 500 # 将每条评论通过截断或者补0,使得长度变成500
def pad(x):
return x[:max_l] if len(x) > max_l else x + [0] * (max_l - len(