Doc2Vec.infer_vector每次都会在特定的训练模型上保持不同的结果

时间:2018-01-21 00:31:49

标签: nlp word2vec gensim doc2vec

我正在尝试遵循此处提到的官方Doc2Vec Gensim教程 - https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-lee.ipynb

我修改了第10行中的代码以确定给定查询的最佳匹配文档,每次运行时,我得到一个完全不同的结果集。我在笔记本第10行的新代码是:

inferred_vector = model.infer_vector(['only', 'you', 'can', 'prevent', 'forest', 'fires']) sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs)) rank = [docid for docid, sim in sims] print(rank)

每当我运行这段代码时,我会获得与此查询匹配的不同文档集:"只有您可以防止森林火灾"。差别很明显,似乎并不匹配。

Doc2Vec不适合查询和信息提取吗?还是有错误?

2 个答案:

答案 0 :(得分:8)

查看代码,在infer_vector中,您使用的算法部分是非确定性的。单词向量的初始化是确定性的 - 参见seeded_vector的代码,但是当我们进一步观察时,即单词的随机抽样,负抽样(每次迭代仅更新样本的单词向量)导致非确定性输出(感谢@gojomo)。

    def seeded_vector(self, seed_string):
        """Create one 'random' vector (but deterministic by seed_string)"""
        # Note: built-in hash() may vary by Python version or even (in Py3.x) per launch
        once = random.RandomState(self.hashfxn(seed_string) & 0xffffffff)
        return (once.rand(self.vector_size) - 0.5) / self.vector_size

答案 1 :(得分:0)

设置negative = 0以避免随机化:

import numpy as np
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

documents = [list('asdf'), list('asfasf')]
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(documents)]
model = Doc2Vec(documents, vector_size=20,  window=5, min_count=1,  negative=0, workers=6, epochs=10) 
a = list('test sample')
b = list('testtesttest')
for s in (a, b):
    v1 = model.infer_vector(s)
    for i in range(100):
        v2 = model.infer_vector(s)
        assert np.all(v1 == v2), "Failed on %s" % (''.join(s))