Created
July 12, 2017 08:42
-
-
Save lmatt-bit/461e1e9efc528f3f7fdad83c334953cb to your computer and use it in GitHub Desktop.
Using graphviz
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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