如何在gensim.doc2vec中使用infer_vector?

Jef*_*ery 4 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)
Run Code Online (Sandbox Code Playgroud)

-0.0232586

我使用火车数据来训练doc2vec模型.然后,我infer_vector()用来生成一个给定文档的向量,该文档在训练数据中.但他们是不同的.余弦的值是如此之小(-0.0232586)vector2doc2vec模型中保存的距离和由... vector1生成的距离infer_vector().但这不合理啊......

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

goj*_*omo 15

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

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

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

最后,需要注意的是,most_similar()在方法Doc2Vecdocvecs组件也可以采取原始载体,给回最相似已经知道向量的列表.所以你可以试试以下......

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

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