为了账号安全,请及时绑定邮箱和手机立即绑定

如何将新词向量添加到 gensim.models.keyedvectors 并计算

如何将新词向量添加到 gensim.models.keyedvectors 并计算

宝慕林4294392 2022-03-09 20:57:44
根据Gensim 在 WordEmbeddingKeyedVectors 上的页面,您可以逐步添加新词向量的新键值对。但是,在使用预训练的向量及其标签初始化 WordEmbeddingKeyedVectors,并向其添加新的看不见的模型推断词向量后,该most_similar方法无法再使用。from gensim.models.keyedvectors import WordEmbeddingsKeyedVectorstest = WordEmbeddingsKeyedVectors(vector_size=3)test.add(entities=["1", "2"], weights=[np.random.randint(5, size=3),                                   np.random.randint(5, size=3)])test.most_similar("2") #THIS WORKStest.add(entities=['3'], weights=[np.random.randint(5, size=3)])test.most_similar("3") #THIS FAILS我希望输出是与输入标签最相似的矢量标签列表,但输出是:IndexError:索引 2 超出轴 0 的范围,大小为 2
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

事实上,我已经找到了解决这个问题的办法。


在gensim.models.keyedvectors文件中class WordEmbeddingKeyedVectors,我们可以从


def init_sims(self, replace=False):

    """Precompute L2-normalized vectors."""

    if getattr(self, 'vectors_norm', None) is None or replace:

        logger.info("precomputing L2-norms of word weight vectors")

        self.vectors_norm = _l2_norm(self.vectors, replace=replace)


def init_sims(self, replace=False):

    """Precompute L2-normalized vectors."""

    if getattr(self, 'vectors_norm', None) is None or replace:

        logger.info("precomputing L2-norms of word weight vectors")

        self.vectors_norm = _l2_norm(self.vectors, replace=replace)

    elif (len(self.vectors_norm) == len(self.vectors)): #if all of the added vectors are pre-computed into L2-normalized vectors

        pass 

    else: #when there are vectors added but have not been pre-computed into L2-normalized vectors yet

        logger.info("adding L2-norm vectors for new documents")

        diff = len(self.vectors) - len(self.vectors_norm)

        self.vectors_norm = vstack((self.vectors_norm, _l2_norm(self.vectors[-diff:])))

本质上,原始函数所做的是,如果没有self.vectors_norm,则通过 L2-normalizing 计算self.vectors。但是,如果其中有任何新添加的向量self.vectors没有被预先计算为 L2 归一化向量,我们应该预先计算它们然后添加到self.vectors_norm.


我会将其作为评论发布到您的错误报告@gojomo 并添加拉取请求!谢谢 :)


查看完整回答
反对 回复 2022-03-09
?
手掌心

TA贡献1942条经验 获得超3个赞

看来该操作并未清除由类似操作add()创建和重用的归一化到单位长度向量的缓存。most_similar()

在执行 之前或之后add(),您可以使用以下命令显式删除该缓存:

del test.vectors_norm

然后,您test.most_similar('3')应该在没有IndexError.


查看完整回答
反对 回复 2022-03-09
  • 2 回答
  • 0 关注
  • 458 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号