当前位置: 代码迷 >> python >> Gensim Doc2Vec Most_Similar
  详细解决方案

Gensim Doc2Vec Most_Similar

热度:170   发布时间:2023-07-16 11:26:56.0

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

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

通过提供简单字符串(如'109'单个字符串,这将被解释为标签列表['1', '0', '9'] -因此,在您的整个主体中,只有10个唯一标签,数字0-9,将会遇到/训练。

使其成为一个单标签列表,例如[str(index)] ,您将获得更像您期望的结果。

关于您的附带问题, Word2VecDoc2VecWord2Vec于训练数据中包含数百万个单词的大型语料库。 对于这些算法而言,仅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。 别这样,如果您从看似可信的在线资源中复制了这种方法,请让该资源知道他们的代码很混乱。