GithubのこのGistで見つけたものに従って、TextRankアルゴリズムのグラフ実装を一般化しようとしています。
基本的には、サイズ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とイテレーターについて十分な経験がありません。それらを1つの関数に結合します。
私が思いついた解決策はこれです:
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
これにより、私が望む結果が得られます。並べ替えは実際には必要ありませんが、よりエレガントな「pythonic」の方法はありますか?