python - 如何在gensim.doc2vec中使用infer_vector?

标签 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 中模型和 vector1infer_vector() 生成.但这不合理啊……

我发现我哪里出错了。我应该用'string=u'公民为了爸爸我要坚强地...'而不是'string='公民为了爸爸我要坚强地...' '.当我这样修正时,余弦距离最大为0.889342。

最佳答案

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

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

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

最后,请注意 Doc2Vecdocvecs 组件上的 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/

相关文章:

python - 如何在Pycharm中执行代码块科学模式

python - 在 PyGObject 中使用 GtkSourceView 从 Glade 加载 GUI

python - 监控程序崩溃

python - gensim:自定义相似性度量

neural-network - 训练一个 doc2Vec 模型实际需要多少数据?

python - WikiCorpus 在 gensim 中执行什么文本处理?

python - 如何使用 matplotlib 创建多个饼图

classification - 获取 doc2vec 中未见过的段落的段落表示

java - dl4j - paragraph2vec 中的标签机制是什么?

python - 如何对合法领域的文本文档进行分类