我有一个以DOT文件形式保存的传感器。我可以使用gvedit看到图形的图形表示,但是如果我想将DOT文件转换为可执行的传感器,那么我可以测试传感器并查看它接受的字符串以及它不接受的字符串。
在我在Openfst,Graphviz及其Python扩展中看到的大多数工具中,DOT文件仅用于创建图形表示,但如果我想解析文件以获得交互式程序,我可以测试字符串换能器?
是否有任何库可以完成任务,或者我应该从头开始编写它?
正如我所说,DOT文件与我设计的模拟英语形态的换能器有关。这是一个巨大的文件,但只是为了让您了解它是什么样的,我提供了一个示例。假设我想创建一个能够模拟英语关于名词和多个方面行为的传感器。我的词典只包含三个单词(书,男孩,女孩)。在这种情况下,我的传感器看起来像这样:
这是从这个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
,反之亦然。我想看看如何将点文件转换为允许进行此类分析和测试的格式。
您可以先使用https://code.google.com/p/pydot/加载文件。从那里开始,应该相对简单地编写代码以根据输入字符串遍历内存中的图形。
首先,我安装了graphviz库。然后我写了下面的代码:
import os
from graphviz import Source
file = open('graph4.dot', 'r')#READING DOT FILE
text=file.read()
Source(text)
Guillaume的答案足以在Spyder(3.3.2)中呈现图形,这可能会解决一些人的问题。
如果你真的需要操纵图形,就像OP需要的那样,它会有点复杂。部分问题是Graphviz是一个图形渲染库,而您正在尝试分析图形。您要做的是类似于从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/。
使用它来加载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()