【问题标题】:Gensim build_vocab taking too longGensim build_vocab 耗时太长
【发布时间】:2018-04-22 05:18:53
【问题描述】:

我正在尝试使用 gensim 库在 5000 万个可变长度的句子上训练一个 doc2vec 模型。

一些教程(例如https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-lee.ipynb)在实际训练过程之前有一个model.build_vocab 步骤。这部分已经运行了 3 个小时,没有任何更新。

这个步骤对于训练过程是必要的吗?为什么这一步需要这么长时间,因为它只是对数据的线性传递?

在 python 3.6.0 中使用 gensim 3.4.0 版

【问题讨论】:

  • 试试progress_per参数

标签: python-3.x nlp word2vec gensim


【解决方案1】:

需要build_vocab() 步骤来发现所有单词,然后设置已知词汇结构。 (不过,如果您将语料库作为参数提供给 Doc2Vecbuild_vocab()train() 都将自动完成。)

您应该在 INFO 级别启用 Python 日志记录,以查看有关此进度和其他长时间运行的 gensim 步骤的记录信息。这将帮助您了解是否确实取得了进展,或者在某个时候已经停止或放缓。

如果词汇发现开始很快但随后变慢,则可能是您的系统内存太少并且开始使用非常慢的虚拟内存(交换)。如果它似乎停止了,那么您阅读语料库的方法可能存在无声错误。如果只是整个过程很慢,那么可能是您阅读语料库的方法有问题。

【讨论】:

  • 由于build_vocab 只是发现单词,并没有进行实际训练,所以我可以传递一组它需要知道的所有新单词,而不需要实际句子的上下文,对吧?跨度>
  • 我的问题是我在一个巨大的语料库上运行了build_vocab,但没有包括短语。我还没有运行train。所以我想我可以收集所有的短语并将集合输入到build_vocab。那我以后还有机会训练词组的向量。
  • build_vocab() 所做的词汇调查结果应该与每次训练过程中实际看到的单词频率相匹配。因此,修补现有计数以现在解释短语转换的行为 - 减少 unigram 计数和添加新的复合标记 - 可能与在更新的短语转换语料库上运行 build_vocab() 一样复杂。
  • 但在 Radim Řehůřek 的这个page 中,他说,build_vocab(some_sentences) 后跟train(other_sentences)。因此,如果其他句子不必经过build_vocab,那么保持单词频率的那种方法(build_vocab)就没有意义了。
  • 我不明白你的意思。 Word2Vec/Doc2Vec 模型需要准确了解要训练的数据的词频。它通过build_vocab() 获得。您应该在与train() 相同的语料库上运行build_vocab()。尝试在同一语料库的稍早(无短语)版本上重用在之前的build_vocab() 调用期间收集的数据,但是用短语化引起的变化对其进行修补,将非常复杂且容易出错,我对此表示怀疑会省很多力气。我建议将之前的运行放在一边,并在最终语料库上运行 build_vocab()fresh。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2018-02-27
  • 2013-05-28
相关资源
最近更新 更多