TorchText
是 PyTorch 的一个功能包,主要提供文本数据读取、创建迭代器的的功能与语料库、词向量的信息,分别对应了 torchtext.data
、torchtext.datasets
和 torchtext.vocab
三个子模块。本文参考了三篇文章。
1. 语料库 torchtext.datasets
TorchText
内建的语料库有:
- Language Modeling
- WikiText-2
- WikiText103
- PennTreebank
- Sentiment Analysis
- SST
- IMDb
- Text Classification
- TextClassificationDataset
- AG_NEWS
- SogouNews
- DBpedia
- YelpReviewPolarity
- YelpReviewFull
- YahooAnswers
- AmazonReviewPolarity
- AmazonReviewFull
- Question Classification
- TREC
- Entailment
- SNLI
- MultiNLI
- Machine Translation
- Multi30k
- IWSLT
- WMT14
- Sequence Tagging
- UDPOS
- CoNLL2000Chunking
- Question Answering
- BABI20
- Unsupervised Learning
- EnWik9
2. 预训练的词向量 torchtext.vocab
TorchText
内建的预训练词向量有:
- charngram.100d
- fasttext.en.300d
- fasttext.simple.300d
- glove.42B.300d
- glove.840B.300d
- glove.twitter.27B.25d
- glove.twitter.27B.50d
- glove.twitter.27B.100d
- glove.twitter.27B.200d
- glove.6B.50d
- glove.6B.100d
- glove.6B.200d
- glove.6B.300d
3. 数据读取、数据框的创建 torchtext.data
3.1 创建 Field
Field
可以理解为一个告诉 TorchText 如何处理字段的声明。
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)
参数很多,这里仅仅介绍主要参数:
sequential
:是否为已经被序列化的数据,默认为 True;use_vocab
:是否应用词汇表。若为 False 则数据应该已经是数字形式,默认为 True;init_token
:序列开头填充的 token,默认为 None 即不填充;eos_token
:序列结尾填充的 token,默认为 None 即不填充;lower
:是否将文本转换为小写,默认为 False;tokenize
:分词器,默认为string.split
;batch_first
:batch 是否在第一维上;pad_token
:填充的 token,默认为 ““; unk_token
:词汇表以外的词汇的表示,默认为 ““; pad_first
:是否在序列的开头进行填充;默认为 False;truncate_first
:是否在序列的开头将序列超过规定长度的部分进行截断;默认为 False;stop_words
:是否过滤停用词,默认为 False;is_target
:这个Field
是否为标签,默认为 False。
tokenize
可以使用 SpaCy 的分词功能,使用以前要先构建分词功能:
1 | import spacy |
spacy
分词的效果比原生的 split
函数好一点,但是速度也慢一些。然后可以创建对应文本的 Field 了:
1 | TEXT = data.Field(sequential=True, tokenize=tokenizer, lower=True) # 假设文本为 raw data |
3.2 创建 Dataset
如果文本数据保存在 csv
、tsv
或 json
文件中,我们优先使用 torchtext.data.TabularDataset
进行读取。
torchtext.data.TabularDataset(path, format, fields, skip_header=False, csv_reader_params={}, **kwargs)
path
:数据的路径;format
:文件的格式,为csv
、tsv
或json
;fields
:上面已经定义好的 Field;skip_header
:是否跳过第一行;csv_reader_params
:当文件为csv
或tsv
时,可以自定义文件的格式。
例子:
1 | train, val = data.TabularDataset.splits( |
上面的例子说,'PhraseId'
和 'SentenceId'
不读取(Field
为 None
),'Phrase'
以 TEXT
的方式进行读取,'Sentiment'
以 LABEL
的方式进行读取。
3.3 建立词汇表
现在我们需要将词转化为数字,并在模型中载入预训练好的词向量。词汇表存储在之前声明好的 Field
里面。
1 | TEXT.build_vocab(train_data, # 建词表是用训练集建,不要用验证集和测试集 |
3.4 创建迭代器
迭代器推荐使用 BucketIterator
,因为它会将文本中长度相似的序列尽量放在同一个 batch 里,减少 padding,从而减少计算量,加速计算。
1 | torchtext.data.BucketIterator(dataset, batch_size, sort_key=None, device=None, batch_size_fn=None, train=True, repeat=False, shuffle=None, sort=None, sort_within_batch=None) |
dataset
:目标数据;batch_size
:batch 的大小;sort_key
:排序的方式默认为 None;device
:载入的设备,默认为 CPU;batch_size_fn
:取 batch 的函数,默认为 None;train
:是否为训练集,默认为 True;repeat
:在不同的 epoch 中是否重复相同的 iterater,默认为 False;shuffle
:在不同的 epoch 中是否打乱数据的顺序,默认为 None;sort
:是否根据sort_key
对数据进行排序,默认为 None;sort_within_batch
:是否根据sort_key
对每个 batch 内的数据进行降序排序。
举例:
1 | train_iter, val_iter = data.BucketIterator.split((train, val), batch_size=128, sort_key=lambda x: len(x.Phrase), |
欢迎关注我的微信公众号“花解语 NLP”: