2016-02-24 6 views
0

Сегодня я только начал писать сценарий, который готовит модели LDA на больших корпусах (минимум 30M предложений) с использованием библиотеки gensim. Вот текущий код, который я использую:Память эффективного обучения LDA с использованием библиотеки gensim

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) 

работает этот скрипт на небольшой корпусе (2Е предложения), я понял, что нужно около 7GB оперативной памяти. И когда я пытаюсь запустить его на больших корпусах, он терпит неудачу из-за проблемы с памятью. Проблема, очевидно, связано с тем, что я загружающего корпус, используя следующую команду:

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) 

Я искал решение этой проблемы, но не нашел ничего полезного. Я бы предположил, что это должна быть общая проблема, поскольку мы в основном обучаем модели на очень больших корпусах (обычно в документах по википедии). Таким образом, это должно быть уже решение для этого.

Любые идеи по этой проблеме и ее решение?

ответ

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 имеет несколько форматов отличается Corpus легкодоступных, которые могут быть найдены в 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) 
Смежные вопросы