【问题标题】:How to deal with large amount of sentences with gensim word2vec?如何使用 gensim word2vec 处理大量句子?
【发布时间】:2021-01-10 10:35:10
【问题描述】:

我有大量的句子,问题是我无法一次将它们全部加载到内存中,特别是当我对句子进行标记并将它们拆分为单词列表时,我的 RAM 很快就满了。

但我找不到任何关于如何批量训练 gensim word2vec 的示例,这意味着在每个时期我想我必须以某种方式从磁盘加载批量数据,将它们标记化并将其提供给模型然后卸载它并加载下一批。

当我没有足够的内存来加载所有句子(甚至没有 20%)时,我该如何克服这个问题并训练一个 word2vec 模型。

我的句子基本上都在一个文本文件中,每一行代表一个句子。

【问题讨论】:

    标签: nlp gensim word2vec


    【解决方案1】:

    您可以按照docs 中的建议定义自己的语料库,在这种情况下,语料库的大小基本上无关紧要:

    from gensim.test.utils import datapath
    from gensim import utils
    
    class MyCorpus(object):
        """An interator that yields sentences (lists of str)."""
    
        def __iter__(self):
            corpus_path = datapath('lee_background.cor')
            for line in open(corpus_path):
                # assume there's one document per line, tokens separated by whitespace
                yield utils.simple_preprocess(line)
    

    然后按如下方式训练它:

    import gensim.models
    
    sentences = MyCorpus()
    model = gensim.models.Word2Vec(sentences=sentences)
    

    【讨论】:

    • 请注意,如果文本已经被分成每行一个文本,并且已经用空格分隔,您可以重用 LineSentence 类 (radimrehurek.com/gensim/models/…) 从磁盘进行流式传输. (您不需要编写自己的可迭代语料库类,如果您可能已经完成了比 simple_preprocess() 更好的标记化。)
    • @gojomo 当我在 Word2Vec api 调用后使用 build_vocab 时出现错误:runtimeError: 在模型权重已经初始化后无法对词汇表进行排序。目前在构建 Word2vec 模型之后,我正在使用 build_vocab(sentences) 然后训练(sentences , ...),我应该如何改变这个?
    • 听起来您可能在创建模型时提供了训练语料库。如果你这样做,它已经为你完成了.build_vocab().train() 步骤——所以如果你再试一次,你会得到一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2014-04-03
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多