IndexError: index is out of bounds - word2vec
IndexError: index is out of bounds - word2vec
我使用大小为 512 的 Gensim 包训练了一个名为 word_vectors
的 word2vec 模型。
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:\Users200016\AppData\Local\Continuum\anaconda3\envs\ldaword2vec\lib\site-packages\gensim\models\keyedvectors.py", line 553, in most_similar
mean.append(weight * self.word_vec(word, use_norm=True))
File "C:\Users200016\AppData\Local\Continuum\anaconda3\envs\ldaword2vec\lib\site-packages\gensim\models\keyedvectors.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
错误似乎表明我的索引在这里不正确。但是因为我只是间接索引(使用键而不是实际的数字索引),所以我看不到我需要在这里更改什么。
谁知道这里出了什么问题?我该怎么做才能克服这个错误?
第一次执行 .most_similar()
时,一个 KeyedVectors
实例(在 gensim 版本到 3.8.3 中)将创建一个 unit-normalized 向量的缓存以协助所有后续 bulk-similarity 操作,并将其放在 .vectors_norm
.
看起来您添加的新向量并没有 flush/recalculate/expand 缓存 .vectors_norm
- 最初 KeyedVectors
class 和 .most_similar()
操作是设计时并未考虑 constantly-growing 或 constantly-changing sets-of-vectors,而是作为 post-training、冻结向量集的实用程序。
这就是你 IndexError
的原因。
您应该能够 work-around 通过明确清除 .vectors_norm
任何时候您对 KeyedVectors
执行 modifications/additions,例如:
word_vectors.vectors_norm = None
(这在下一个 4.0.0 版本的 gensim 中应该不是必需的,但我会 double-check 那里没有类似的问题。)
分开:
您的 'word_vector' is not defined
错误仅仅是因为您似乎将 's' 从您选择的变量名称 word_vectors
中删除了
您可能不需要使用 gensim-testing-utility-method get_tmpfile()
- 只需使用您自己明确的、有意的文件系统路径来保存和加载
使用KeyedVectors.load()
是否合适取决于保存的内容。如果您实际上要保存完整的 Word2Vec
class 实例(不仅仅是向量),使用 Word2Vec.load()
会更合适。
我使用大小为 512 的 Gensim 包训练了一个名为 word_vectors
的 word2vec 模型。
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:\Users200016\AppData\Local\Continuum\anaconda3\envs\ldaword2vec\lib\site-packages\gensim\models\keyedvectors.py", line 553, in most_similar
mean.append(weight * self.word_vec(word, use_norm=True))
File "C:\Users200016\AppData\Local\Continuum\anaconda3\envs\ldaword2vec\lib\site-packages\gensim\models\keyedvectors.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
错误似乎表明我的索引在这里不正确。但是因为我只是间接索引(使用键而不是实际的数字索引),所以我看不到我需要在这里更改什么。
谁知道这里出了什么问题?我该怎么做才能克服这个错误?
第一次执行 .most_similar()
时,一个 KeyedVectors
实例(在 gensim 版本到 3.8.3 中)将创建一个 unit-normalized 向量的缓存以协助所有后续 bulk-similarity 操作,并将其放在 .vectors_norm
.
看起来您添加的新向量并没有 flush/recalculate/expand 缓存 .vectors_norm
- 最初 KeyedVectors
class 和 .most_similar()
操作是设计时并未考虑 constantly-growing 或 constantly-changing sets-of-vectors,而是作为 post-training、冻结向量集的实用程序。
这就是你 IndexError
的原因。
您应该能够 work-around 通过明确清除 .vectors_norm
任何时候您对 KeyedVectors
执行 modifications/additions,例如:
word_vectors.vectors_norm = None
(这在下一个 4.0.0 版本的 gensim 中应该不是必需的,但我会 double-check 那里没有类似的问题。)
分开:
您的
中删除了'word_vector' is not defined
错误仅仅是因为您似乎将 's' 从您选择的变量名称word_vectors
您可能不需要使用 gensim-testing-utility-method
get_tmpfile()
- 只需使用您自己明确的、有意的文件系统路径来保存和加载使用
KeyedVectors.load()
是否合适取决于保存的内容。如果您实际上要保存完整的Word2Vec
class 实例(不仅仅是向量),使用Word2Vec.load()
会更合适。