我正在尝试遵循此处提到的官方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不适合查询和信息提取吗?还是有错误?
答案 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))