Python 如何在gensim.doc2vec中使用推断向量?

Python 如何在gensim.doc2vec中使用推断向量?,python,gensim,doc2vec,Python,Gensim,Doc2vec,-0.0232586 我使用列车数据来训练doc2vec模型。然后,我使用expert_vector()生成一个给定文档的向量,该文档是经过训练的数据。但它们是不同的。保存在doc2vec模型中的vector2与由推断向量()生成的vector1之间的余弦值非常小(-0.0232586)。但这是不合理的啊 我找到了我的错误所在。我应该使用'string=u'民生 为了 父亲 我 要 坚强 地 ...'' 而不是“字符串”民生 为了 父亲 我 要 坚强 地 ...''. 当我以这种方式更正时,余弦

-0.0232586

我使用列车数据来训练
doc2vec
模型。然后,我使用
expert_vector()
生成一个给定文档的向量,该文档是经过训练的数据。但它们是不同的。保存在
doc2vec
模型中的
vector2
与由
推断向量()生成的
vector1
之间的余弦值非常小(
-0.0232586
)。但这是不合理的啊


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

正如您所注意到的,
推断向量()
要求其
doc_words
参数是一个标记列表–与训练模型时使用的相同类型的标记匹配。(向其传递字符串会使其仅将每个单独的字符视为标记化列表中的一个项目,即使其中一些标记是已知的词汇表标记(如英语中的“a”和“I”),也不太可能获得好的结果。)

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

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

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

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)

…并获得前10名最相似的
(doctag,相似性评分)
对的排名列表

你用的是什么余弦?gensim@c中有一个余弦函数ᴏʟᴅsᴘᴇᴇᴅ ,余弦函数是
def cosine(vector1,vector2):cosV12=np.dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))返回cosV12
I找到错误所在。我应该使用'string=u'民生 为了 父亲 我 要 坚强 地 ...'' 而不是“字符串”民生 为了 父亲 我 要 坚强 地 ...''. 当我这样纠正时,余弦距离达到0.889342。你的答案完美而详细。我会仔细考虑你的回答。谢谢你所做的一切@gojomoI使用经过训练的向量数据(从经过良好训练的doc2vec中检索)来训练神经网络,因此我希望从推断向量()中获得相同的结果,以便适应神经网络@对于相同的推理文本,Doc2Vec的输出完全相同,训练下游神经网络,gojomoIt不应该是严格必要的。(事实上,单个文本的交替Doc2Vec矢量化中的“抖动”甚至可能有助于将文本含义的不精确范围传达给下游NN,从而改善总体模型。但不确定。)
ivec = model.infer_vector(doc_words=tokens_list, steps=20, alpha=0.025)
print(model.most_similar(positive=[ivec], topn=10))