我想概括一下我在Github上的Gist中发现的TextRank算法的图形实现。将滑动窗口与Python中的成对枚举相结合
基本上它是一个图形问题,您需要在大小为n的滑动窗口中的所有节点对之间创建边。因此,举例来说,如果我有节点
nodes=[0,1,2,3,4,5,6]
和窗口大小的列表为n = 3,我想列举一组边的
edges=[(0,1), (0,2), (1,2), (1,3), (2,3), (2,4), (3,4), (3,5), ..., (5,6)]
我已经看了一些关于滑动窗口的问题(例如,#6998245和#6822725)和枚举对(例如,#1257413和#13014595),但不幸的是,我没有足够的Python和迭代器经验来将它们组合成单个函数。
我想出了解决的办法是这样的:
from itertools import islice, combinations, chain
def window(seq, n=2):
"Returns a sliding window (of width n) over data from the iterable"
" s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
nodes = [0,1,2,3,4,5,6]
windowed = window(nodes,3)
intermediate_list = [combinations(item,2) for item in windowed]
edges = list(set(chain.from_iterable(intermediate_list)))
edges = sorted(edges)
print edges
这给了我,我想,排序不是真的是必要的结果,但有这样做的更优雅的“Python化”的方式?
感谢您的评论,我会根据您的建议将其切换到生成器。我想我的担心是中间步骤生成重复,然后使用列表(set(..))删除重复。我已经看到它在很多地方建议,为了删除列表中的重复项,您可以简单地切换到设置,然后返回列表,但不知何故,这让我有点不安。在其他语言中,您可以轻松地在类型之间来回切换。 – nsecord
那么,从序列切换到类似集合或字典的东西时,项目顺序会丢失 - 因此会有一些信息丢失,但这似乎并不是一个问题。还有其他方法可以删除重复项 - 我相信这是在该步骤中使用集合的目的 - 但如果排序不是问题,则使用集合是最好的方法之一。 – martineau