尝试更新gensim的LdaModel时的IndexError

时间:2018-05-07 13:02:05

标签: python-3.x gensim lda topic-modeling index-error

我在尝试更新gensim LdaModel时遇到以下错误:

  

IndexError:索引6614超出了轴1的大小为6614

的界限

我检查了为什么其他人在this thread上遇到此问题,但我从头到尾使用相同的字典,这是他们的错误。

由于我有一个大数据集,我按块(使用pickle.load)加载它。我正在迭代地以这种方式构建字典,这要归功于这段代码:

 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]

在最后一段代码中。最后,我尝试将doc2bow的allow_update参数设置为True。什么都行不通。

仅供参考,我最后一本字典的大小是85k。仅从第一个块构建的字典大小为10k。当调用update方法时,在传入else条件时,第二次迭代会发生错误。

expElogbetad = self.expElogbeta[:, ids]引发错误 ,由gamma, sstats = self.inference(chunk, collect_sstats=True)调用,由gammat = self.do_estep(chunk, other)调用,由lda_gensim.update(corpus)调用。

是否有人知道如何解决这个问题,或者发生了什么?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

解决方案只是使用参数id2word = dictionary初始化LdaModel。

如果您不这样做,它会假定您的词汇量大小是您训练它的第一组文档的词汇量大小,并且无法更新它。实际上,它会将num_terms值设置为id {2}的长度there,之后永远不会更新(您可以在update函数中进行验证)。