web-dev-qa-db-ja.com

Python)でDOTファイルを解析する方法

トランスデューサーをDOTファイルの形式で保存しています。 gveditを使用してグラフのグラフィック表現を見ることができますが、DOTファイルを実行可能なトランスデューサーに変換して、トランスデューサーをテストし、受け入れる文字列と受け入れない文字列を確認できるようにするにはどうすればよいですか。

Openfst、Graphviz、およびそれらのPython拡張子で見たほとんどのツールでは、DOTファイルはグラフィカル表現を作成するためにのみ使用されますが、ファイルを解析して取得したい場合はどうなりますか?トランスデューサーに対して文字列をテストできるインタラクティブプログラム?

タスクを実行するライブラリはありますか、それとも最初から作成する必要がありますか?

私が言ったように、DOTファイルは私が設計した英語の形態をシミュレートするトランスデューサーに関連しています。これは巨大なファイルですが、それがどのようなものかを理解するために、サンプルを提供します。名詞と複数の観点から英語の振る舞いをモデル化するトランスデューサーを作成したいとしましょう。私のレキシコンはたった3つの単語(本、男の子、女の子)で構成されています。この場合の私のトランスデューサーは次のようになります。

enter image description here

これはこのDOTファイルから直接構築されます:

digraph A {
rankdir = LR;
node [shape=circle,style=filled] 0
node [shape=circle,style=filled] 1
node [shape=circle,style=filled] 2
node [shape=circle,style=filled] 3
node [shape=circle,style=filled] 4
node [shape=circle,style=filled] 5
node [shape=circle,style=filled] 6
node [shape=circle,style=filled] 7
node [shape=circle,style=filled] 8
node [shape=circle,style=filled] 9
node [shape=doublecircle,style=filled] 10
0 -> 4 [label="g "];
0 -> 1 [label="b "];
1 -> 2 [label="o "];
2 -> 7 [label="y "];
2 -> 3 [label="o "];
3 -> 7 [label="k "];
4 -> 5 [label="i "];
5 -> 6 [label="r "];
6 -> 7 [label="l "];
7 -> 9 [label="<+N:s> "];
7 -> 8 [label="<+N:0> "];
8 -> 10 [label="<+Sg:0> "];
9 -> 10 [label="<+Pl:0> "];
}

このトランスデューサーを単語に対してテストすると、book+Plでフィードすると、booksを吐き戻す必要があります。その逆も同様です。ドットファイルをそのような分析とテストを可能にする形式に変換することがどのように可能であるかを知りたいです。

8
Morteza R

https://code.google.com/p/pydot/ を使用してファイルをロードすることから始めることができます。そこから、入力文字列に従ってメモリ内グラフをトラバースするコードを書くのは比較的簡単なはずです。

3
John Zwinck

まず、 graphviz ライブラリをインストールしました。次に、次のコードを記述しました。

import os
from graphviz import Source
file = open('graph4.dot', 'r')#READING DOT FILE
text=file.read()
Source(text)
0
Geovanny

上記のサンプルではまだ試していませんが、 NetworkX には read_dot ファイルを優れた能力を備えたグラフオブジェクトに変換し、グラフを分析およびテストすることで、これを解決するための優れた方法であった可能性のある関数。

0
Alnilam

これを使用して、Pythonで.dotファイルをロードします。

graph = pydot.graph_from_dot_file(apath)

# SHOW as an image
import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
graph.write(fout.name,format="png")
Image.open(fout.name).show()
0
jeff wang

ギヨームの答えは、Spyder(3.3.2)でグラフをレンダリングするのに十分であり、これは一部の人々の問題を解決する可能性があります。

OPが必要とするように、本当にグラフを操作する必要がある場合は、少し複雑になります。問題の一部は、グラフを分析しようとしているときに、Graphvizがグラフレンダリングライブラリであるということです。あなたがやろうとしていることは、PDFファイルからWordまたはLateXドキュメントをリバースエンジニアリングすることに似ています。

OPの例のNice構造を想定できる場合は、正規表現が機能します。私が好きな格言は、正規表現で問題を解決すると、2つの問題が発生するということです。それにもかかわらず、それはこれらの場合に行う最も実用的なことかもしれません。

キャプチャする式は次のとおりです。

  • ノード情報:r"node.*?=(\w+).*?\s(\d+)"。キャプチャグループは、種類とノードラベルです。
  • エッジ情報:r"(\d+).*?(\d+).*?\"(.+?)\s"。キャプチャグループは、ソース、シンク、およびエッジラベルです。

それらを簡単に試すには、 https://regex101.com/r/3UKKwV/1/ および https://regex101.com/r/Hgctkp/2/ を参照してください。

0
Leo