【问题标题】:How to get most similar words to a document in gensim doc2vec?如何在 gensim doc2vec 中获取与文档最相似的单词?
【发布时间】:2018-08-14 23:47:49
【问题描述】:

我已经建立了一个 gensim Doc2vec 模型。我们称之为 doc2vec。现在我想根据我的 doc2vec 模型找到与给定文档最相关的单词。

例如,我有一个关于“java”的文档,其标签为“doc_about_java”。当我要求类似的文档时,我会得到有关其他编程语言和与 java 相关的主题的文档。所以我的文档模型运行良好。

现在我想找到与“doc_about_java”最相关的词。

我遵循封闭问题How to find most similar terms/words of a document in doc2vec? 的解决方案,它给了我看似随机的词,“java”这个词甚至不在前 100 个相似词中:

docvec = doc2vec.docvecs['doc_about_java']
print doc2vec.most_similar(positive=[docvec], topn=100)

我也试过这样:

print doc2vec.wv.similar_by_vector(doc2vec["doc_about_java"])

但它并没有改变任何东西。如何找到与给定文档最相似的词?

【问题讨论】:

    标签: word2vec gensim doc2vec


    【解决方案1】:

    并非所有Doc2Vec 模式都可以训练词向量。特别是 PV-DBOW 模式dm=0,它通常非常适用于 doc-vector 比较,它将词向量留在随机分配(和未使用)的位置。

    这可以解释为什么您最初尝试获取相关单词列表的结果似乎是随机的。

    要获得词向量,您需要使用 PV-DM 模式 (dm=1),或者将可选的并发词向量训练添加到 PV-DBOW (dm=0, dbow_words=1)。

    (如果这不是问题,那么您的训练设置中可能存在其他问题,因此您应该显示有关您的数据源、大小和代码的更多详细信息。)

    (另外,您的替代尝试代码行通过使用doc2vec["doc_about_java"] 正在检索"doc_about_java" 的词向量(可能根本不存在)。要获取文档向量,请使用doc2vec.docvecs["doc_about_java"],就像在你的第一个代码块中一样。)

    【讨论】:

    • 谢谢!这就是我训练的方式:doc2vec = Doc2Vec(documents = tagged_documents, vector_size = Dimensionity, window = 8, min_count = 5, workers = 4, epochs = epochs)。根据radimrehurek.com/gensim/models/doc2vec.html dm=1 是默认参数,所以我假设训练是在 PV-DM 模式下。我应该明确指定 dm=1 吗?
    • 另外我猜词向量已经被训练过了,因为 print doc2vec.wv.most_similar("java", topn=10) 给了我 [(u'java/j2ee', 0.4498763680458069), (u 'java.', 0.40088707208633423), (u'java/', 0.37919291853904724), (u'java/java', 0.3360544443130493), (u'jpa/hibernate', 0.3188815116882324), (u'java/java/jee', (u'jpa/hibernate', 0.3188815116882324), (u'java/java/jee'86351874391663938 , (u'jsps', 0.30111759901046753), (u'andgenuinely', 0.2981807589530945), (u'sti-f-06', 0.2916569113731384), (u'-jpa', 0.2886544466018677)]
    • 是的,因为dm=1 是默认值,您不需要指定它,并且您应该同时获得文档向量和词向量。并且,您对单词 'java' 的最相似检查确认单词训练发生了。你确定你的探测'doc_about_java' 是关于 java 的文档的一个很好的例子吗? doc2vec.wv.similar_by_vector(doc2vec.docvecs['doc_about_java'] 的结果是否完全不相关?您使用的是小/薄数据集还是很少的训练通道?您确定正在发生与您预期的一样多的培训吗?尤其是 tagged_documents 作为可重新启动的迭代器和日志显示预期的进度?
    • 与文档相似的单词的结果完全不相关:它们看起来像一些非常罕见的标记的噪音,与 java 完全无关。关于java的文档很有代表性。数据集相当大。当我训练这个过程时,几乎消耗了 64G 的 RAM。你给了我一些提示。我将增加训练通过的数量并检查日志(如果我找到它们:-)
    • 我还要仔细检查 most_similar() doc-vec 结果是否与您想象的一样强大,以及其他一些代表性文档,看看这是一个普遍问题还是只是在一些特殊文档中.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多