0

素敵な二分木図を作成するための解決策を必死に探しています。不完全なノードに識別可能なエッジがあることが重要です (存在する場合)。

ノードを順序付ける方法がわからないため、.dot で目的の結果を生成できませんでした。ファイルを yEd または別のエディターにインポートすることは気にしません。ただし、ほとんどの構文で非常に簡単にデータを生成できるようにしたいと考えています。

私が目指しているのは、たとえば (A (B1 C1 C2) B2) などの最小限のデータから .graphml 形式を生成するツールです。ここで、A はルート ラベル、B1 はルートの左の子で、別の 2 つの子があります。.dot や .tgf と同様の複雑さはもちろん許容できますが、.graphml を生成するために自分でコンパイラを作成することは避けたいと考えています。

どんなアイデアでも大歓迎です。

マーカス R.

4

1 に答える 1

1

提供したデータは多かれ少なかれs式です。これが取り込みたい形式であるとすると、pyparsing(Pythonモジュール)にはs-expressionパーサーがあります。

グラフライブラリも必要です。私はほとんどの仕事にnetworkxを使用しています。pyparsing s-expressionパーサーとnetworkxを使用すると、次のコードがデータを取り込み、有向グラフとしてツリーを作成します。

import networkx as nx

def build(g, X):
    if isinstance(X, list):
        parent = X[0]
        g.add_node(parent)
        for branch in X[1:]:
            child = build(g, branch)
            g.add_edge(parent, child)

        return parent

    if isinstance(X, basestring):
        g.add_node(X)
        return X

#-- The sexp parser is constructed by the code example at...
#-- http://http://pyparsing.wikispaces.com/file/view/sexpParser.py
sexpr = sexp.parseString("(A (B1 C1 C2) B2)", parseAll = True)

#-- Get the parsing results as a list of component lists.
nested = sexpr.asList( )

#-- Construct an empty digraph.
dig = nx.DiGraph( )

#-- build the tree
for component in nested:
    build(dig, component)

#-- Write out the tree as a graphml file.
nx.write_graphml(dig, 'tree.graphml', prettyprint = True)

これをテストするために、ツリーを.dotファイルとして記述し、graphvizを使用して次のイメージを作成しました。

(ツリーのgraphviz出力)

networkxは優れたグラフライブラリであり、必要に応じて、ツリー上を移動してエッジまたはノードに追加のメタデータをタグ付けする追加のコードを記述できます。

于 2012-05-09T18:44:08.040 に答える