【问题标题】:Memory efficient LDA training using gensim library使用 gensim 库进行内存高效 LDA 训练
【发布时间】:2016-06-07 03:46:20
【问题描述】:

今天我刚刚开始编写一个脚本,该脚本使用 gensim 库在大型语料库(最少 30M 句)上训练 LDA 模型。 这是我正在使用的当前代码:

from gensim import corpora, models, similarities, matutils

def train_model(fname):
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    dictionary = corpora.Dictionary(line.lower().split() for line in open(fname))
    print "DOC2BOW"
    corpus = [dictionary.doc2bow(line.lower().split()) for line in open(fname)]

    print "running LDA"
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=100, update_every=1, chunksize=10000, asses=1)

在一个小型语料库(200 万个句子)上运行这个脚本,我意识到它需要大约 7GB 的 RAM。 当我尝试在更大的语料库上运行它时,由于内存问题,它失败了。 问题显然是由于我使用以下命令加载语料库:

corpus = [dictionary.doc2bow(line.lower().split()) for line in open(fname)]

但是,我认为没有其他方法,因为我需要它来调用 LdaModel() 方法:

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=100, update_every=1, chunksize=10000, asses=1)

我搜索了解决此问题的方法,但找不到任何有用的信息。 我想这应该是一个常见问题,因为我们主要在非常大的语料库(通常是维基百科文档)上训练模型。所以,它应该已经是一个解决方案了。

对这个问题有什么想法和解决方案吗?

【问题讨论】:

    标签: python nlp gensim lda topic-modeling


    【解决方案1】:

    考虑将您的 corpus 包装为可迭代对象并传递它而不是列表(生成器将不起作用)。

    来自the tutorial

    class MyCorpus(object):
        def __iter__(self):
           for line in open(fname):
                # assume there's one document per line, tokens separated by whitespace
                yield dictionary.doc2bow(line.lower().split())
    
    corpus = MyCorpus()
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, 
                                          id2word=dictionary,
                                          num_topics=100,
                                          update_every=1,
                                          chunksize=10000,
                                          passes=1)
    

    此外,Gensim 还提供多种不同的语料库格式,可在API reference 中找到。你可以考虑使用TextCorpus,它应该已经很适合你的格式了:

    corpus = gensim.corpora.TextCorpus(fname)
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, 
                                          id2word=corpus.dictionary, # TextCorpus can build the dictionary for you
                                          num_topics=100,
                                          update_every=1,
                                          chunksize=10000,
                                          passes=1)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多