当前位置:  开发笔记 > 编程语言 > 正文

生成器不是迭代器?

如何解决《生成器不是迭代器?》经验,为你挑选了2个好方法。

我有一个生成器(一个产生东西的函数),但是当试图将它传递给gensim.Word2Vec我时,我得到以下错误:

TypeError:您不能将生成器作为句子参数传递.尝试一个迭代器.

发生器不是一种迭代器吗?如果没有,我如何从中制作迭代器?

看一下库代码,它似乎只是简单地迭代句子for x in enumerate(sentences),这对我的生成器来说效果很好.那么是什么导致错误?



1> lejlot..:

发电机经过一次回路后耗尽.Word2vec只需要多次穿越句子(和可能获得一个给定的指标,这是不可能的发电机,其只是一种堆在那里你可以只弹出的项目),因此需要更多的东西固体,像一个列表.

特别是在他们的代码中,他们调用两个不同的函数,都迭代句子(因此,如果你使用生成器,第二个将在空集上运行)

self.build_vocab(sentences, trim_rule=trim_rule)
self.train(sentences)

它应该与任何执行工作__iter__ 是不是GeneratorType.因此,将您的函数包装在一个可迭代的接口中,并确保您可以多次遍历它,这意味着

sentences = your_code
for s in sentences:
  print s
for s in sentences:
  print s

打印您的收藏两次


所有迭代器在一个循环后耗尽,而不仅仅是由生成器创建的循环.(事实上​​,在耗尽之后继续向后续调用`next`提升`StopIteration`是必需的.)错误消息可能意味着**可迭代**而不是**迭代器**.有些迭代可以多次循环,正如你的答案中正确解释的那样.

2> Alex Volkov..:

正如前面提到的海报一样,生成器与迭代器的行为类似,但有两个显着的区别:生成器耗尽,而你不能索引一个.

我在这个页面上快速查阅了文档 - https://radimrehurek.com/gensim/models/word2vec.html

文件说明了这一点

gensim.models.word2vec.Word2Vec(句子=无,大小= 100,α-= 0.025,窗口= 5,min_count = 5,max_vocab_size =无,样品= 0,种子= 1,工人= 1,min_alpha = 0.0001,SG = 1,hs = 1,负= 0,cbow_mean = 0,hashfxn =,iter = 1,null_word = 0,trim_rule = None,sorted_vocab = 1) ...

从可迭代的句子初始化模型.每个句子都是将用于训练的单词(unicode字符串)列表.

我冒昧地猜测函数内部的逻辑固有地需要一个或多个列表属性,例如项索引,可能有一个显式断言语句或if语句引发错误.

一个可以解决您的问题的简单黑客就是将您的生成器转换为列表理解.您的程序将维持CPU性能损失,并将增加其内存使用量,但这至少应该使代码工作.

my_iterator = [x for x in generator_obj]

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有