torchtext

torchtext.legacy.data

  • torchtext.legacy.data.Example : 用来表示一个样本数据+标签
  • torchtext.legacy.vocab.Vocab: 词汇表相关
  • torchtext.legacy.data.Datasets: 数据集类,getitem 返回 Example实例
  • torchtext.legacy.data.Field : 用来定义字段的处理方法(文本字段,标签字段)
    创建 Example时的 预处理
    batch 时的一些处理操作。
  • torchtext.legacy.data.Iterator: 迭代器,用来生成 batch
  • torchtext.legacy.datasets: 包含了常见的数据集.

Torchtext的功能

File Loading: 加载不同文件格式的 corpus
Tokenization: 将句子分解成 词列表。
Vocab: 构建 当前 corpus 的词汇表
Numericalize/Indexify: 将 词 映射成 index
Word Vector: 词向量
Batching: generate batches of training sample (padding is normally happening here)

举例:

"The quick fox jumped over a lazy dog."
-> (tokenization) 
["The", "quick", "fox", "jumped", "over", "a", "lazy", "dog", "."]

-> (vocab)
{"The" -> 0, 
"quick"-> 1, 
"fox" -> 2,
...}

-> (numericalize/indexify)
[0, 1, 2, ...]

-> (embedding lookup)
[
  [0.3, 0.2, 0.5],
  [0.6, 0., 0.1],
  ...
]

Torchtext使用流程

定义字段的处理操作

torchtext.legacy.data.Field

TEXT = Field(sequential=True, tokenization=tokenizer, lower=True)
LABEL = Field(sequential=False, use_vocab=False)
# 如果LABEL是整型,不需要 numericalize , 就需要将 use_vocab=False. 

加载corpus(String)

torchtext.legacy.data.Datasets

  • 将corpus中每个字段处理为Example实例
  • 创建Example时,会调用Field.preprocess方法
# 假设语料库: train.tsv, val.tsv, test.tsv
train, val, test = TabularDataset.splits(
          path='./data/', train='train.tsv',
        validation='val.tsv', test='test.tsv', format='tsv',
        fields=[('Text', TEXT), ('Label', LABEL)])

## 创建词汇表,将string word 映射为id
Field.build_vocab()
  * string token ---> index
  * index ---> string token 
  * string token ---> word vector

```python
# 构建语料库的 Vocabulary, 同时,加载预训练的 word-embedding
# 可以后端会下载 word vectors 并加载。也可以通过 vocab.Vectors 使用自定义的 vectors.
TEXT.build_vocab(train, vectors="glove.6B.100d")
# 在创建字典时, 希望仅仅保存出现频率最高的 k 个单词
# 可在 .build_vocab 时使用 max_size 参数指定

构造batch: torch.legacy.data.Iterator

  • 将 Datasets 中的数据 batch 化
  • 其中会包含一些 pad 操作,保证一个 batch 中的 example 长度一致
  • 在这里将 string token 转化成index。

tokenization,vocab, numericalize, embedding lookup 和 TorchText 数据预处理阶段的对应关系是:

# 运行在 CPU 上,需要设置 device=-1
# 如果运行在GPU 上,需要设置device=0 。
# torchtext 使用了动态 padding,意味着 batch内的所有句子会 pad 成 batch 内最长的句子长度。
train_iter, val_iter, test_iter = Iterator.splits(
        (train, val, test), sort_key=lambda x: len(x.Text),
        batch_sizes=(32, 256, 256), device=-1)

batch = next(iter(train_iter))
print("batch text: ", batch.Text) # 对应 Fileld 的 name
print("batch label: ", batch.Label)
  • tokenization —> Dataset 的构造函数中,由 Field 的 tokenize 操作
  • vocab —> field.build_vocab 时,由 Field 保存 映射关系
  • numericalize —> 发生在 iterator 准备 batch 的时候,由 Field 执行 numericalize 操作
  • embedding lookup —> 由 pytorch Embedding Layer 提供此功能。

batch.Text 和 batch.Label 都是 torch.LongTensor 类型的值,保存的是 index 。
如果我们想获得** word vector**,应该怎么办呢?

  • Field 的 vocab 属性保存了 word vector 数据,可以把这些数据拿出来,然后使用 Pytorch 的 Embedding Layer 来解决 embedding lookup 问题。
vocab = TEXT.vocab
self.embed = nn.Embedding(len(vocab), emb_dim)
self.embed.weight.data.copy_(vocab.vectors)

如何指定 Vector 缺失值的初始化方式

  • vector.unk_init = init.xavier_uniform 这种方式指定完再传入 build_vocab

    ————————————————
    版权声明:本文为CSDN博主「u012436149」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u012436149/article/details/79310176

posted @ 2022-03-17 11:06  ArdenWang  阅读(387)  评论(0编辑  收藏  举报