在 Torchtext 中使用西班牙语的预训练嵌入
Use pretrained embedding in Spanish with Torchtext
我在 NLP 项目中使用 Torchtext。我的系统中有一个预训练嵌入,我想使用它。因此,我尝试了:
my_field.vocab.load_vectors(my_path)
但是,显然,出于某种原因,这只接受 pre-accepted 嵌入的简短列表的名称。特别是,我收到此错误:
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 中使用 pre-trained 西班牙语 word-embedding”。
事实证明,有一种相对简单的方法可以在不更改 Torchtext 源代码的情况下执行此操作。灵感来源于此Github thread.
1.创建 numpy 词向量张量
您需要加载嵌入,以便最终得到一个维度为 (number_of_words、word_vector_length) 的 numpy 数组:
my_vecs_array[word_index]应该return你对应的词向量。
重要。该数组的索引 (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)
如果要训练嵌入,请使用requires_grad=True,如果要冻结嵌入,请使用False。
编辑:看起来 another way 看起来更容易一些!改进之处在于显然您可以在词汇构建步骤中直接传递预训练的词向量,这样就可以处理这里的步骤 1-2。
我在 NLP 项目中使用 Torchtext。我的系统中有一个预训练嵌入,我想使用它。因此,我尝试了:
my_field.vocab.load_vectors(my_path)
但是,显然,出于某种原因,这只接受 pre-accepted 嵌入的简短列表的名称。特别是,我收到此错误:
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 中使用 pre-trained 西班牙语 word-embedding”。
事实证明,有一种相对简单的方法可以在不更改 Torchtext 源代码的情况下执行此操作。灵感来源于此Github thread.
1.创建 numpy 词向量张量
您需要加载嵌入,以便最终得到一个维度为 (number_of_words、word_vector_length) 的 numpy 数组:
my_vecs_array[word_index]应该return你对应的词向量。
重要。该数组的索引 (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)
如果要训练嵌入,请使用requires_grad=True,如果要冻结嵌入,请使用False。
编辑:看起来 another way 看起来更容易一些!改进之处在于显然您可以在词汇构建步骤中直接传递预训练的词向量,这样就可以处理这里的步骤 1-2。