IndexError при попытке обновить LdaModel от gensim - PullRequest
0 голосов
/ 07 мая 2018

Я сталкиваюсь со следующей ошибкой при попытке обновить LdaModel моего gensim:

IndexError: индекс 6614 выходит за границы оси 1 с размером 6614

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

Поскольку у меня большой набор данных, я загружаю его порциями за порцию (используя pickle.load). Я строю словарь таким образом, итеративно, благодаря этому коду:

1015 *

 fr_documents_lda = open("documents_lda_40_rails_30_ruby_full.dat", 'rb')
 dictionary = Dictionary()
 chunk_no = 0
 while 1:
     try:
         t0 = time()
         documents_lda = pickle.load(fr_documents_lda)
         chunk_no += 1
         dictionary.add_documents(documents_lda)
         t1 = time()
         print("Chunk number {0} took {1:.2f}s".format(chunk_no, t1-t0))
     except EOFError:
         print("Finished going through pickle")
         break

После построения для всего набора данных, я тренирую модель таким же образом, итеративно, таким образом:

fr_documents_lda = open("documents_lda_40_rails_30_ruby_full.dat", 'rb')
first_iter = True
chunk_no = 0
lda_gensim = None
while 1:
    try:
        t0 = time()
        documents_lda = pickle.load(fr_documents_lda) 
        chunk_no += 1
        corpus = [dictionary.doc2bow(text) for text in documents_lda]
        if first_iter:
            first_iter = False
            lda_gensim = LdaModel(corpus, num_topics=no_topics, iterations=100, offset=50., random_state=0, alpha='auto')
        else:
            lda_gensim.update(corpus)
        t1 = time()
        print("Chunk number {0} took {1:.2f}s".format(chunk_no, t1-t0))
    except EOFError:
        print("Finished going through pickle")
        break

Я также пытался обновлять словарь в каждом чанке, т.е.

dictionary.add_documents(documents_lda)

прямо перед

corpus = [dictionary.doc2bow(text) for text in documents_lda]

в последнем куске кода. Наконец, я попытался установить для аргумента allow_update параметра doc2bow значение True. Ничего не работает.

К вашему сведению, размер моего окончательного словаря составляет 85 КБ. Размер моего словаря, построенного только из первого блока, составляет 10 КБ. Ошибка возникает на второй итерации, когда она переходит в условие else, при вызове метода update.

Ошибка выводится строкой expElogbetad = self.expElogbeta[:, ids] , называемый gamma, sstats = self.inference(chunk, collect_sstats=True), сам называемый gammat = self.do_estep(chunk, other), сам называемый lda_gensim.update(corpus).

У кого-нибудь есть идеи, как это исправить или что происходит?

Заранее спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Решение состоит в том, чтобы просто инициализировать LdaModel с аргументом id2word = dictionary.

Если вы этого не сделаете, это предполагает, что ваш словарный запас равен размеру словарного запаса первого набора документов, на котором вы его обучаете, и не может его обновить. Фактически он устанавливает значение num_terms равным длине id2word один раз там и никогда не обновляет его впоследствии (вы можете проверить это в функции update ).

...