问题描述
我在Gensim的Doc2Vec模型中使用most_like方法遇到麻烦。 当我运行most_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
实例化模型:
model=gensim.models.Doc2Vec(documents, dm=0, dbow_words=1, iter=1, alpha=0.025, min_alpha=0.025, min_count=10)
训练模型:
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个单词)并且有> 2,000个文档,那么使用Word2Vec或Doc2Vec更好吗? 谢谢您的帮助!
1楼
TaggedDocument()
的第二个参数tags
,应该是tags
列表, 而不是单个字符串。
通过提供简单字符串(如'109'
单个字符串,这将被解释为标签列表['1', '0', '9']
-因此,在您的整个主体中,只有10个唯一标签,数字0-9,将会遇到/训练。
使其成为一个单标签列表,例如[str(index)]
,您将获得更像您期望的结果。
关于您的附带问题, Word2Vec
和Doc2Vec
都Word2Vec
于训练数据中包含数百万个单词的大型语料库。
对于这些算法而言,仅2,000个文档*每个最多50个单词,最多提供100,000个训练单词。
通过使用更小的size
模型和更多的训练iter
,您也许可以得出一些轻微的结果,但这并不是这些算法可以很好地解决的数据集/问题。
另外,您的培训代码完全错误。
如果您为
Doc2Vec
初始化提供documents
,它将进行所有需要的词汇发现,并且iter
训练会自动通过-不再调用train()
。而且,由于某种原因,如果您在初始化时未提供
documents
,则通常应该分别对build_vocab()
和train()
分别调用一次。几乎没有人应该在一个显式循环中多次更改
min_alpha
或调用train()
:您几乎肯定会做错事,例如,在这里,您将在100个循环中将有效alpha
从0.025减少0.002,缠绕的负学习率为-0.175。 别这样,如果您从看似可信的在线资源中复制了这种方法,请让该资源知道他们的代码很混乱。