文本分类_torchtext文本预处理

在看attention的实现时,看的太费劲,在文本预处理一块缺失太多,所以专门补补。

torchtext的功能

训练模型之前,通常需要做的工作包括: 1. 从硬盘中读取数据到内存中2. 符号化文本,看文章中的操作,是对文本进行格式上的一些转换,清洗方面的操作3. 创建map将词汇或字符转为数字4. 将text转为整型数字list。5. 加载数据,转为需要的格式,包括context和label。6. 对数据做Pad,这样子就可以批运算。

数据准备

使用了cnews的数据,原始数据为txt,对其做csv转换,非本文关注点,具体在代码中。

数据读入

数据读入使用了TabularDataset,在读入的同时,在定义好Field操作的基础上,对不同的数据做不同的操作。如果是单独的test数据,在使用函数和参数上有略微不同。不需要使用splits,指定路劲为其完整路劲。

  • 定义filed
datafields=[("context",TEXT),("label",LABEL)] ## TEXT field, LABEL 
fieldtest_field=[("context",TEXT),("label",LABEL)]
  • 数据读入
    内部格式为tokenize操作之后的样子,没有做数值化(不需要我们显示去做)。所有数据保存在torchtext.data.dataset.TabularDataset中,它类似于list,内部是Example。
train_file, valid_file=TabularDataset.splits(path=file_path,
train="train_interger.csv",validation="val_interger.csv",    format="csv",skip_header=True,fields=datafields)
  • 数据查看
    刚刚读入的数据怎么看呢,返回的数据中是一个list。
print(train_file[1].context[:3])
print(train_file[1].label)

词典构建

在读入的train_file基础上做词典构建,后期batch操作中,会用到其中的Vocab,对文本做数值映射,我们到时候可以通过vocab来查看batch操作后,内部数据的结构。

迭代器构建,输出batch语料

使用BucketIterator来进行batch,其内部会自动将数据进行shuffle,并且在做bucket的时候,会将长度相似的句子放在一个桶中。(记得在gbdt中也有分桶的定义,是对特征进行分桶,构建不同的决策树)测试数据不需要做shuffle,直接使用标准的Iterator就可以了。

train_iter,val_iter=BucketIterator.splits(    (train_file,valid_file),    batch_sizes=(5,5),    device=-1,    sort_key=lambda x:len(x.contect),    sort_within_batch=False,repeat=False# 当要使用pack_padded_sequence时,需要将sort_within_batch设置为True,同时会将paded sequence 转为PackedSequence对象   
test_iter=Iterator(test_file, batch_size=5, device=-1, sort=False, sort_within_batch=False, repeat=False) 

大致查看一下数据,其内部已经从str型数据转为了integer。
在这里插入图片描述

数据封装

此时的数据使用起来不是很方便,对其上面再做一层封装。如此返回的是一个(x,y)的迭代器,是有n多个batch。

import torch
class BatchWrapper:
    def __init__(self,dl,x_var,y_var):
        self.dl,self.x_var,self.y_var=dl,x_var,y_var 
    def __iter__(self):
        for batch in self.dl:
            x=getattr(batch, self.x_var)
            print(self.y_var)
            if self.y_var is not None:             
                y=torch.cat([getattr(batch,feat).unsqueeze(1)for feat in self.y_var],dim=1).float()
            else:
                y=torch.zeros((1))
            yield(x,y)
    def __len__(self):
        return len(self.dl)

为了方便观察,设置了batch_size=5,可以很明显看到,一个样本即一个句子是在最内层维度+1的维度上存放的,理解为在句子特征的维度,在当前文章中是由当前桶(batch)中最长句子的长度决定的,数值特征是由词表决定的(如果是embedding呢);最内层维度存放了batch的维度,理解为样本上的扩展,这里就是5啦。为了验证这个理解方法,抽取出"一列"数据,使用之前的vocab对其数值进行还原,发现是对的。如下:
在这里插入图片描述
以及label的存放方式
在这里插入图片描述
数据完了之后,就应当是送入模型进行训练了。
源起:
https://github.com/jadore801120/attention-is-all-you-need-pytorch/blob/master/preprocess.py
参考: http://mlexplained.com/2018/02/08/a-comprehensive-tutorial-to-torchtext/
github地址:
https://github.com/mathCrazyy/text_classify/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值