【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors

首先简要说明一下我对这几种方法的个人体会。在对文本的预处理过程中,我们首先要使用build_vocab()生成一个词汇表,而这个方法的具体作用是将这个方法的参数传递给Class Vocab()来具体实例化一个对象,在实例化的过程中,需要用到预先处理好的词向量,这个词向量一般都由Vectors()给出。下面来分别介绍一下:

Vectors:其官方文档如下

【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors_第1张图片 其参数列表为:

name:包含向量的文件的名称

cache:缓存词向量的目录

url:如果在内存中没找到词向量,就去该参数给定的地址下载

unk_init:默认情况下,将词汇表外单词向量初始化为零向量;

max_vertors:可用于限制加载的预训练向量的数量。大多数预训练向量集都是按词频降序排序的。因此,在整个集合不适合内存的情况下,或者由于其他原因不需要,传递max_vectors可以限制加载集合的大小。

首先我们要清楚什么是词向量,对此我的简单理解为:词向量技术是将词转化成为稠密向量,并且对于相似的词,其对应的词向量也相近。也就是把我们的日常语言向量化。

我个人理解他的作用为导入预先设定好的词向量,在接下来同Vocab的用法中再详细介绍。

Vocab函数

【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors_第2张图片

其官方文档定义为:Defines a vocabulary object that will be used to numericalize a field.(定义将用于对字段进行数值化的词汇表对象。) 

其初始化参数为

【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors_第3张图片counter:计数器对象,保存在数据中找到的每个值的频率。

max_size:取出词汇表中前该值的数据。

min_freq:取出词汇表中大于等于该值的数据

vectors:同Vectors

unk_init:同Vectors

vectors_cache:同Vectors

对Vectors和Vocab的综合应用来看,我的个人理解是:通过Vocab在预先设置好的词汇表中(由Vectors导入)对文本数据进行向量化,然后按照Vocab的参数对数据集进行一系列操作。

build_vocab函数

【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors_第4张图片

 其作用为将参数传入Vocab的构造函数。

BucketIterator函数

【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors_第5张图片

其官方文档定义为:Defines an iterator that batches examples of similar lengths together.(定义一个迭代器,该迭代器将相似长度的示例批处理在一起。) 

我的个人理解是,将单词转化为模型可以进行运算的数值型对象。下面附上我的实验结果

【Torchtext】Torchtext.Vocab、Torchtext.data.BucketIterator、build_vocab函数以及Torchtext.vocab.Vectors_第6张图片

 从实验结果分析来看,对训练集数据使用build_vocab()函数后,构造了Vocab对象。训练集的内容并没有发生改变,在定义好数据加载器后其内容仍然没有发生改变。但是我们可以观察到当BucketIterator()函数执行过后,其生成的批数据中已经将单词转换为数值,对其原理笔者尚未梳理清楚,欢迎各位有同样困惑或者清楚该知识点的读者朋友多加指导!

## 使用训练集构建单词表,并不指定预训练好的词项量(词汇数值化)
TEXT.build_vocab(traindata,max_size=1000,vectors = None)
print(traindata[0].text)
## 将训练数据集定义为数据加载器,便于对模型进行优化
train_iter = data.BucketIterator(traindata,batch_size = 4)
print(traindata[0].text)
test_iter = data.BucketIterator(testdata,batch_size = 4)
for step, batch in enumerate(train_iter):  
    if step > 0:
        break
## 针对一个batch 的数据,可以使用batch.label获得数据的类别标签
print(batch)
print("数据的类别标签:",batch.label)
## batch.text是文本对应的编码向量
print("数据的尺寸:",batch.text.shape)
print(batch.text[0])

你可能感兴趣的:(Pytorch,深度学习,人工智能)