2

我得到了一个使用 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 中访问训练数据集的文档?

4

2 回答 2

3

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

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

当您有一个理论时,如果该模型是一个经过有效训练的模型,那么您可以通过查看most_similar()结果是否与该 ID-tag 解释有意义来测试它。

你可以以一种特别的方式来做到这一点——查询文档的结果或随机探测对你来说看起来不错吗?

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

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

于 2017-11-22T19:23:33.143 回答
0

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

于 2018-04-20T18:54:21.810 回答