- 本文为365天深度学习训练营 中的学习记录博客
- 原作者:K同学啊
一、准备工作
本次将使用PyTorch实现中文文本分类。主要代码与N1周基本一致,不同的是本次任务中使用了本地的中文数据,数据示例如下:
任务:
●1. 学习如何进行中文本文预处理
●2. 根据文本内容(第1列)预测文本标签(第2列)
进阶任务:
●1.尝试根据第一周的内容独立实现,尽可能的不看本文的代码
●2. 构建更复杂的网络模型,将准确率提升至91%
与上周不同的地方:
●加载的是本地数据
●从英文变为了中文
●文本标签需要进一步预处理
import torch
import torch.nn as nn
import torchvision
from torchvision import transforms, datasets
import os,PIL,pathlib,warnings
warnings.filterwarnings("ignore") #忽略警告信息
# win10系统
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device
代码输出
device(type='cpu')
运行下面的代码时,发生了pandas与numpy的版本冲突问题,在网上查了不少资料,看pandas的哪个版本与numpy的哪个版本是相对应的。也曾先安装pandas的某个版本,然后再安装numpy,在安装numpy时让其自主选择numpy的版本。或者反过来先安装numpy的某个版本,然后再安装pandas,在安装pandas时让其自主选择numpy的版本。问题还是无法解决,最后是另外建立一个新的虚拟环境,安装numpy、pandas,运行下面的代码就没有再出现pandas与numpy的版本冲突问题了。据此,在原虚拟环境再安装同样版本的pandas与numpy,也同样解决pandas与numpy的版本冲突问题。之所以没有用新的虚拟环境运行代码,是因为其他模块,如torch、torchtext、portalocker、numpy的版本也是要相对应的,我已经在原虚拟环境安装好了这些模块,不想在新的虚拟环境再折腾安装这些模块了。
我的虚拟环境的numpy、pandas版本:
numpy=1.26.4
pandas=2.2.2
import pandas as pd
# 加载自定义中文数据
train_data = pd.read_csv('./N6/train.csv', sep='\t', header=None)
train_data.head()
代码输出
0 | 1 | |
---|---|---|
0 | 还有双鸭山到淮阴的汽车票吗13号的 | Travel-Query |
1 | 从这里怎么回家 | Travel-Query |
2 | 随便播放一首专辑阁楼里的佛里的歌 | Music-Play |
3 | 给看一下墓王之王嘛 | FilmTele-Play |
4 | 我想看挑战两把s686打突变团竞的游戏视频 | Video-Play |
# 构造数据集迭代器
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[:])
train_iter
代码输出
二、数据预处理
需要另外安装jieba分词库
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator
import jieba
# 中文分词方法
tokenizer = jieba.lcut
def yield_tokens(data_iter):
for text,_ in data_iter:
yield tokenizer(text)
vocab = build_vocab_from_iterator(yield_tokens(train_iter), specials=["" ])
vocab.set_default_index(vocab["" ]) # 设置默认索引,如果找不到单词,则会选择默认索引
代码输出
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\Administrator\AppData\Local\Temp\jieba.cache
Loading model cost 0.777 seconds.
Prefix dict has been built successfully.
vocab(['我','想','看','和平','精英','上','战神','必备','技巧','的','游戏','视频'])
代码输出
[2, 10, 13, 973, 1079, 146, 7724, 7574, 7793, 1, 186, 28]
label_name = list(set(train_data[1].values