Doc2Vec 结果不符合预期

Doc2Vec results not as expected

我正在为推荐人评估 Doc2Vec API。我没能找到一个像样的预训练模型,所以我在语料库上训练了一个模型,大约有 8,000 个小文档。

    model = Doc2Vec(vector_size=25,
                    alpha=0.025,
                    min_alpha=0.00025,
                    min_count=1,
                    dm=1)

然后我循环遍历语料库,为每个文档找到相似的文档。结果不是很好(与 TF-IDF 相比)。请注意,这是在测试不同的时期和向量大小之后。

    inferred_vector = model.infer_vector(row['cleaned'].split())
    sims = model.docvecs.most_similar([inferred_vector], topn=4)

我也尝试提取经过训练的向量并使用 cosine_similarty,但结果更糟糕。

cosine_similarities = cosine_similarity(model.docvecs.vectors_docs, model.docvecs.vectors_docs)

是我做错了什么还是语料库太小了?

编辑: 准备和培训代码

def unesc(s):
    for idx, row in s.iteritems():
        s[idx] = html.unescape(row)
    return s

custom_pipeline = [
    preprocessing.lowercase,
    unesc,
    preprocessing.remove_urls,
    preprocessing.remove_html_tags,
    preprocessing.remove_diacritics,
    preprocessing.remove_digits,
    preprocessing.remove_punctuation,
    lambda s: hero.remove_stopwords(s, stopwords=custom_stopwords),
    preprocessing.remove_whitespace,
    preprocessing.tokenize
]

ds['cleaned'] = ds['body'].pipe(hero.clean, pipeline=custom_pipeline)
w2v_total_data = list(ds['cleaned'])
tag_data = [TaggedDocument(words=doc, tags=[str(i)]) for i, doc in enumerate(w2v_total_data)]

model = Doc2Vec(vector_size=25,
                alpha=0.025,
                min_alpha=0.00025,
                min_count=1,
                epochs=20,
                dm=1)

model.build_vocab(tag_data)
model.train(tag_data, total_examples=model.corpus_count, epochs=model.epochs)
model.save("lmdocs_d2v.model")

如果没有看到您的训练代码,文本准备和训练中很容易出现错误。许多在线代码示例在 Doc2Vec 训练技术上都是错误的!

请注意,min_count=1 对于这种算法基本上总是一个坏主意:任何表明这可能来自被误导的作者的例子。

仅仅是.split()也是唯一应用于训练的标记化吗? (推理 list-of-tokens 应该与训练 lists-of-tokens 一样准备。)

“不太好”和“差得离谱”是如何评价的?例如,结果看起来是随意的,还是 in-the-right-direction-but-just-weak?

“8000个小文档”对于一个训练语料库来说有点单薄,但多少取决于“多小”——几个词,一句话,几句话?转向更小的向量,或更多的训练时期,有时可以充分利用较小的训练集——但这种算法最适合处理大量数据,这样就可以训练密集的 100d-or-more 向量。