动手学深度学习之文本分类

参考伯禹学习平台《动手学深度学习》课程内容内容撰写的学习笔记
原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/lesson/nc4u5687u2bMWVwRe5q3h7
感谢伯禹平台,Datawhale,和鲸,AWS给我们提供的免费学习机会!!
总的学习感受:伯禹的课程做的很好,课程非常系统,每个较高级别的课程都会有需要掌握的前续基础知识的介绍,因此很适合本人这种基础较差的同学学习,建议基础较差的同学可以关注伯禹的其他课程:
数学基础:https://www.boyuai.com/elites/course/D91JM0bv72Zop1D3
机器学习基础:https://www.boyuai.com/elites/course/5ICEBwpbHVwwnK3C

文本情感分类

文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析,并有着广泛的应用。

同搜索近义词和类比词一样,文本分类也属于词嵌入的下游应用。在本节中,我们将应用预训练的词向量和含多个隐藏层的双向循环神经网络与卷积神经网络,来判断一段不定长的文本序列中包含的是正面还是负面的情绪。后续内容将从以下几个方面展开:

  1. 文本情感分类数据集
  2. 使用循环神经网络进行情感分类
  3. 使用卷积神经网络进行情感分类

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’)

文本情感分类数据

我们使用斯坦福的IMDb数据集(Stanford’s Large Movie Review Dataset)作为文本情感分类的数据集。

读取数据

数据集文件夹结构:

| aclImdb_v1
    | train
    |   | pos
    |   |   | 0_9.txt  
    |   |   | 1_7.txt
    |   |   | ...
    |   | neg
    |   |   | 0_3.txt
    |   |   | 1_1.txt
    |   | ...
    | test
    |   | pos
    |   | neg
    |   | ...
    | ...

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(x))

tokenized_data = get_tokenized_imdb(data)
features = torch.tensor([pad([vocab.stoi[word] for word in words]) for words in tokenized_data])
labels = torch.tensor([score for _, score in data])
return features, labels

创建数据迭代器

利用 torch.utils.data.TensorDataset,可以创建 PyTorch 格式的数据集,从而创建数据迭代器。

train_set = Data.TensorDataset(*preprocess_imdb(train_data, vocab))
test_set = Data.TensorDataset(*preprocess_imdb(test_data, vocab))

#上面的代码等价于下面的注释代码
#train_features, train_labels = preprocess_imdb(train_data, vocab)
#test_features, test_labels = preprocess_imdb(test_data, vocab)
#train_set = Data.TensorDataset(train_features, train_labels)
#test_set = Data.TensorDataset(test_features, test_labels)

#len(train_set) = features.shape[0] or labels.shape[0]
#train_set[index] = (features[index], labels[index])

batch_size = 64
train_iter = Data.DataLoader(train_set, batch_size, shuffle=True)
test_iter = Data.DataLoader(test_set, batch_size)

for X, y in train_iter:
print(‘X’, X.shape, ‘y’, y.shape)
break
print(’#batches:’, len(train_iter))

使用循环神经网络

双向循环神经网络

“双向循环神经网络”一节中,我们介绍了其模型与前向计算的公式,这里简单回顾一下:

Image Name

Image Name

给定输入序列 { X 1 , X 2 , … , X T } \{\boldsymbol{X}_1,\boldsymbol{X}_2,\dots,\boldsymbol{X}_T\} { X1,X2,,XT},其中 X t ∈ R n × d \boldsymbol{X}_t\in\mathbb{R}^{n\times d} XtRn×d 为时间步(批量大小为 n n n,输入维度为 d d d)。在双向循环神经网络的架构中,设时间步 t t t 上的正向隐藏状态为 H → t ∈ R n × h \overright

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值