如何在gensim.doc2vec中使用infer_vector?

时间:2017-07-09 05:19:44

标签: python gensim doc2vec

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()生成一个给定文档的向量,该文档在训练数据中。但他们是不同的。余弦值在-0.0232586模型中保存的vector2与由doc2vec生成的vector1之间的距离非常小(infer_vector())。但这不合理啊......

我发现我的错误在哪里。我应该使用' string = u'民生为了父亲我要坚强地...''相反' string ='民生为了父亲我要坚强地...''。当我以这种方式校正时,余弦距离最大为0.889342。

1 个答案:

答案 0 :(得分:12)

正如您所注意到的,infer_vector()要求其doc_words参数为令牌列表 - 与训练模型时使用的相同类型的标记化相匹配。 (将其传递给字符串会导致它只将每个字符视为标记化列表中的项目,即使一些标记是已知的词汇标记 - 与'a'和'I'一样用英语 - 你不太可能取得好成绩。)

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

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

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

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)对的排名列表。