首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IndexError在更新gensim的LdaModel时

IndexError在更新gensim的LdaModel时
EN

Stack Overflow用户
提问于 2018-05-07 13:02:05
回答 1查看 1.2K关注 0票数 3

在更新gensim的LdaModel时,我面临以下错误:

IndexError:对于尺寸为6614的轴1,索引6614超出了界限。

我检查了为什么其他人在这条线上有这个问题,但我从一开始到最后都使用同一本字典,这是他们的错误。

因为我有一个很大的数据集,所以我正在逐块地加载它(使用pickle.load)。我正在以这种方式构建字典,迭代地,多亏了这段代码:

代码语言:javascript
复制
 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

一旦为整个数据集构建,我将以同样的方式对模型进行训练,迭代的方式如下:

代码语言:javascript
复制
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

我还试着在每个块上更新字典,也就是对每个块进行更新。

代码语言:javascript
复制
dictionary.add_documents(documents_lda)

就在此之前

代码语言:javascript
复制
corpus = [dictionary.doc2bow(text) for text in documents_lda]

在最后一段代码中。最后,我尝试将allow_update参数doc2bow设置为True。毫无办法。

FYI,我最后一本字典的大小是85k。我的字典仅由第一大块建成,大小为10k。该错误发生在第二次迭代中,当它在其他条件下传递时,当调用update方法时。

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

有没有人知道如何解决这个问题,或者正在发生什么?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-16 15:17:27

解决方案是简单地使用参数LdaModel初始化id2word = dictionary

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50214899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档