Ошибка индекса: индекс выходит за рамки — word2vec

#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() было бы более подходящим.