- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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。
最佳答案
正如您所注意到的,infer_vector()
要求它的 doc_words
参数是一个标记列表——与训练模型时使用的相同类型的标记化相匹配. (向它传递一个字符串会导致它只将每个单独的 字符 视为标记化列表中的一个项目,即使其中一些标记是已知的词汇标记——如 'a' 和 'I'用英语——你不太可能得到好的结果。)
此外,infer_vector()
的默认参数对于许多模型来说可能远非最佳。特别是,更大的steps
(至少与模型训练迭代次数一样大,但可能甚至大很多倍)通常是有帮助的。此外,较小的起始 alpha
(可能只是批量训练的常见默认值 0.025)可能会提供更好的结果。
您测试推理是否从批量训练中获得接近相同向量的向量是一个合理的健全性检查,您的推理参数和较早的训练 – 是整个模型学习数据中的可概括模式?但是由于 Doc2Vec 的大多数模式本质上使用随机性,或者(在批量训练期间)可能会受到多线程调度抖动引入的随机性的影响,因此您不应期望得到相同的结果。他们通常会变得更近,你做的训练迭代/步骤越多。
最后,请注意 Doc2Vec
的 docvecs
组件上的 most_similar()
方法也可以采用原始向量,以返回一个最相似的已知向量列表。所以你可以尝试以下...
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)
对的排名列表。
关于python - 如何在gensim.doc2vec中使用infer_vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993240/
我是一名优秀的程序员,十分优秀!