Doc2vec:如何在Doc2Vec gensim模型中手动修改经过训练的向量?

时间:2019-11-20 22:17:36

标签: python vector doc2vec

我想将由Doc2vec模型创建的特定Doc2Vec向量替换为另一个具有不同权重的模型。

这些是现有向量的权重(仅是800个实际权重中的一部分):

array([ 1.72976881e-01,  2.44364753e-01, -9.90936995e-01, -1.03020036e+00,
       -1.41046381e+00,  1.00970473e-02, -1.84546992e-01,  3.77230316e-01,
        9.20825064e-01, -2.61079431e-01,  7.51454890e-01, -1.15353882e+00,
       -9.96422302e-03,  1.65010715e+00,  5.63869551e-02, -4.25169647e-01],
      dtype=float32)

我想用这些替换它们:

array([ 1.54585496e-01,  2.22857013e-01, -8.88102770e-01, -9.27794874e-01,
       -1.27402091e+00, -5.38651831e-04, -1.63646400e-01,  3.38727772e-01,
        8.28402698e-01, -2.29774594e-01,  6.77914560e-01, -1.04013634e+00,
       -1.37407500e-02,  1.48667252e+00,  5.83136305e-02, -3.88587236e-01]
      dtype=float32)

我尝试使用以下代码向我的模型添加新的向量:

model = gensim.models.Word2Vec.load('mymodel.doc2vec')
model.docvecs.add(entities=["88763"], weights=[new_vector])

我没有收到任何错误,但是当我回叫“ 88763”矢量时,我看到它尚未更新:

model.docvecs["88763"]

array([ 1.72976881e-01,  2.44364753e-01, -9.90936995e-01, -1.03020036e+00,
       -1.41046381e+00,  1.00970473e-02, -1.84546992e-01,  3.77230316e-01,
        9.20825064e-01, -2.61079431e-01,  7.51454890e-01, -1.15353882e+00,
       -9.96422302e-03,  1.65010715e+00,  5.63869551e-02, -4.25169647e-01],
      dtype=float32)

有人可以以某种方式帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

不要使用“ Word2Vec”加载Doc2Vec模型。因此,将其加载为:

model = gensim.models.Doc2Vec.load('mymodel.doc2vec')

加载后,您应该可以通过直接分配给方括号访问的条目来修改任何现有条目,例如:

model.docvecs['88763'] = new_vector

(您主要使用add()来为尚不存在的键添加向量。但是,如果您提供非默认的replace=True参数,也可以批量替换现有向量除了实体列表和向量列表。)

更新:上面的方法应该起作用,但是目前({2019年11月,gensim-3.8.1)没有pending bug

同时,要修改一个特定的现有向量,您可以对原始vectors_docs属性进行操作,并查找索引位置以更改自己。例如:

slot = model.docvecs.int_index('88763', 
                               model.docvecs.doctags,
                               model.docvecs.max_rawint)
model.docvecs.vectors_docs[slot] = new_vector