- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊|接辅导、项目定制
目录
一、课题背景和开发环境
📌第N2周:中文文本分类-Pytorch实现📌
- Python 3.8.12
- pytorch==1.8.1+cu111
- torchtext==0.9.1
- portalocker==2.7.0
📌本周任务:📌
- 根据文本内容(第1列)预测文本标签(第2列)
- 尝试根据第一周的内容独立实现,尽可能的不看本文的代码
与上周不同的地方:
- 加载的是本地数据
- 从英文变为了中文
- 文本标签需要进一步预处理
本次将使用PyTorch实现中文文本分类。主要代码与N1周基本一致,不同的是本次任务中使用了本地的中文数据,数据示例如下:
二、数据预处理
1.加载数据
''' 加载自定义中文数据 '''
train_data = pd.read_csv('./data/train.csv', sep='\t', header=None)
train_data.head()
# 构造数据集迭代器
def coustom_data_iter(texts, labels):
for x, y in zip(texts, labels):
yield x, y
train_iter = coustom_data_iter(train_data[0].values[:], train_data[1].values[:])
2.构建词典
''' 构建词典 '''
# 中文分词方法
tokenizer = jieba.lcut
counter = Counter()
for (line, label) in train_iter:
counter.update(tokenizer(line))
vocab = Vocab(counter, min_freq=1)
print([vocab[token] for token in tokenizer("我想看和平精英上战神必备技巧的游戏视频")])
''' 准备数据处理管道 '''
label_name = list(set(train_data[1].values[:]))
print(label_name)
text_pipeline = lambda x: [vocab[token] for token in tokenizer(x)]
label_pipeline = lambda x: label_name.index(x)
print(text_pipeline('我想看和平精英上战神必备技巧的游戏视频'))
print(label_pipeline('Video-Play'))
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\OAIXNA~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.625 seconds.
Prefix dict has been built successfully.
[3, 11, 14, 974, 1080, 147, 7725, 7575, 7794, 2, 187, 29]
['Weather-Query', 'Other', 'TVProgram-Play', 'Alarm-Update', 'Audio-Play', 'Radio-Listen', 'Calendar-Query', 'HomeAppliance-Control', 'Video-Play', 'FilmTele-Play', 'Travel-Query', 'Music-Play']
[3, 11, 14, 974, 1080, 147, 7725, 7575, 7794, 2, 187, 29]
8
3.生成数据批次和迭代器
''' 生成数据批次和迭代器 '''
def collate_batch(batch):
label_list, text_list, offsets = [], [], [0]
for (_text, _label) in batch:
label_list.append(label_pipeline(_label))
processed_text = torch.tensor(text_pipeline(_text), dtype=torch.int64) # torch.Size([41]), torch.Size([58])...
text_list.append(processed_text)
offsets.append(processed_text.size(0))
label_list = torch.tensor(label_list, dtype=torch.int64) # torch.Size([64])
offsets = torch.tensor(offsets[:-1]).cumsum(dim=0) # torch.Size([64])
text_list = torch.cat(text_list) # 若干tensor组成的列表变成一个tensor
return label_list.to(device), text_list.to(d