如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?

Posted

技术标签:

【中文标题】如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?【英文标题】:How to access document details from Doc2Vec similarity scores in gensim model? 【发布时间】:2018-05-03 07:50:54 【问题描述】:

我得到了一个使用 gensim 的 doc2vec 模型,该模型在 2000 万个文档上进行了训练。它训练的 2000 万份文件也给了我,但我不知道这些文件是如何或以何种顺序从文件夹中训练的。我应该使用测试数据从训练集中找到前 10 个匹配项。我使用的代码是 -

model = gensim.models.doc2vec.Doc2Vec.load("doc2vec_sample.model")

test_docs=["This is the test set I want to test on."]

def read_corpus(documents, tokens_only=False):
    count=0
    count=count+1
    for line in documents:
        if tokens_only:
            yield gensim.utils.simple_preprocess(line)
        else:
            # For training data, add tags
            yield gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(line), [count])


test_corpus = list(read_corpus(test_docs, tokens_only=True))

doc_id=0

inferred_vector = model.infer_vector(test_corpus[doc_id])
maxx=10
sims = model.docvecs.most_similar([inferred_vector], topn=maxx)

for match in sims:
    print match

` 我得到的输出是 -

(1913, 0.4589531719684601)
(3250, 0.4300411343574524)
(1741, 0.42669129371643066)
(1, 0.4023148715496063)
(1740, 0.3929900527000427)
(1509, 0.39229822158813477)
(3189, 0.387174129486084)
(3145, 0.3842133581638336)
(1707, 0.3813004493713379)
(3200, 0.3754497170448303)

我如何知道文档 ID“1913”指的是哪个文档?如何从这 10 个工作 ID 中访问训练数据集的文档?

【问题讨论】:

documents[i],不是吗? documents[i] 是指训练文档,我需要测试文档中的数据。 @User54211 遇到了同样的问题。找到任何解决方案..? @NSQuamber.java 遇到了同样的问题。我发现的唯一解决方案是,当创建训练集时,相同序列中的每个文档在此处将具有相同的 id,但这对我的情况没有帮助,因为我不知道训练是如何完成的。 【参考方案1】:

最好的方法是询问训练模型的人他们如何为文档分配 ID(Doc2Vec 术语中的“标签”)。

如果不可用,请查看训练语料库,看看是否有任何适用于文档的自然命名或排序。 (它们是每个文件一个吗?那么可能按排序顺序的文件名映射到升序的 ID。每个文档是单个文件中的一行吗?那么行号可能是 ID-tag。

当您有一个理论时,如果该模型是一个经过有效训练的模型,那么您可以通过查看 most_similar() 结果是否适用于该 ID-tag 解释来对其进行测试。

您可以以特别的方式执行此操作 - 查询文档的结果或随机探测对您来说看起来不错吗?

或者您可以尝试将其形式化,例如通过重新推断已知在训练集中的文档的向量,然后寻找与这些向量最相似的文档。 如果模型是好的并且如果推理运行良好(这可能需要调整infer_vector()参数,然后是向量的“顶击”,或者一个最热门的,应该是完全相同的文档。

但实际上,如果模型的文档记录很差,您无法将文档与 ID 相关联,并且原始人不可用,您可能希望将其丢弃并重新训练文档更好的文档程序。

【讨论】:

【参考方案2】:

只需将文档打印到列表中并查询 2000 万列表。当然,您不想打印(文档)并在屏幕上获得 2000 万个向量。将文档中的列表插入数据库表可能更有效。当您打印文档向量(即来自 gensim doc2vec 教程的 train_corpus)时,结果是以下格式的列表: [TaggedDocument(words=['token1', 'token2',..., 'tokenn'], tags=[文档编号])。 您可以查询此结果以查找列表中的第 1913 个文档。

【讨论】:

以上是关于如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?的主要内容,如果未能解决你的问题,请参考以下文章

Doc2vec:gensim doc2vec模型中只有10个docvecs?

gensim doc2vec 从预训练模型中训练更多文档

机器学习使用gensim 的 doc2vec 实现文本相似度检测

如何将 Gensim doc2vec 与预训练的词向量一起使用?

Gensim Doc2vec 已训练,但未保存

Gensim Doc2Vec most_similar() 方法未按预期工作