Wie analysiert eine DOT-Datei in Python
Habe ich einen Wandler gespeichert in form einer DOT-Datei. Ich sehe eine grafische Darstellung der Graphen mit gvedit, aber was ist, wenn ich konvertieren wollen die DOT-Datei in eine ausführbare Wandler, so dass ich testen kann der Wandler und sehen, welche Saiten er akzeptiert und was nicht.
In den meisten der tools, die ich gesehen habe, in Openfst, Graphviz, und Ihre Python-Erweiterungen, die DOT-Dateien werden nur verwendet, um eine grafische Darstellung, aber was ist, wenn ich will Parsen der Datei um ein interaktives Programm wo ich testen kann die Saiten gegen den Schwinger?
Gibt es Bibliotheken gibt, die tun würde, die Aufgabe, oder soll ich einfach schreiben das es von Grund auf neu?
Wie gesagt, die DOT-Datei ist im Zusammenhang mit einem Wandler habe ich entworfen, simuliert Morphologie der englischen Sprache. Es ist eine riesige Datei, aber nur, um Ihnen eine Vorstellung davon, wie es ist, wie ich eine Probe geben. Lassen Sie uns sagen, ich will einen Wandler würde, dass das Modell das Verhalten des englischen mit Bezug auf Substantive und im Sinne der Pluralität. Mein Lexikon besteht nur aus drei Worten (Buch, junge, Mädchen). Mein Wandler wäre in diesem Fall wie folgt Aussehen:
direkt konstruiert aus dieser DOT-Datei:
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> "];
}
Jetzt testen dieser Wandler gegen die Worte, die bedeutet, dass, wenn Sie füttern es mit book+Pl
sollte es wieder spucken books
- und Umgekehrt. Ich würde gerne sehen, wie es möglich ist, drehen Sie die dot-Datei in ein format, die es erlauben würde eine solche Analyse und Prüfung.
Eine DOT-Datei repräsentiert einen Graphen, welcher aus Knoten und Kanten. Ich denke, dass Knoten input-oder output-Punkt, und die Kante zwischen zwei Knoten repräsentiert den Transport. Wenn Sie zeigen .dot-Datei, können Sie bekommen nützlicher Kommentar und/oder Antwort.
Ich habe gerade aktualisiert und Hinzugefügt, ein Beispiel.
InformationsquelleAutor Morteza R | 2015-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie können beginnen, durch das laden der Datei mit https://code.google.com/p/pydot/ . Von dort aus sollte es relativ einfach, den code zu schreiben, um die traverse in-memory-Grafik nach Eingabe eines Strings.
dot_parser
im pydot wandelt die dot-Datei in eine interne Klasse Darstellung. Aber ich bin nicht sicher, wie kann ich das nutzen. Pydot ist im Grunde eine Schnittstelle zur Graphviz, soweit ich weiß.siehe hier: stackoverflow.com/a/22935664/4323 - Sie können laden Sie die Kanten. Wenn Sie wollen, dass eine full-featured-graph library, siehe code.google.com/p/python-graph die kann auch load Dot-Dateien, und hat algorithmen enthalten.
Ich bin nicht in der Lage zu verwenden (die aktuelle version) von pydot; er sagt, es erfordert pyparsing. Ich habe die neueste version von pyparsing, aber pydot versucht zu importieren etwas von pyparsing, der nicht existiert. Grr >:(
InformationsquelleAutor John Zwinck
Zunächst alle, ich habe installiert die graphviz Bibliothek. Dann schrieb ich den folgenden code:
Du hast Recht, es ist nicht Parsen der Datei in eine brauchbare Struktur wie der OP fragte. Jedoch, es ist genug, um das Rendern der Grafik (Spyder), die mein problem gelöst!
InformationsquelleAutor Geovanny
Guillaume Antwort ist ausreichend, um das Rendern der Grafik im Spyder (3.3.2), die möglicherweise lösen einige Leute Probleme.
Wenn Sie wirklich brauchen, zu manipulieren, die Grafik, die OP muss, wird es ein bisschen komplexer. Teil des Problems ist, dass Graphviz ist ein graph, der rendering Bibliothek, während Sie versuchen, zu analysieren das Diagramm. Was Sie versuchen zu tun, ist ähnlich wie das reverse engineering eine Word-oder LateX-Dokuments aus einer PDF-Datei.
Wenn man davon ausgehen kann die schöne Struktur des OP ' s Beispiel, dann reguläre Ausdrücke funktionieren. Ein Aphorismus den ich mag, ist, dass, wenn Sie ein problem lösen, mit regulären Ausdrücken, jetzt haben Sie zwei Probleme. Dennoch, dass vielleicht die praktischste Sache zu tun, für solche Fälle.
Hier sind Ausdrücke zu erfassen:
r"node.*?=(\w+).*?\s(\d+)"
. Die capture-Gruppen sind die Art und die Knoten-label.r"(\d+).*?(\d+).*?\"(.+?)\s"
. Die capture-Gruppen-source -, sink-und edge-label.Ausprobieren leicht sehen, https://regex101.com/r/3UKKwV/1/ und https://regex101.com/r/Hgctkp/2/.
InformationsquelleAutor Leo