【问题标题】:Doc2vec: How can I manually modify a trained vector in a Doc2Vec gensim model?Doc2vec:如何在 Doc2Vec gensim 模型中手动修改经过训练的向量?
【发布时间】:2019-11-20 22:17:36
【问题描述】:

我想用另一个具有不同权重的 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)

有人可以帮我吗?

谢谢。

【问题讨论】:

  • 你能分享你的mymodel.doc2vec 或者我们可以测试的东西吗?
  • 通读docs,它看起来可能是model.docvecs['doc003'] = new_vector 的形式,但我必须查看一些示例 mymodel.doc2vec 才能查看对象结构。

标签: python vector doc2vec


【解决方案1】:

不要使用 `Word2Vec' 加载 Doc2Vec 模型。所以加载它而不是:

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

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

model.docvecs['88763'] = new_vector

(您将主要使用add() 为不存在的键添加向量。但是,如果您提供非默认的replace=True 参数以及实体列表和向量列表。)

更新:以上应该可以工作,但目前有一个pending bug(2019 年 11 月,gensim-3.8.1)它不会。

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

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

【讨论】:

  • 非常感谢您的建议,但还是不行。事实上,即使我尝试其他方法,例如 model.docvecs['88763'] = model.docvecs['88763']*2 向量替换根本不会发生
  • 啊哈,仔细看,我发现这些应该有效的方法(分配给 […]-access 或 add(…, replace=True))并没有为 .docvecs 对象正确实现(至少通过截至 2019 年 11 月的最新 gensim 版本,gensim-3.8.1)。我已经提交了一个错误报告 - github.com/RaRe-Technologies/gensim/issues/2683 - 并会尽快更新我的答案并提供解决方法,直到修复为止。
  • 感谢您的帮助,我看到您在 GH 上没有收到任何答复。你认为我可以用另一种方法来修改现有向量吗?这对我的目的非常有帮助
  • 我的 '*Update*` 中的代码建议有什么问题,使用该两步过程?它目前应该可以工作。
  • 真的很抱歉我没有阅读更新,但是我得到了这个错误:“int_index() 缺少 2 个必需的位置参数:'doctags' 和 'max_rawint'”--> 也许我必须设置这些论点在某种程度上?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2018-07-31
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多