在Torchtext中使用预训练的西班牙语嵌入

时间:2018-09-07 14:23:19

标签: nlp deep-learning pytorch word-embedding torchtext

我在NLP项目中使用Torchtext。我已经在我的系统中使用了预训练的嵌入,我想使用它。因此,我尝试了:

my_field.vocab.load_vectors(my_path)

但是,显然,由于某种原因,这仅接受简短接受的嵌入列表的名称。特别是,我收到此错误:

Got string input vector "my_path", but allowed pretrained vectors are ['charngram.100d', 'fasttext.en.300d', ..., 'glove.6B.300d']

我找到了一些people with similar problems,但是到目前为止,我能找到的解决方案是“更改Torchtext源代码”,我将尽可能避免。

还有其他方法可以用来进行预训练的嵌入吗?可以使用允许使用另一种西班牙文预训练嵌入的解决方案。

某些人似乎认为不清楚我在说什么。因此,如果标题和最后一个问题还不够:“我需要使用在Torchtext中嵌入预训练的西班牙语单词来寻求帮助”。

1 个答案:

答案 0 :(得分:1)

事实证明,有一种相对简单的方法可以执行此操作,而无需更改Torchtext的源代码。 Github thread的启发。

1。创建numpy词向量张量

您需要加载嵌入内容,以便最终得到一个尺寸为(number_of_words,word_vector_length)的numpy数组:

my_vecs_array [word_index]应该返回您相应的单词向量。

重要。该数组必须使用Torchtext的单词索引字典(field.vocab.stoi)构建。否则,Torchtext将指向错误的向量!

别忘了转换为张量:

my_vecs_tensor = torch.from_numpy(my_vecs_array)

2。将数组加载到Torchtext

由于下一个步骤,我认为这一步骤并不是真正必要的,但是它允许将Torchtext字段与字典和向量一起放在一个位置。

my_field.vocab.set_vectors(my_field.vocab.stoi, my_vecs_tensor, word_vectors_length)

3。将权重传递给模型

在模型中,您将这样声明嵌入:

my_embedding = toch.nn.Embedding(vocab_len, word_vect_len)

然后您可以使用以下方法加载体重:

my_embedding.weight = torch.nn.Parameter(my_field.vocab.vectors, requires_grad=False)

如果要训练嵌入,请使用require_grad = True;如果要冻结嵌入,请使用False。

编辑:看来another way看起来更简单!改进之处在于,显然您可以在词汇构建步骤中直接传递经过预训练的单词向量,因此这里需要执行步骤1-2。