我在Gensim的Doc2Vec模型中遇到了最相似的方法。当我运行most\u similar时,我只得到前10个标记文档的相似性(基于它们的标记,总是从0到9)。对于这段代码,我有topn=5,但是我使用了topn=len(documents),我仍然只得到前10个文档的相似性
标记文档:
tokenizer = RegexpTokenizer(r'\w+')
taggeddoc=[]
for index,wod in enumerate(model_data):
wordslist=[]
tagslist=[]
tokens = tokenizer.tokenize(wod)
td = TaggedDocument(gensim.utils.to_unicode(str.encode(' '.join(tokens))).split(), str(index))
taggeddoc.append(td)
documents=taggeddoc
实例化模型:
^{pr2}$训练模型:
for epoch in range(100):
if epoch % 10 == 0:
print("Training epoch {}".format(epoch))
model.train(documents, total_examples=model.corpus_count, epochs=model.iter)
model.alpha -= 0.002
model.min_alpha = model.alpha
问题就在这里(我想):
new = model_data[100].split()
new_vector = model.infer_vector(new)
sims = model.docvecs.most_similar([new_vector], topn=5)
print(sims)
输出:
[('3', 0.3732905089855194), ('1', 0.36121609807014465), ('7', 0.35790640115737915), ('9', 0.3569292724132538), ('2', 0.3521473705768585)]
训练模型前后文档长度相同。不知道为什么只返回前10个文档的相似性。在
附带问题:根据任何人的经验,如果输入的文档非常短(约50个单词),并且有超过2000个文档,那么使用Word2Vec还是Doc2Vec更好?谢谢你的帮助!在
TaggedDocument()
的第二个参数,tags
,应该是一个标记列表,而不是一个字符串。在通过提供单个字符串的简单整数,如
'109'
,这被解释为标记列表['1', '0', '9']
-因此在整个语料库中,只会遇到/训练10个唯一的标记,即数字0-9。在让它成为一个单独的标记列表,比如
[str(index)]
,您将得到更像您期望的结果。在关于你的附带问题,}在训练数据中有数百万个单词的大粒子上效果最好。对于这些算法来说,仅仅2000个文档*每个文档最多50个单词,最多10万个训练单词,对于这些算法来说是非常小的。通过使用一个更小的
Word2Vec
和{size
模型和更多的训练iter
过程,您可能可以弥补一些轻微的结果,但这并不是这些算法能够很好地工作的数据集/问题。在另外,你的训练代码是完全错误的。在
如果您为
Doc2Vec
初始化提供documents
,它将自动完成所有需要的词汇发现和iter
训练过程–不要再调用train()
。如果由于某种原因在初始化时没有提供}。
documents
,那么通常应该同时调用build_vocab()
和{几乎没有人应该在显式循环中多次更改
min_alpha
或多次调用train()
:你几乎肯定会做错,就像这里,在100个循环中,你将有效的alpha
从0.025减为0.002,最终得到一个无意义的负学习率-0.175。不要这样,如果你从一个可信的在线资源中复制了这个方法,请让这个来源知道他们的代码有问题。相关问题 更多 >
编程相关推荐