【NLP工具】——torchtext

概述

在处理NLP任务时除了需要优秀的神经网络还需要方便、高效的数据预处理工具。今天介绍一款优秀的NLP数据处理工具torchtext

NLP常见的数据预处理工作如下:

  1. Load File:数据文件加载;
  2. Tokenization:分词;
  3. Create Vocabulary:创建字典;
  4. Indexify:将词与索引进行映射;
  5. Word Vectors:创建或加载词向量;
  6. Padding or Fix Length:按长度对文本进行补齐或截取;
  7. Dataset Splits:划分数据集(如将数据集划分为训练集、验证集、测试集);
  8. Batching and Iterators:将数据集按固定大小划分成Batch;

使用torchtext完成以上工作:

  • 使用 torchtext.data.Field 定义样本各个字段的处理流程(分词、数据预处理等);
  • 使用 torchtext.data.Exampletorchtext.data.Field 处理成一条样本;
  • 使用 torchtext.data.Datasettorchtext.data.Example 处理成数据集,也可对数据集进行划分等工作;
  • 使用 torchtext.data.Iteratorstorchtext.data.Dataset 按照 batch_size 组装成 Batch 供模型训练使用;
  • 使用 torchtext.data.vocabtorchtext.data.Vectors 创建词典、词和索引的一一对应、下载或使用预训练的词向量等;

在这里插入图片描述

安装

  • 使用如下命令安装:pip install torchtext

文档

  • 官方教程:https://torchtext.readthedocs.io/en/latest/index.html

主要的Package

  1. torchtext.data
    • torchtext.data.Dataset:数据集;
    • torchtext.data.Example:样本;
    • torchtext.data.Fields:样本的属性(如:content、label);
    • torchtext.data.Iterators:将数据集封装成Batch,并提供迭代器;
  2. tochtext.vocab
    • torchtext.vocab.Vocab:词典相关;
    • torchtext.vocab.Vectors:词向量相关;

实践

Field

API

class torchtext.data.Field(
    sequential=True, use_vocab=True, init_token=None, eos_token=None, 
    fix_length=None, dtype=torch.int64, preprocessing=None, postprocessing=None,
    lower=False, tokenize=None, tokenizer_language='en', include_lengths=False,
    batch_first=False, pad_token='<pad>', unk_token='<unk>', pad_first=False,
    truncate_first=False, stop_words=None, is_target=False
)
#...
def build_vocab(self, *args, **kwargs)

重要的参数:

  1. sequential:是否是可序列化数据(类似于字符串数据),默认值是 True
  2. user_vocab:是否使用 Vocab 对象,如果取 False,则该字段必须是数值类型;默认值是True
  3. tokenize:是一个 function 类型的对象(如 string.cutjieba.cut 等),用于对字符串进行分词;
  4. batch_first:如果该属性的值取 True,则该字段返回的 Tensor 对象的第一维度是 batch 的大小;默认值是False
  5. fix_length:该字段是否是定长,如果取 None 则按同 batch 该字段的最大长度进行pad;

重要函数:

  1. build_vocab:为该Field创建Vocab

Code Demo

数据集(第一个字段是 label , 第二个字段是 content ):

0 我不退我也不买。我就看戏
0 我建不了系统拒绝
0 跟诸葛撞单了
0 305没了
1 我今天很开心,很开心,微信
1 那是微信号
1 高材生你不用彩虹,如果哪天想跟我的单可以加我微信
1 高材生可以加我微信
1 群主你微信多少
1 老哥,有没有微信群啥的?一起聊球呀?
...

代码:

# 分词函数
def content_tokenize(text):
    return [item for item in str(text)]
# 创建content字段的Field
CONTENT = data.Field(sequential=True, tokenize=content_tokenize, batch_first=True)
# 创建label字段的Field
LABEL = data.Field(sequential=False, use_vocab=False)
# 为 CONTENT 字段创建词向量
CONTENT.build_vocab(data_set)

备注:需要把创建的 CONTENT.vocab.stoi 保存起来,供以后(如:使用训练好的模型进行预测)使用;

Example

API

class torchtext.data.Example:
    @classmethod 
    fromCSV(data, fields, field_to_index=None)
    @classmethod 
    fromJSON(data, fields)
    @classmethod 
    fromdict(data, fields)
    @classmethod 
    fromlist(data, fields)
    @classmethod 
    fromtree(data, fields, subtrees=False)	

该类有5个类函数,可以从 csvjsondictlisttree等数据结构中创建Example,常用的是 fromlist

Dataset

API

class torchtext.data.Dataset(examples, fields, filter_pred=None)
# ...
def split(split_ratio=0.7, stratified=False, strata_field='label', random_state=None)

重要参数:

  1. examples:Example对象列表;
  2. fields:格式是List(tuple(str, Field)),其中 strField 对象的描述;

重要函数:

  1. split():此方法用于划分数据集,将数据集划分为traintestvalid数据集;
    • split_ratio:此参数为 floatlist 类型,当参数为float类型时(参数取值要在[0, 1]),表示数据集中多少比例的数据划分到train(训练)数据集里,剩余的划分到valid(验证)数据集里;如果该参数是list类型(如[0.7, 0.2, 0.1]),表示traintestvalid数据集的比例;该参数默认值是 0.7

Code Demo

# 读取数据
df = pd.read_csv('./datas/data.txt', sep=' ', encoding='utf8', names=['label', 'content'])
# 创建Field的list
fields = [('label', LABEL), ('content', CONTENT)]
examples = []
for label, content in zip(df['label'], df['content']):
    examples.append(Example.fromlist([label, content], fields))
# 创建数据集
data_set = Dataset(examples, fields)
# 划分数据集为 train 和 valid
train_dataset, valid_dataset = data_set.split(0.6)
print('data_set length:{}'.format(len(data_set.examples)))
print('train_dataset length:{}'.format(len(train_dataset.examples)))
print('valid_dataset length:{}'.format(len(valid_dataset.examples)))

结果

在这里插入图片描述

Vocab

API

class torchtext.vocab.Vocab(
    counter, max_size=None, min_freq=1, specials=['<pad>'], 
    vectors=None, unk_init=None, vectors_cache=None, specials_first=True
)

重要参数:

  1. countercollections.Counter 类型的对象,用于保存数据(如:单词)的频率;
  2. vectors:预训练的词向量,可以是torch.vocab.Vectors类型,也可以是其他类型;
  3. min_freq: 最低频率限制,如果某个词频率比min_freq低,则不记录到词典;

Code Demo

# 为 CONTENT 字段创建词向量
CONTENT.build_vocab(data_set)

Vectors

API

class torchtext.vocab.Vectors(name, cache=None, url=None, unk_init=None, max_vectors=None)

重要参数:

  1. name:保存word vectors的文件;
  2. catch:word vectors文件的缓存目录,默认是.vector_cache
  3. url: 如果缓存文件夹中不存在 word vectors文件,则去该url下载;
  4. unk_init:是一个function 类型的对象,用来初始化词典中不存在的词向量;默认是Tensor.zero_
  5. max_vecotrsint类型的数据,限制词典的大小;

Code Demo

# 使用预训练词向量
word_vectors = Vectors('./datas/embeddings/hanzi_embedding_150.bin', cache='./datas/embeddings/')
print(word_vectors.stoi)

结果:

在这里插入图片描述

使用pytorch加载预训练词向量

# 加载预训练词向量
embedding_layer = nn.Embedding.from_pretrained(word_vectors.vectors, freeze=True)
  • freeze:该参数是指预训练词向量是否参与继续训练,True表示不继续参与训练;

Iterator

说明

根据batch_size 生成 DatasetIteratior。常用的有 IteratorBucketIterator 。其中 BucketIteratorIterator 的子类,与 Iterator 相比,BucketIterator 会把相同或相近长度的数据(按 sort_key)属性进行排序,这样可以最小化 pad

API

class torchtext.data.Iterator(dataset, batch_size, sort_key=None, device=None,
                             batch_size_fn=None, train=True, repeat=False, shuffle=None,
                             sort=None, sort_within_batch=None)

	@classmethod
    splits(datasets, batch_sizes=None, **kwargs)

重要参数:

  1. dataset:需要生成 Iterator的数据集;
  2. batch_size:每个 batch的大小;
  3. sort_key:用来为每个 Example 进行排序的字段,默认是None
  4. shuffle:每次 epoch 是否进行 shuffle

重要函数:

  1. splits():为数据集生成Iterator
    • datasetsTuple 类型的 DatasetTuple的第一个元素应该是train数据集的Dataset
    • batch_sizesTuple类型,和datasets中的Dataset一一对应,表示各个数据集生成batch的大小;

Code Demo

train_iter, valid_iter = BucketIterator.splits(
    (train_dataset, valid_dataset),
    batch_sizes = (3, 2),
    sort_key=lambda x: len(x.content),
    sort_within_batch=True
)

结语

torchtext 是一个很好用的文本处理工具,本文只是介绍了torchtext常用的功能,可以查看官方文档进一步学习。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值