#python-3.x #numpy #gensim #word2vec #index-error
#python-3.x #numpy #gensim #word2vec #ошибка индекса
Вопрос:
Я обучил модель word2vec под названием word_vectors
, используя пакет Gensim с размером = 512.
fname = get_tmpfile('word2vec.model')
word_vectors = KeyedVectors.load(fname, mmap='r')
Теперь я создал новый массив Numpy (также размером 512), который я добавил в word2vec следующим образом:
vector = (rand(512)-0.5) *20
word_vectors.add('koffie', vector)
Кажется, что все идет нормально, и даже когда я вызываю
word_vectors['koffie']
Я получаю массив в качестве выходных данных, как и ожидалось.
Однако, когда я хочу найти наиболее похожие слова в моей модели и запустить следующий код:
word_vectors.most_similar('koffie')
Я получаю следующую ошибку:
Traceback (most recent call last):
File "<ipython-input-283-ce992786ce89>", line 1, in <module>
word_vectors.most_similar('koffie')
File "C:Users20200016AppDataLocalContinuumanaconda3envsldaword2veclibsite-packagesgensimmodelskeyedvectors.py", line 553, in most_similar
mean.append(weight * self.word_vec(word, use_norm=True))
File "C:Users20200016AppDataLocalContinuumanaconda3envsldaword2veclibsite-packagesgensimmodelskeyedvectors.py", line 461, in word_vec
result = self.vectors_norm[self.vocab[word].index]
IndexError: index 146139 is out of bounds for axis 0 with size 146138
word_vector.size()
Traceback (most recent call last):
File "<ipython-input-284-2606aca38446>", line 1, in <module>
word_vector.size()
NameError: name 'word_vector' is not defined
Ошибка, похоже, указывает на то, что моя индексация здесь неверна. Но поскольку я индексирую только косвенно (с помощью ключа, а не фактического числового индекса), я не вижу, что мне нужно здесь изменить.
Кто знает, что здесь пошло не так? И что я могу сделать, чтобы преодолеть эту ошибку?
Ответ №1:
При первом выполнении .most_similar()
экземпляр KeyedVectors
(в версиях gensim от 3.8.3) создаст кэш нормализованных по единицам векторов, чтобы помочь во всех последующих операциях массового подобия, и поместит его в .vectors_norm
.
Похоже, что ваше добавление нового вектора не очистило / пересчитало / расширило этот кэш .vectors_norm
— первоначально KeyedVectors
класс и .most_similar()
операция не были разработаны с учетом постоянно растущих или постоянно меняющихся наборов векторов, а скорее как утилиты для постобучного, замороженного набора векторов.
Так вот в чем причина вашего IndexError
.
Вы должны быть в состоянии обойти это, явно очистив .vectors_norm
каждый раз, когда вы выполняете изменения / дополнения к KeyedVectors
, например:
word_vectors.vectors_norm = None
(В следующем выпуске gensim 4.0.0 в этом не должно быть необходимости, но я перепроверю, что там нет подобной проблемы.)
Отдельно:
-
Ваша
'word_vector' is not defined
ошибка просто потому, что вы, похоже, оставили ‘s’ в выбранном вами имени переменнойword_vectors
-
Вероятно, вам не нужно использовать gensim-testing-utility-method
get_tmpfile()
— просто используйте свои собственные явные, преднамеренные пути файловой системы для сохранения и загрузки -
Правильно ли это использовать
KeyedVectors.load()
, зависит от того, что было сохранено. Если вы на самом деле сохраняете полныйWord2Vec
экземпляр класса (больше, чем просто векторы), использованиеWord2Vec.load()
было бы более подходящим.