Nlp 在西班牙语中与Torchtext一起使用预训练嵌入

Nlp 在西班牙语中与Torchtext一起使用预训练嵌入,nlp,deep-learning,pytorch,word-embedding,torchtext,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', ..., '

我正在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']
我找到了一些,但到目前为止我能找到的解决方案是“更改Torchtext源代码”,如果可能的话,我宁愿避免

有没有其他方法可以让我使用预训练的嵌入?允许使用另一个西班牙语预训练嵌入的解决方案是可以接受的


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

事实证明,有一种相对简单的方法可以做到这一点,而无需更改Torchtext的源代码。灵感来自于此

1。创建numpy单词向量张量

您需要加载嵌入,以便最终得到一个具有维度的numpy数组(单词数、单词向量长度):

my_vecs_数组[单词索引]应返回相应的单词向量

重要的。此数组的索引(单词索引)必须取自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


编辑:看起来有一个看起来更容易的!改进之处在于,显然您可以在词汇构建步骤中直接传递预先训练好的单词向量,这样就可以完成这里的步骤1-2。

事实证明,有一种相对简单的方法可以做到这一点,而无需更改Torchtext的源代码。灵感来自于此

1。创建numpy单词向量张量

您需要加载嵌入,以便最终得到一个具有维度的numpy数组(单词数、单词向量长度):

my_vecs_数组[单词索引]应返回相应的单词向量

重要的。此数组的索引(单词索引)必须取自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


编辑:看起来有一个看起来更容易的!改进之处在于,显然您可以在词汇构建步骤中直接传递预先训练好的单词向量,这样就可以完成这里的步骤1-2。

不确定在编写此答案时是否可以这样做,但您也可以使用嵌入类方法来完成。我也不确定。我认为使用from_pretrained会使最后两步更干净。谢谢你的贡献:)我不确定在写这个答案时这是否可行,但是你也可以使用嵌入类方法来实现。我也不确定。我认为使用from_pretrained会使最后两步更干净。感谢您的贡献:)