【问题标题】:Gensim's Doc2vec - inferred vector isn't similarGensim 的 Doc2vec - 推断向量不相似
【发布时间】:2018-03-07 15:19:24
【问题描述】:

当我在大约 10k 个文档(每个都有几百个单词)的语料库上训练 Doc2vec(在 Python 中使用 Gensim 的 Doc2vec),然后使用相同的文档推断文档向量时,它们与经过训练的文档向量一点也不相似。我希望它们至少有些相似。

那是我做的model.docvecs['some_doc_id']model.infer_vector(documents['some_doc_id'])

少数第一个文档的训练向量和推断向量之间的余弦距离:

0.38277733326
0.284007549286
0.286488652229
0.173178792
0.370117008686
0.275438070297
0.377647638321
0.171194493771
0.350615143776
0.311795353889
0.342757165432

如您所见,它们并不十分相似。如果即使对于用于训练的文档,相似性也如此糟糕,我什至无法开始尝试推断看不见的文档。

训练配置:

model = Doc2Vec(documents=documents, dm=1, size=100, window=6, alpha=0.1, workers=4, 
seed=44, sample=1e-5, iter=15, hs=0, negative=8, dm_mean=1, min_alpha=0.01, min_count=2)

推断:

model.infer_vector(tokens, steps=20, alpha=0.025)

附注:文档总是以相同的方式进行预处理(我检查了相同的标记列表进入训练和推理)。

我也使用了一些参数,结果相似。因此,如果您的建议类似于“尝试增加或减少这个或那个训练参数”,我很可能已经尝试过了。也许我只是没有遇到“正确”的参数。

感谢您对我可以做些什么来使它更好地工作的任何建议。

编辑:我愿意并且能够使用任何其他可用的 Python 段落向量实现 (doc2vec)。不一定是这个。如果你知道另一个可以取得更好的结果。

编辑:最小的工作示例

import fnmatch
import os
from scipy.spatial.distance import cosine
from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from keras.preprocessing.text import text_to_word_sequence

files = {}
folder = 'some path'  # each file contains few regular sentences
for f in fnmatch.filter(os.listdir(folder), '*.sent'):
    files[f] = open(folder + '/' + f, 'r', encoding="UTF-8").read()

documents = []
for k, v in files.items():
    words = text_to_word_sequence(v, lower=True)  # converts string to list of words, removes commas etc.
    documents.append(TaggedDocument(tags=[k], words=words))

d2 = Doc2Vec(size=200, documents=documents)

for doc in documents:
    trained = d2.docvecs[doc.tags[0]]
    inferred = d2.infer_vector(doc.words, steps=50)
    print(cosine(trained, inferred))  # cosine similarity from scipy

【问题讨论】:

    标签: python gensim doc2vec


    【解决方案1】:

    您的documents 对象的类型是什么,您确定它是一个可多次迭代的对象,以便模型可以在TaggedDocument 形状的文本示例集上完成其所有16 次遍历吗?也就是说,iter(documents) 是否总是返回一个新的迭代器,所有项目都是TaggedDocument 形状的对象,在words 中具有正确的单词列表,在tags 中具有正确的标签列表? (一个常见的错误是提供一个只能迭代一次的语料库,然后忽略任何记录的提示/警告,即没有发生真正的训练。这种模型的推理/相似性结果基本上是随机的。)

    那么对于infer_vector()documents[tag] 真的只返回它所期望的单词列表(不是TaggedDocument 或字符串)吗? (用户经常提供字符串,而不是令牌列表,用于训练或推理words 并得到只是噪音的结果。)

    是否有评估指导的理由来更改各种默认值,无论是少量(window=6negative=8)还是大量(alpha=0.1min_count=2)?这样的调整可能不是您问题的主要因素,并且类默认值没有什么神奇之处。但在您掌握基本知识之前,最好坚持使用通用配置。 (然后,即使在基础工作正常之后,也将更改限制在那些可以通过可重复的评分过程证明更好的更改。)

    一些报告需要更高的steps 值(100 或更高)才能获得更好的推理结果,尽管这对于非常小的文档(几到几十个单词)而不是几百个您描述的文字文件。

    10k 个文档的语料库对于段落向量 (Doc2Vec) 来说偏小,但是对于较小的向量大小 (100) 和较大的迭代次数 (15),它可能是可行的。

    如果您仍然遇到问题,您应该使用更多代码来扩展您的问题,以展示 documents 的工作原理、一些建议性示例文档以及您的余弦相似度评估过程 - 看看其中是否有任何疏忽脚步。

    【讨论】:

    • 广告 1/documents 对象是一个 Python 列表。每个文档只是一个单词列表。广告 2/Documents[tag] 返回您所期望的 - 用于训练的相同单词列表 - 我 100% 确定。广告 3/ 没有指南。就像我说的,我玩弄了它。不用担心,我也尝试了默认设置,但使用它们并没有更好。广告 4/ 我也试过 100。没有帮助。广告 5/ 我手头有另一个语料库,有更多的文档,但我还没有开始。我还尝试了更大/更小的向量和更多/更少的迭代。同样糟糕的结果。广告 6/cos。相似度来自 scipy
    • 广告 6/ 我想我可以准备一些 MWE(或者说不工作),但这需要一些时间。
    • 如果documents 实际上是一个字符串列表的python 列表,那将不能作为Doc2Vec 的“文档”参数——这需要一个@ 列表987654342@-对象。而且,如果documents 是一个普通列表,您不能[]-访问documents['some_doc_id'] 的单词列表。所以你的答案和代码还不是完全一致的。如果您仍然遇到问题,您应该将代码和观察到的输出添加到您的问题中,显示如何设置documents,如何创建必要的TaggedDocument 对象,并显示示例words 列表,如检索并传递给infer_vector().
    • 为了这个问题,我正在简化。这不是同一个集合。对于培训,我将 TaggedDocument 对象列表发送到那里。为了推断,我有创建 TaggedDocument 列表的 {'doc_id', list-of-strings} 字典。我仔细检查并调试了所有这些东西,那里没有任何问题。无论如何,我回家后都会准备 MWE。你知道,如果我犯了这些错误,它甚至不会运行。例如,如果您向那里发送除 TaggedDocuments 之外的任何其他内容,Doc2vec 将引发错误。或者 Python 不喜欢在列表中使用文档['id']。
    • 好的,我添加了 MWE。
    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2019-02-28
    • 2022-01-17
    • 2019-03-02
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多