NLP新手入门-第N2周:中文文本分类-Pytorch实现

一、课题背景和开发环境

📌第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(device
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值