【发布时间】:2021-08-13 23:34:53
【问题描述】:
我正在使用两个不同的 for 循环迭代两个不同的生成器。但我可以看到,通过一个生成器表达式的迭代正在影响另一个生成器表达式的迭代顺序。
虽然我理解并希望这是不可能的,但不确定我为什么会遇到这种奇怪的行为。
we=KeyedVectors.load_word2vec_format('../input/nlpword2vecembeddingspretrained/GoogleNews-vectors-negative300.bin', binary='True')
data1=(['this','is','an','example','text1'],['this','is','an','example','text2'],....)
data2=(['test data1','test data2'],['test data3','test data4'],....)
txt_emb=(sum([we[token] for token in doc if token in we.key_to_index])/len(doc) for doc in data1)
phr_emb=([sum([we[token] for token in phrase.split(' ') if token in we.key_to_index])/len(phrase.split(' ')) for phrase in phrases]for phrases in data2)
for i in txt_emb:
print(i)
break
for j in phr_emb:
print(j)
break
txt_emb:
([-0.06002714 0.00999211 0.0358354 ....],..........[0.07940271 -0.02072765 -0.03981323...])
phr_emb:
([数组([-0.13269043,0.03266907,...]),数组([0.04994202,0.15716553,...])],
[数组([-0.06970215,0.01029968,...]),数组([0.02503967,0.13970947,...])],.......)
这里的 txt_emb 是一个生成器表达式,每个迭代都是一个列表。
phr_emb 是一个生成器表达式,每个迭代都是一个列表,每个列表包含不同数量的数组(比如 2-6 个)。
当我在上面的代码中首先迭代 txt_emb 时,我得到了 txt_emb 的第一个元素(索引 0 处的列表),这是预期的。同样,当我遍历 phr_emb 时,我希望得到第一个元素(索引 0 处的列表),但我得到了第二个元素(索引 1 处的列表)。
同样,如果我再次继续迭代 txt_emb,我会得到第三个元素(索引 2 处的列表),而不是获取 txt_emb 的索引 1 处的元素,因为在此之前我只迭代了 txt_emb 一次。
当我压缩两个生成器表达式 txt_emb 和 phr_emb 并尝试遍历它时,我遇到了类似的问题。
我在 kaggle 笔记本中运行所有这些。但是如果我在笔记本的不同单元格中分别迭代两个生成器表达式,那么我会按预期顺序获得元素。
【问题讨论】:
-
据我所知,您的代码中没有任何生成器。请提供minimal reproducible example
-
您的问题的答案完全取决于被迭代的生成器。您的两次迭代之间本质上不会有任何联系,但生成器的实现可能会以某种方式进行交互。
-
@Blckknght 我不确定这里使用“发电机”这个词的含义。
-
如果您的
data1和data2序列确实像您在此处显示的那样是静态值,那么您基于它们生成的生成器表达式似乎不太可能根据您运行循环的顺序而有所不同。也许在we中查找内容有时会产生某种副作用?我们无法真正猜测,但我想可能有人对您正在使用的 NLP 库有经验。 -
您的
dataX变量本身是否都是生成器表达式?因为如果他们都在同一个迭代器(例如文件)上绘图,这可以解释您的问题。
标签: python nlp iterator generator