【发布时间】:2018-03-07 15:19:24
【问题描述】:
当我在大约 10k 个文档(每个都有几百个单词)的语料库上训练 Doc2vec(在 Python 中使用 Gensim 的 Doc2vec),然后使用相同的文档推断文档向量时,它们与经过训练的文档向量一点也不相似。我希望它们至少有些相似。
那是我做的model.docvecs['some_doc_id'] 和model.infer_vector(documents['some_doc_id'])。
少数第一个文档的训练向量和推断向量之间的余弦距离:
0.38277733326
0.284007549286
0.286488652229
0.173178792
0.370117008686
0.275438070297
0.377647638321
0.171194493771
0.350615143776
0.311795353889
0.342757165432
如您所见,它们并不十分相似。如果即使对于用于训练的文档,相似性也如此糟糕,我什至无法开始尝试推断看不见的文档。
训练配置:
model = Doc2Vec(documents=documents, dm=1, size=100, window=6, alpha=0.1, workers=4,
seed=44, sample=1e-5, iter=15, hs=0, negative=8, dm_mean=1, min_alpha=0.01, min_count=2)
推断:
model.infer_vector(tokens, steps=20, alpha=0.025)
附注:文档总是以相同的方式进行预处理(我检查了相同的标记列表进入训练和推理)。
我也使用了一些参数,结果相似。因此,如果您的建议类似于“尝试增加或减少这个或那个训练参数”,我很可能已经尝试过了。也许我只是没有遇到“正确”的参数。
感谢您对我可以做些什么来使它更好地工作的任何建议。
编辑:我愿意并且能够使用任何其他可用的 Python 段落向量实现 (doc2vec)。不一定是这个。如果你知道另一个可以取得更好的结果。
编辑:最小的工作示例
import fnmatch
import os
from scipy.spatial.distance import cosine
from gensim.models import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from keras.preprocessing.text import text_to_word_sequence
files = {}
folder = 'some path' # each file contains few regular sentences
for f in fnmatch.filter(os.listdir(folder), '*.sent'):
files[f] = open(folder + '/' + f, 'r', encoding="UTF-8").read()
documents = []
for k, v in files.items():
words = text_to_word_sequence(v, lower=True) # converts string to list of words, removes commas etc.
documents.append(TaggedDocument(tags=[k], words=words))
d2 = Doc2Vec(size=200, documents=documents)
for doc in documents:
trained = d2.docvecs[doc.tags[0]]
inferred = d2.infer_vector(doc.words, steps=50)
print(cosine(trained, inferred)) # cosine similarity from scipy
【问题讨论】: