我有一个生成器(一个产生东西的函数),但是当试图将它传递给gensim.Word2Vec
我时,我得到以下错误:
TypeError:您不能将生成器作为句子参数传递.尝试一个迭代器.
发生器不是一种迭代器吗?如果没有,我如何从中制作迭代器?
看一下库代码,它似乎只是简单地迭代句子for x in enumerate(sentences)
,这对我的生成器来说效果很好.那么是什么导致错误?
发电机经过一次回路后耗尽.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
打印您的收藏两次
正如前面提到的海报一样,生成器与迭代器的行为类似,但有两个显着的区别:生成器耗尽,而你不能索引一个.
我在这个页面上快速查阅了文档 - 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]