Gensim Doc2Vec最西米

2024-09-27 19:25:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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更好?谢谢你的帮助!在


Tags: 文档标记模型alphamostnewmodel相似性
1条回答
网友
1楼 · 发布于 2024-09-27 19:25:35

TaggedDocument()的第二个参数,tags,应该是一个标记列表,而不是一个字符串。在

通过提供单个字符串的简单整数,如'109',这被解释为标记列表['1', '0', '9']-因此在整个语料库中,只会遇到/训练10个唯一的标记,即数字0-9。在

让它成为一个单独的标记列表,比如[str(index)],您将得到更像您期望的结果。在

关于你的附带问题,Word2Vec和{}在训练数据中有数百万个单词的大粒子上效果最好。对于这些算法来说,仅仅2000个文档*每个文档最多50个单词,最多10万个训练单词,对于这些算法来说是非常小的。通过使用一个更小的size模型和更多的训练iter过程,您可能可以弥补一些轻微的结果,但这并不是这些算法能够很好地工作的数据集/问题。在

另外,你的训练代码是完全错误的。在

  • 如果您为Doc2Vec初始化提供documents,它将自动完成所有需要的词汇发现和iter训练过程–不要再调用train()

  • 如果由于某种原因在初始化时没有提供documents,那么通常应该同时调用build_vocab()和{}。

  • 几乎没有人应该在显式循环中多次更改min_alpha或多次调用train():你几乎肯定会做错,就像这里,在100个循环中,你将有效的alpha从0.025减为0.002,最终得到一个无意义的负学习率-0.175。不要这样,如果你从一个可信的在线资源中复制了这个方法,请让这个来源知道他们的代码有问题。

相关问题 更多 >

    热门问题