gensim Word2vec 作为 HTTP 服务的代码 'KeyedVectors' 属性错误



我正在使用 https://rare-technologies.com/word2vec-tutorial/#bonus_app 运行的word2vec HTTP服务器的w2v_server_googlenews代码。我将加载的文件更改为使用原始 C 版本的 word2vec 训练的向量文件。我加载文件

gensim.models.KeyedVectors.load_word2vec_format(fname, binary=True)

而且它似乎加载没有问题。但是当我测试 HTTP 服务时,假设

curl 'http://127.0.0.1/most_similar?positive%5B%5D=woman&positive%5B%5D=king&negative%5B%5D=man' 

我得到了一个只有执行时间的空结果。

{"taken": 0.0003361701965332031, "similars": [], "success": 1}

我在相关方法的 except 部分放了一个traceback.print_exc(),在这种情况下是def most_similar(self, *args, **kwargs):,我得到了:

Traceback (most recent call last):
  File "./w2v_server.py", line 114, in most_similar
    topn=5)
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/keyedvectors.py", line 304, in most_similar
    self.init_sims()
  File "/usr/local/lib/python2.7/dist-packages/gensim/models/keyedvectors.py", line 817, in init_sims
    self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL)
AttributeError: 'KeyedVectors' object has no attribute 'syn0'

知道为什么会发生这种情况吗?

注意:我使用python 2.7,我使用pip安装了gensim,这给了我gensim 2.1.0。

仅供参考,演示代码基于 gensim 0.12.3(从 2015 年开始,如其requirements.txt中所列(,并且需要更新才能使用最新的 Gensim。

在删除原始syn0值之前,在第 70 行(紧随load_word2vec_format()之后(向 w2v_server.py 添加一行可能就足够了,以强制创建所需的 syn0norm 属性(在较旧的 gensims 中是在加载时自动创建的(。具体说来:

self.model.init_sims(replace=True)

(如果您要执行most_similar()以外的操作,则需要原始向量,则需要replace=True

如果这可以为您解决问题,那么对w2v_server_googlenews存储库的拉取请求将得到有利的接收!

最新更新