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

Code for gensim Word2vec as an HTTP service 'KeyedVectors' Attribute error

我正在使用w2v_server_googlenews code from the word2vec HTTP server running at https://rare-technologies.com/word2vec-tutorial/#bonus_app。我将加载的文件更改为使用原始 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。

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

self.model.init_sims(replace=True)

(如果您要进行 most_similar() 以外的操作,则可能会省略 replace=True,这可能需要原始向量。)

如果这能为您解决问题,那么欢迎向 w2v_server_googlenews 存储库发出拉取请求!