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;

例子

  1. 首先创建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)
  1. 通过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
)
  1. 建立词汇表
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")
  1. 进行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)
  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
posted @ 2019-07-12 23:45  静_渊  阅读(5182)  评论(1编辑  收藏  举报