我使用 Gensim 3.8.0 训练了 Word2Vec 模型。后来我尝试在GCP上使用Gensim 4.0.o来使用预训练模型。我使用了以下代码:
model = KeyedVectors.load_word2vec_format(wv_path, binary= False)
words = model.wv.vocab.keys()
self.word2vec = {word:model.wv[word]%EMBEDDING_DIM for word in words}
我收到错误消息“model.mv”已从 Gensim 4.0.0 中删除。 然后我使用了以下代码:
model = KeyedVectors.load_word2vec_format(wv_path, binary= False)
words = model.vocab.keys()
word2vec = {word:model[word]%EMBEDDING_DIM for word in words}
并出现以下错误:
AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0.
Use KeyedVector's .key_to_index dict, .index_to_key list, and methods .get_vecattr(key, attr) and .set_vecattr(key, attr, new_val) instead.
See https://github.com/RaRe-Technologies/gensim/wiki/Migrating-from-Gensim-3.x-to-4
任何人都可以建议我如何使用预训练模型并在 Gensim 4.0.0 中返回字典吗?
从 Gensim 3.x 迁移到 4 所引起的变化都存在于 github 链接中:
https://github.com/RaRe-Technologies/gensim/wiki/Migration-from-Gensim-3.x-to-4
对于上述问题,对我有用的解决方案:
words = list(model.wv.index_to_key)
迁移说明解释了主要更改以及如何调整代码:
https://github.com/RaRe-Technologies/gensim/wiki/Migration-from-Gensim-3.x-to-4
根据那里的指导,要获取单词列表,因为您的
model
变量已经是 KeyedVectors
的实例,您可以使用:
model.index_to_key
您的代码并不需要字典,但
model.key_to_index
中有一个略有不同的单词到索引位置字典。但是,您可以像以前一样使用 model[key]
来获取单独的向量。
(另外:我无法想象您的
%EMBEDDING_DIM
正在做任何有用的事情。为什么您要使用维度的整数计数来执行元素级 %
模数运算,针对通常是小浮点数的各个维度? 它通常是无害的,因为 EMBEDDING_DIM
通常会远远大于个人值,但它没有任何好的目的。)
在 gensim 4.0.0 上,您需要使用模型
key_to_index
中的 KeyedVector
方法,这将返回一个 dict_keys
对象,其中包含模型上的所有单词 -keys-,以便您仍然可以迭代你所有的词汇:)。
你的代码现在应该是这样的:
model = KeyedVectors.load_word2vec_format(wv_path, binary= False)
words = list(model.wv.key_to_index.keys())
self.word2vec = {word:model.wv[word]%EMBEDDING_DIM for word in words}
#查找单词中使用的词汇 word_vocab=模型。 wv.vocab() 我尝试了这个,但由于 gensim 的更新,它提供了这样的错误 Gensim 4.0.0 中的 vocab 属性已从 KeyedVector 中删除。 请使用 KeyedVector 的 .key_to_index 字典、.index_to_key 列表以及方法 .get_vecattr(key, attr) 和 .set_vecattr(key, attr, new_val) 代替。
因此,我尝试使用 kew_to_index.keys() 和列表 word_vocab=列表(model.wv.key_to_index.keys())