Gensim 3.8.0 в Gensim 4.0.0

Я обучил модель Word2Vec с помощью Gensim 3.8.0. Позже я попытался использовать предварительно обученную модель с помощью Gensim 4.0.o на GCP. Я использовал следующий код:

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?


person Md. Ahsanul Kabir Arif    schedule 30.03.2021    source источник


Ответы (2)


Все изменения, вызванные переходом с Gensim 3.x на 4, доступны по ссылке на github:

https://github.com/RaRe-Technologies/gensim/wiki/Миграция-из-Gensim-3.x-to-4

Для вышеуказанной проблемы решение, которое сработало для меня:

    words = list(model.wv.index_to_key)
person Debangan Mandal    schedule 09.05.2021

Примечания по миграции объясняют основные изменения и способы адаптации вашего кода:

https://github.com/RaRe-Technologies/gensim/wiki/Миграция-из-Gensim-3.x-to-4

В соответствии с руководством, чтобы просто получить список слов, поскольку ваша переменная model уже является экземпляром KeyedVectors, вы можете использовать:

model.index_to_key

В вашем коде нет необходимости в диктовке, но в model.key_to_index есть немного другая позиция слова в индексе. Однако вы можете просто использовать model[key], как и раньше, чтобы получить отдельные векторы.

(Отдельно: я не могу представить, что ваш %EMBEDDING_DIM делает что-то полезное. Зачем вам выполнять поэлементную операцию модуля %, используя целочисленное количество измерений, против отдельных измерений, которые часто являются небольшими числами с плавающей запятой? Часто это будет быть безвредным, так как EMBEDDING_DIM обычно будет намного больше, чем отдельные значения, но это не служит никакой хорошей цели.)

person gojomo    schedule 31.03.2021