10
def cosine(vector1,vector2):
    cosV12 = np.dot(vector1, vector2) / (linalg.norm(vector1) * linalg.norm(vector2))
    return cosV12
model=gensim.models.doc2vec.Doc2Vec.load('Model_D2V_Game')
string='民生 为了 父亲 我 要 坚强 地 ...'
list=string.split(' ')
vector1=model.infer_vector(doc_words=list,alpha=0.1, min_alpha=0.0001,steps=5)
vector2=model.docvecs.doctag_syn0[0]
print cosine(vector2,vector1)

-0.0232586

我使用训练数据来训练doc2vec模型。然后,我用infer_vector()给定一个训练数据中的文档来生成一个向量。但它们是不同的。cosine 的值是如此之小( )保存在模型中的 与生成的-0.0232586之间的距离。但这不合理啊……vector2doc2vecvector1infer_vector()

我找到我的错误。我应该使用'string=u'民生为了父亲我要坚强地...''而不是'string='民生为了父亲我要坚强地...''。当我以这种方式纠正时,余弦距离达到 0.889342。

4

1 回答 1

23

正如您所注意到的,infer_vector()它的doc_words参数需要是一个标记列表——匹配用于训练模型的相同类型的标记化。(将字符串传递给它会使其仅将每个单独的字符视为标记化列表中的一个项目,即使其中一些标记是已知的词汇标记 - 就像英语中的 'a' 和 'I' - 你不太可能以获得好的结果。)

此外,许多模型的默认参数infer_vector()可能远非最佳。特别是,更大的steps(至少与模型训练迭代的数量一样大,但甚至可能大很多倍)通常是有帮助的。此外,较小的起始值alpha(可能只是批量训练的常见默认值 0.025)可能会产生更好的结果。

您对推理是否从批量训练中获得接近相同向量的向量的测试是对推理参数和早期训练的合理完整性检查——模型作为一个整体学习数据中的可概括模式吗?但由于 Doc2Vec 的大多数模式固有地使用随机性,或者(在批量训练期间)可能会受到多线程调度抖动引入的随机性的影响,因此您不应期望得到相同的结果。他们通常会越来越接近,你做的训练迭代/步骤越多。

最后,请注意's组件most_similar()上的方法也可以采用原始向量,以返回最相似的已知向量列表。所以你可以尝试以下...Doc2Vecdocvecs

ivec = model.infer_vector(doc_words=tokens_list, steps=20, alpha=0.025)
print(model.most_similar(positive=[ivec], topn=10))

...并获得前 10 名最相似(doctag, similarity_score)配对的排名列表。

于 2017-07-09T16:15:45.007 回答