Skip to content

Instantly share code, notes, and snippets.

@lmatt-bit
Created July 12, 2017 08:42
Show Gist options
  • Save lmatt-bit/461e1e9efc528f3f7fdad83c334953cb to your computer and use it in GitHub Desktop.
Save lmatt-bit/461e1e9efc528f3f7fdad83c334953cb to your computer and use it in GitHub Desktop.
Using graphviz
from graphviz import Digraph
import json
def generate_sub_graph(sub_graph_name, digraph, sub_data_json):
with digraph.subgraph(name="cluster_" + sub_graph_name, edge_attr={'arrowhead': 'none'}) as c:
data_len = len(sub_data_json)
edges = []
c.node(sub_graph_name + str(data_len), label=sub_graph_name + "_sentence_end")
for i in range(data_len):
c.node(sub_graph_name + str(data_len - i - 1), label=sub_data_json[data_len - i - 1])
for i in range(data_len):
edges.append((sub_graph_name + str(i), sub_graph_name + str(i + 1)))
c.node_attr.update(style='filled')
#c.edges(edges)
c.attr(label=sub_graph_name)
c.attr(color='blue')
def generate_sentence(sub_name, digraph, sub_data_json, start_x, start_y, color):
data_len = len(sub_data_json)
edges = []
current_y = 0
y_step = 1
for i in range(data_len):
digraph.node(
sub_name + str(i),
sub_data_json[i],
{"pos": "%d,%d!" % (current_y, start_x), "pin": "true", "color": color})
current_y += y_step
digraph.node(
sub_name + str(data_len),
sub_name[0].capitalize() + "_END",
{"pos": "%d,%d!" % (current_y, start_x), "pin": "true", "color": color})
for i in range(data_len):
edges.append((sub_name + str(i), sub_name + str(i + 1)))
#digraph.edges(edges)
def generate_alignment_image(data_json_str, image_name):
g = Digraph(image_name, filename=image_name, engine='neato')
data_json = json.loads(data_json_str)
source_sub_name = 'source'
target_sub_name = 'target'
#generate_sub_graph(target_sub_name, g, data_json["tgt_array"])
start_y = max(len(data_json["tgt_array"]), len(data_json["src_array"])) + 1
generate_sentence(target_sub_name, g, data_json["tgt_array"], 1, start_y, 'green')
#generate_sub_graph(source_sub_name, g, data_json["src_array"])
generate_sentence(source_sub_name, g, data_json["src_array"], 3, start_y, 'blue')
mapping = data_json["tgt_src_mapping"]
# g.edge('START_FOR_ALIGN', source_sub_name + '0')
# g.edge('START_FOR_ALIGN', target_sub_name + '0')
# g.edge(source_sub_name + str(len(data_json["src_array"])), 'END_FOR_ALIGN')
# g.edge(target_sub_name + str(len(data_json["tgt_array"])), 'END_FOR_ALIGN')
for ti, si in enumerate(mapping):
g.edge(source_sub_name + str(si), target_sub_name + str(ti))
g.format="png"
#g.render()
#print(g)
g.view()
import sys
generate_alignment_image(open(sys.argv[1]).read(), "test")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment