torchtext 的使用
torchtext的使用
文本预处理流程:
- file loading
- Tokenization
- Vocab
- Numericalize/Indexify 词映射成 index
- word vector 词向量
- Batching
torchtext的处理流程
- torchtext.data.Field 定义样本处理流程;
- torchtext.data.Datasets 加载corpus
- datasets中,torchtext将corpus处理成一个个 torchtext.data.example;
- 创建 torchtext.data.Example时会调用field.preprocess 方法
- filed.build_vocab 创建词汇表,将string转成index;这部分功能包括string token -> index,index -> string token, string token -> word vector;
- torchtext.data.Iterator 将处理后的数据进行batch操作;
- 将Dataset数据batch化;
- pad操作,保证一个batch中的Example长度相同;
- 此处将string token转成index;
例子
- 首先创建Filed,
from torchtext import data, datasets
SRC = data.Field(tokenize=tokenize_en,pad_token=PAD_WORD)
TGT = data.Field(tokenize=tokenize_en,init_token=BOS,eos_token=EOS,pad_token=PAD)
- 通过dataset加载数据库
train,val,test=datasets.TranslationDataset.splits(
path="./dataset/",
train="train",
validation="valid",
test="test",
exts=(".src",".tgt"),
fields=(SRC,TGT),
filter_pred=lambda x: len(vars(x)['src'])< MAX_LEN and len(vars(x)['trg'])< MAX_LEN
)
- 建立词汇表
SRC.build_vocab(train.src,min_freq=MIN_FREQ)
TGT.build_vocab(train.trg,min_freq=MIN_FREQ)
# 这边可以加载预训练的词向量
# TEXT.build_vocab(train,vectors="glove.100d")
- 进行batch操作
train_iter = MyIterator(train,batch_size=BATCH_SIZE, device=0, repeat=False, sort_key=lambda x: (len(x.src), len(x.trg)),batch_size_fn=batch_size_fn, train=True)
# train_iter, val_iter, test_iter = data.Iterator.splits(
# (train, val, test), sort_key=lambda x: len(x.Text),
# batch_sizes=(32, 256, 256), device=-1)
- 获得单词的vocab
vocab = TEXT.vocab
self.embed = nn.Embedding(len(vocab), emb_dim)
self.embed.weight.data.copy_(vocab.vectors)
问题
- MyIterator中动态batch和静态batch的区别
- 如何共享词表
SRC.build(train.src,train.tgt)
TGT.vocab = SRC.vocab