【问题标题】:gensim/docs/notebooks/doc2vec-lee.ipynb results are not repeatablegensim/docs/notebooks/doc2vec-lee.ipynb 结果不可重复
【发布时间】:2017-01-12 21:55:53
【问题描述】:

根据这个 github 教程:gensim/docs/notebooks/doc2vec-lee.ipynb 我应该得到大约 96% 的准确率。

这是在 jupyter 4.3.1 笔记本上使用 gensim 0.13.4 的代码,全部来自 Anaconda Navigator。

import gensim
import os
import collections
import smart_open
import random


# Set file names for train data
test_data_dir='{}'.format(os.sep).join \
([gensim.__path__[0],'test','test_data'])
lee_train_file = test_data_dir + os.sep + 'lee_background.cor'

def read_corpus(fname, tokens_only=False):
    with smart_open.smart_open(fname, encoding="iso-8859-1") as f:
        for i, line in enumerate(f):
            if tokens_only:
                yield gensim.utils.simple_preprocess(line)
            else:
                # For training data, add tags
                yield gensim.models.doc2vec.TaggedDocument \
                      (gensim.utils.simple_preprocess(line), [i])
train_corpus = list(read_corpus(lee_train_file))
model = gensim.models.doc2vec.Doc2Vec(size=50, min_count=2, iter=10)
model.build_vocab(train_corpus)
model.train(train_corpus)

ranks = []
second_ranks = []
for doc_id in range(len(train_corpus)):
    inferred_vector = model.infer_vector(train_corpus[doc_id].words)
    sims = model.docvecs.most_similar([inferred_vector] \
           , topn=len(model.docvecs))
    rank = [docid for docid, sim in sims].index(doc_id)
    ranks.append(rank)
    second_ranks.append(sims[1])
collections.Counter(ranks)

在模型评估教程中:

他们的输出是:

Counter({0: 292, 1: 8})  

我来了

Counter({0: 31,
     1: 24,
     2: 16,
     3: 19,
     4: 16,
     5: 8,
     6: 8,
     7: 10,
     8: 7,
     9: 10,
     10: 12,
     11: 12,
     12: 5,
     13: 9,
      ...

为什么我没有得到接近他们准确度的任何东西?

【问题讨论】:

  • 欢迎来到 SO!您的问题缺乏基本格式,不清楚您在问什么。尝试编辑问题并展示您为解决问题所采取的步骤。此外,除非完全必要,否则避免引用外部链接。请阅读:stackoverflow.com/help/how-to-ask

标签: python doc2vec


【解决方案1】:

感谢您发现它。由于随机初始化和不同的 OS 数值库,在如此小的语料库上,准确性和类似文档差异很大。我删除了教程中对准确性的引用。

一个人需要大量的语料库和数十小时的训练才能获得可重复的 doc2vec 结果。

Gensim 邮件列表中还有 answered

【讨论】:

    【解决方案2】:

    我很欣赏上面@Lev Konst 的回应。正如他还提到的,这在 Gensim 邮件列表中得到了答复。

    model = gensim.models.doc2vec.Doc2Vec(size=55, min_count=2, iter=60, hs=1, negative=0) 产生:

    Wall time: 12.5 s
    Counter({0: 292, 1: 8})
    Wall time: 12 s
    Counter({0: 291, 1: 9})
    Wall time: 16.4 s
    Counter({0: 290, 1: 10})
    Wall time: 20.6 s
    Counter({0: 295, 1: 5})
    Wall time: 21.3 s
    Counter({0: 292, 1: 8})
    Wall time: 20.6 s
    Counter({0: 292, 1: 8})
    Wall time: 16.7 s
    Counter({0: 296, 1: 4})
    Wall time: 15.4 s
    Counter({0: 292, 1: 8})
    Wall time: 15.3 s
    Counter({0: 295, 1: 5})
    Wall time: 14.8 s
    Counter({0: 292, 1: 8})
    

    似乎增加迭代次数和/或添加 hs=1,negative =0 将产生更接近笔记本的结果。

    虽然平均而言,hs=1,negative=0 似乎产生了更好的结果。 如果只是增加迭代次数,那么在某些运行中会有一些等级不是 0 或 1。

    但是可以看到,hs=1,负=0,排名都在前两个排名之内。

    但是,我在 gensim google 群组列表中获悉,这种规模的数据集低于最佳准确度,预计会有更多变化。

    googlegroups discussion

    谢谢约翰

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2017-02-12
      • 2018-07-21
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多