如何在Python中解析DOT文件

时间:2015-02-04 05:08:18

标签: python parsing dot morphological-analysis transducer

我有一个以DOT文件形式保存的传感器。我可以使用gvedit看到图形的图形表示,但是如果我想将DOT文件转换为可执行的传感器,那么我可以测试传感器并查看它接受的字符串以及它不具备的功能。

在我在Openfst,Graphviz及其Python扩展中看到的大多数工具中,DOT文件仅用于创建图形表示,但如果我想解析文件以获得可以测试的交互式程序,该怎么办?针对传感器的琴弦?

是否有任何库可以完成任务,或者我应该从头开始编写它?

正如我所说,DOT文件与我设计的模拟英语形态的换能器有关。这是一个巨大的文件,但只是为了让您了解它是什么样的,我提供了一个示例。让我们说我想要创建一个能够模拟英语关于名词和多个方面的行为的换能器。我的词典只包含三个单词(书,男孩,女孩)。在这种情况下,我的传感器看起来像这样:

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,反之亦然。我想看看如何将点文件转换为允许进行此类分析和测试的格式。

6 个答案:

答案 0 :(得分:3)

您可以先使用https://code.google.com/p/pydot/加载文件。从那里开始,应该相对简单地编写代码以根据输入字符串遍历内存中的图形。

答案 1 :(得分:0)

首先,我安装了graphviz库。然后我写了下面的代码:

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

答案 2 :(得分:0)

纪尧姆的答案足以在Spyder(3.3.2)中绘制图形,这可能会解决一些人的问题。

如果您确实需要按照OP的要求来操作图形,则它会有些复杂。问题的一部分是Graphviz是一个图 rendering 库,而您正在尝试分析图。您要执行的操作类似于从PDF文件对Word或LateX文档进行反向工程。

如果可以假设OP示例的结构很好,则正则表达式可以正常工作。我喜欢的一种格言是,如果您使用正则表达式解决问题,那么现在有两个问题。但是,对于这些情况,这可能是最实际的事情。

以下是要捕获的表达式:

  • 您的节点信息:r"node.*?=(\w+).*?\s(\d+)"。捕获组是种类和节点标签。
  • 您的优势信息:r"(\d+).*?(\d+).*?\"(.+?)\s"。捕获组是源,接收器和边缘标签。

要轻松尝试它们,请参见https://regex101.com/r/3UKKwV/1/https://regex101.com/r/Hgctkp/2/

答案 3 :(得分:0)

使用它在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()

答案 4 :(得分:0)

我还没有在上面的示例中尝试过,但是NetworkX具有read_dot函数,通过将文件转换为具有良好功能的图形对象,可能是解决此问题的好方法然后分析和测试图形。

答案 5 :(得分:0)

另一种路径,以及在dot文件中查找循环的简单方法:

import pygraphviz as pgv
import networkx as nx

gv = pgv.AGraph('my.dot', strict=False, directed=True)
G = nx.DiGraph(gv)

cycles = nx.simple_cycles(G)
for cycle in cycles:
    print(cycle)