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 向量。
我正在为推荐人评估 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 向量。