In [86]:
%matplotlib inline

# install the gvmagic extension by uncommenting/running it once: 
# %install_ext https://raw.github.com/cjdrake/ipython-magic/master/gvmagic.py

%load_ext gvmagic


The gvmagic extension is already loaded. To reload it, use:
  %reload_ext gvmagic

In [87]:
import os
import discoursegraphs as dg
import networkx as nx

from gvmagic import rundot

In [88]:
CORPUS_DIR = os.path.expanduser('~/corpora/potsdam-commentary-corpus-2.0.0/')
MAZ_FILENAME = 'maz-1423.rs3'

rdg = dg.read_rs3(os.path.join(CORPUS_DIR, 'rst', MAZ_FILENAME))
rstgraph_untokenized = dg.read_rs3(os.path.join(CORPUS_DIR, 'rst', MAZ_FILENAME), tokenize=False)

In [89]:
%dotstr dg.print_dot(rstgraph_untokenized)


maz-1423.rs3 rst:2 [s]:2: Bei der jüngsten Sit... rst:16 [s]:16: Die Diskussion , wie... rst:2->rst:16 rst:background rst:6 [s]:6: Jetzt wird es darum ... rst:33 rst:group:multinuc:33 rst:6->rst:33 rst:reason rst:4 [s]:4: Die Einnahmen sind d... rst:5 [s]:5: Die Betriebskosten f... rst:4->rst:5 rst:evidence rst:32 [n]:32: desto weniger wird d... rst:33->rst:32 rst:conjunction rst:7 [n]:7: Je mehr Veranstaltun... rst:33->rst:7 rst:conjunction rst:13 [s]:13: Die Gäste aus nah un... rst:27 rst:group:span:27 rst:27->rst:2 rst:span rst:22 rst:group:span:22 rst:12 [s]:12: Das Oktoberfest hat ... rst:22->rst:12 rst:span rst:31 rst:group:span:31 rst:30 rst:group:span:30 rst:31->rst:30 rst:span rst:23 rst:group:span:23 rst:21 rst:group:span:21 rst:23->rst:21 rst:antithesis rst:11 [s]:11: Wittstock dagegen mu... rst:23->rst:11 rst:span rst:9 [s]:9: Und in der Region gi... rst:21->rst:9 rst:span rst:24 rst:group:span:24 rst:30->rst:24 rst:interpretation rst:29 rst:group:multinuc:29 rst:30->rst:29 rst:span rst:10 [s]:10: Auch die Nachbarstäd... rst:14 [s]:14: Fest steht , dass di... rst:24->rst:14 rst:span rst:18 rst:group:span:18 rst:18->rst:4 rst:span rst:28 rst:group:span:28 rst:3 [s]:3: Vor allem kommerziel... rst:28->rst:3 rst:span rst:1 [i]:1: Zum Angewöhnen... rst:3->rst:27 rst:background rst:20 rst:group:span:20 rst:20->rst:18 rst:reason rst:19 rst:group:span:19 rst:20->rst:19 rst:span rst:26 rst:group:span:26 rst:26->rst:20 rst:span rst:12->rst:13 rst:reason rst:29->rst:28 rst:concession rst:29->rst:26 rst:joint rst:25 rst:group:span:25 rst:29->rst:25 rst:joint rst:9->rst:10 rst:evidence rst:15 [s]:15: Ohne die Halle würde... rst:14->rst:15 rst:restatement rst:8 [s]:8: Die Halle muss ausge... rst:25->rst:23 rst:span rst:11->rst:22 rst:evidence rst:19->rst:6 rst:span rst:19->rst:8 rst:summary discoursegraph:root_node discoursegraph:root_node

In [90]:
%dotstr dg.print_dot(rdg)


maz-1423.rs3 rst:rst:10_6 Platz rst:rst:14_11 Veranstaltungsort rst:rst:7_4 , rst:rst:12_4 , rst:6 [s]:6: Jetzt wird es darum ... rst:rst:6_14 . rst:6->rst:rst:6_14 rst:rst:6_2 es rst:6->rst:rst:6_2 rst:rst:6_10 wie rst:6->rst:rst:6_10 rst:rst:6_5 , rst:6->rst:rst:6_5 rst:rst:6_13 füllen rst:6->rst:rst:6_13 rst:rst:6_4 gehen rst:6->rst:rst:6_4 rst:rst:6_12 zu rst:6->rst:rst:6_12 rst:rst:6_7 Halle rst:6->rst:rst:6_7 rst:33 rst:group:multinuc:33 rst:6->rst:33 rst:reason rst:rst:6_9 oft rst:6->rst:rst:6_9 rst:rst:6_11 möglich rst:6->rst:rst:6_11 rst:rst:6_6 die rst:6->rst:rst:6_6 rst:rst:6_8 so rst:6->rst:rst:6_8 rst:rst:6_1 wird rst:6->rst:rst:6_1 rst:rst:6_0 Jetzt rst:6->rst:rst:6_0 rst:rst:6_3 darum rst:6->rst:rst:6_3 rst:rst:13_17 zu rst:rst:4_7 auf rst:rst:2_2 jüngsten rst:rst:16_3 wie rst:27 rst:group:span:27 rst:2 [s]:2: Bei der jüngsten Sit... rst:27->rst:2 rst:span rst:22 rst:group:span:22 rst:12 [s]:12: Das Oktoberfest hat ... rst:22->rst:12 rst:span rst:rst:3_9 Kasse rst:rst:7_2 Veranstaltungen rst:rst:12_10 . rst:rst:15_5 bald rst:28 rst:group:span:28 rst:3 [s]:3: Vor allem kommerziel... rst:28->rst:3 rst:span rst:rst:4_8 den rst:rst:2_1 der rst:rst:3_11 . rst:rst:14_10 ansehnlichen rst:rst:16_17 Zeit rst:rst:3_1 allem rst:rst:9_7 . rst:rst:14_5 Dosse-Stadt rst:rst:13_3 nah rst:rst:5_4 schmucken rst:rst:2_5 die rst:rst:11_7 machen rst:rst:13_14 und rst:rst:4_6 Tropfen rst:rst:3_2 kommerzielle rst:26 rst:group:span:26 rst:20 rst:group:span:20 rst:26->rst:20 rst:span rst:rst:7_3 stattfinden rst:5 [s]:5: Die Betriebskosten f... rst:5->rst:rst:5_4 rst:rst:5_5 Veranstaltungsort rst:5->rst:rst:5_5 rst:rst:5_6 sind rst:5->rst:rst:5_6 rst:rst:5_3 den rst:5->rst:rst:5_3 rst:rst:5_2 für rst:5->rst:rst:5_2 rst:rst:5_0 Die rst:5->rst:rst:5_0 rst:rst:5_1 Betriebskosten rst:5->rst:rst:5_1 rst:rst:5_7 hoch rst:5->rst:rst:5_7 rst:rst:5_8 . rst:5->rst:rst:5_8 rst:rst:32_3 der rst:30 rst:group:span:30 rst:24 rst:group:span:24 rst:30->rst:24 rst:interpretation rst:29 rst:group:multinuc:29 rst:30->rst:29 rst:span rst:rst:11_4 erst rst:14 [s]:14: Fest steht , dass di... rst:14->rst:rst:14_11 rst:14->rst:rst:14_10 rst:14->rst:rst:14_5 rst:rst:14_18 auskommt rst:14->rst:rst:14_18 rst:rst:14_6 als rst:14->rst:rst:14_6 rst:15 [s]:15: Ohne die Halle würde... rst:14->rst:15 rst:restatement rst:rst:14_17 nicht rst:14->rst:rst:14_17 rst:rst:14_8 ohne rst:14->rst:rst:14_8 rst:rst:14_7 Mittelzentrum rst:14->rst:rst:14_7 rst:rst:14_16 Publikum rst:14->rst:rst:14_16 rst:rst:14_9 einen rst:14->rst:rst:14_9 rst:rst:14_0 Fest rst:14->rst:rst:14_0 rst:rst:14_15 fürs rst:14->rst:rst:14_15 rst:rst:14_1 steht rst:14->rst:rst:14_1 rst:rst:14_14 Platz rst:14->rst:rst:14_14 rst:rst:14_2 , rst:14->rst:rst:14_2 rst:rst:14_19 . rst:14->rst:rst:14_19 rst:rst:14_13 ausreichend rst:14->rst:rst:14_13 rst:rst:14_3 dass rst:14->rst:rst:14_3 rst:rst:14_12 mit rst:14->rst:rst:14_12 rst:rst:14_4 die rst:14->rst:rst:14_4 rst:rst:10_7 . rst:rst:16_0 Die rst:rst:4_11 . rst:rst:3_10 gebeten rst:rst:15_4 Wittstock rst:rst:16_16 einige rst:rst:1_1 Angewöhnen rst:rst:9_4 gibt discoursegraph:root_node discoursegraph:root_node rst:rst:13_2 aus rst:rst:13_9 daran rst:rst:13_15 Richtung rst:rst:11_6 Namen rst:rst:2_7 entschieden rst:rst:4_5 ein rst:rst:3_3 Veranstalter rst:rst:32_4 Stadthaushalt rst:4 [s]:4: Die Einnahmen sind d... rst:4->rst:rst:4_7 rst:4->rst:rst:4_8 rst:4->rst:rst:4_6 rst:4->rst:5 rst:evidence rst:4->rst:rst:4_11 rst:4->rst:rst:4_5 rst:rst:4_4 nur rst:4->rst:rst:4_4 rst:rst:4_10 Stein rst:4->rst:rst:4_10 rst:rst:4_3 dennoch rst:4->rst:rst:4_3 rst:rst:4_0 Die rst:4->rst:rst:4_0 rst:rst:4_2 sind rst:4->rst:rst:4_2 rst:rst:4_1 Einnahmen rst:4->rst:rst:4_1 rst:rst:4_9 heißen rst:4->rst:rst:4_9 rst:15->rst:rst:15_5 rst:15->rst:rst:15_4 rst:rst:15_7 Hintertreffen rst:15->rst:rst:15_7 rst:rst:15_6 ins rst:15->rst:rst:15_6 rst:rst:15_1 die rst:15->rst:rst:15_1 rst:rst:15_9 . rst:15->rst:rst:15_9 rst:rst:15_0 Ohne rst:15->rst:rst:15_0 rst:rst:15_8 geraten rst:15->rst:rst:15_8 rst:rst:15_3 würde rst:15->rst:rst:15_3 rst:rst:15_2 Halle rst:15->rst:rst:15_2 rst:rst:10_0 Auch rst:rst:16_11 und rst:rst:2_8 . rst:rst:16_8 Stadthalle rst:rst:9_5 es rst:rst:12_2 hat rst:rst:32_2 wird rst:rst:13_4 und rst:rst:16_20 genommen rst:rst:13_1 Gäste rst:rst:8_5 . rst:rst:11_1 dagegen rst:rst:13_12 nach rst:3->rst:27 rst:background rst:3->rst:rst:3_9 rst:3->rst:rst:3_11 rst:3->rst:rst:3_1 rst:3->rst:rst:3_2 rst:3->rst:rst:3_10 rst:3->rst:rst:3_3 rst:rst:3_4 werden rst:3->rst:rst:3_4 rst:rst:3_5 ab rst:3->rst:rst:3_5 rst:rst:3_6 2002 rst:3->rst:rst:3_6 rst:rst:3_7 gut rst:3->rst:rst:3_7 rst:rst:3_8 zur rst:3->rst:rst:3_8 rst:rst:3_0 Vor rst:3->rst:rst:3_0 rst:rst:16_18 in rst:rst:16_6 neue rst:rst:32_5 belastet rst:12->rst:rst:12_4 rst:12->rst:rst:12_10 rst:12->rst:rst:12_2 rst:rst:12_3 gezeigt rst:12->rst:rst:12_3 rst:13 [s]:13: Die Gäste aus nah un... rst:12->rst:13 rst:reason rst:rst:12_8 Anlaufzeit rst:12->rst:rst:12_8 rst:rst:12_0 Das rst:12->rst:rst:12_0 rst:rst:12_1 Oktoberfest rst:12->rst:rst:12_1 rst:rst:12_9 braucht rst:12->rst:rst:12_9 rst:rst:12_5 dass rst:12->rst:rst:12_5 rst:rst:12_6 es rst:12->rst:rst:12_6 rst:rst:12_7 eine rst:12->rst:rst:12_7 rst:rst:10_1 die rst:32 [n]:32: desto weniger wird d... rst:32->rst:rst:32_3 rst:32->rst:rst:32_4 rst:32->rst:rst:32_2 rst:32->rst:rst:32_5 rst:rst:32_6 . rst:32->rst:rst:32_6 rst:rst:32_0 desto rst:32->rst:rst:32_0 rst:rst:32_1 weniger rst:32->rst:rst:32_1 rst:rst:13_8 erst rst:rst:16_9 für rst:rst:16_10 Vereine rst:rst:9_2 der rst:25 rst:group:span:25 rst:23 rst:group:span:23 rst:25->rst:23 rst:span rst:rst:8_4 sein rst:rst:13_13 Wittstock rst:2->rst:rst:2_2 rst:2->rst:rst:2_1 rst:2->rst:rst:2_5 rst:2->rst:rst:2_7 rst:2->rst:rst:2_8 rst:rst:2_4 haben rst:2->rst:rst:2_4 rst:rst:2_6 Stadtverordneten rst:2->rst:rst:2_6 rst:rst:2_0 Bei rst:2->rst:rst:2_0 rst:rst:2_3 Sitzung rst:2->rst:rst:2_3 rst:16 [s]:16: Die Diskussion , wie... rst:2->rst:16 rst:background rst:rst:16_7 Wittstocker rst:33->rst:32 rst:conjunction rst:7 [n]:7: Je mehr Veranstaltun... rst:33->rst:7 rst:conjunction rst:13->rst:rst:13_17 rst:13->rst:rst:13_3 rst:13->rst:rst:13_14 rst:13->rst:rst:13_2 rst:13->rst:rst:13_9 rst:13->rst:rst:13_15 rst:13->rst:rst:13_4 rst:13->rst:rst:13_1 rst:13->rst:rst:13_12 rst:13->rst:rst:13_8 rst:13->rst:rst:13_13 rst:rst:13_7 sich rst:13->rst:rst:13_7 rst:rst:13_10 gewöhnen rst:13->rst:rst:13_10 rst:rst:13_6 müssen rst:13->rst:rst:13_6 rst:rst:13_5 fern rst:13->rst:rst:13_5 rst:rst:13_11 , rst:13->rst:rst:13_11 rst:rst:13_18 pilgern rst:13->rst:rst:13_18 rst:rst:13_0 Die rst:13->rst:rst:13_0 rst:rst:13_16 Gymnasium rst:13->rst:rst:13_16 rst:rst:13_19 . rst:13->rst:rst:13_19 rst:rst:10_2 Nachbarstädte rst:21 rst:group:span:21 rst:23->rst:21 rst:antithesis rst:11 [s]:11: Wittstock dagegen mu... rst:23->rst:11 rst:span rst:24->rst:14 rst:span rst:rst:9_3 Region rst:rst:8_3 ausgelastet rst:rst:16_19 Anspruch rst:rst:1_0 Zum rst:rst:16_13 wird rst:1 [i]:1: Zum Angewöhnen... rst:1->rst:rst:1_1 rst:1->rst:rst:1_0 rst:rst:16_4 teuer rst:rst:10_3 bieten rst:rst:16_5 die rst:29->rst:28 rst:concession rst:29->rst:26 rst:joint rst:29->rst:25 rst:joint rst:9 [s]:9: Und in der Region gi... rst:9->rst:rst:9_7 rst:9->rst:rst:9_4 rst:9->rst:rst:9_5 rst:9->rst:rst:9_2 rst:9->rst:rst:9_3 rst:rst:9_0 Und rst:9->rst:rst:9_0 rst:10 [s]:10: Auch die Nachbarstäd... rst:9->rst:10 rst:evidence rst:rst:9_1 in rst:9->rst:rst:9_1 rst:rst:9_6 Konkurrenz rst:9->rst:rst:9_6 rst:rst:11_3 sich rst:rst:11_8 . rst:rst:8_2 muss rst:rst:16_12 Veranstalter rst:rst:10_4 Veranstaltern rst:rst:11_0 Wittstock rst:rst:16_1 Diskussion rst:rst:11_2 muss rst:21->rst:9 rst:span rst:rst:7_0 Je rst:10->rst:rst:10_6 rst:10->rst:rst:10_7 rst:10->rst:rst:10_0 rst:10->rst:rst:10_1 rst:10->rst:rst:10_2 rst:10->rst:rst:10_3 rst:10->rst:rst:10_4 rst:rst:10_5 genügend rst:10->rst:rst:10_5 rst:rst:8_1 Halle rst:rst:16_15 hat rst:18 rst:group:span:18 rst:18->rst:4 rst:span rst:31 rst:group:span:31 rst:31->rst:30 rst:span rst:rst:16_2 , rst:7->rst:rst:7_4 rst:7->rst:rst:7_2 rst:7->rst:rst:7_3 rst:7->rst:rst:7_0 rst:rst:7_1 mehr rst:7->rst:rst:7_1 rst:rst:11_5 einen rst:20->rst:18 rst:reason rst:19 rst:group:span:19 rst:20->rst:19 rst:span rst:16->rst:rst:16_3 rst:16->rst:rst:16_17 rst:16->rst:rst:16_0 rst:16->rst:rst:16_16 rst:16->rst:rst:16_11 rst:16->rst:rst:16_8 rst:16->rst:rst:16_20 rst:16->rst:rst:16_18 rst:16->rst:rst:16_6 rst:16->rst:rst:16_9 rst:16->rst:rst:16_10 rst:16->rst:rst:16_7 rst:16->rst:rst:16_19 rst:16->rst:rst:16_13 rst:16->rst:rst:16_4 rst:16->rst:rst:16_5 rst:16->rst:rst:16_12 rst:16->rst:rst:16_1 rst:16->rst:rst:16_15 rst:16->rst:rst:16_2 rst:rst:16_21 . rst:16->rst:rst:16_21 rst:rst:16_14 , rst:16->rst:rst:16_14 rst:8 [s]:8: Die Halle muss ausge... rst:8->rst:rst:8_5 rst:8->rst:rst:8_4 rst:8->rst:rst:8_3 rst:8->rst:rst:8_2 rst:8->rst:rst:8_1 rst:rst:8_0 Die rst:8->rst:rst:8_0 rst:11->rst:22 rst:evidence rst:11->rst:rst:11_7 rst:11->rst:rst:11_4 rst:11->rst:rst:11_6 rst:11->rst:rst:11_1 rst:11->rst:rst:11_3 rst:11->rst:rst:11_8 rst:11->rst:rst:11_0 rst:11->rst:rst:11_2 rst:11->rst:rst:11_5 rst:19->rst:6 rst:span rst:19->rst:8 rst:summary

In [91]:
rdg_stripped = dg.readwrite.dot.preprocess_for_pydot(rdg)

In [93]:
rdg_stripped_dfs = nx.dfs_tree(rdg_stripped, '"{}"'.format(rdg.root))

In [94]:
preordered_rdg_nodes = nx.dfs_preorder_nodes(rdg_stripped, '"{}"'.format(rdg.root))

In [95]:
# for n in preordered_rdg_nodes:
#     print n,

In [96]:
postordered_rdg_nodes = nx.dfs_postorder_nodes(rdg_stripped, '"{}"'.format(rdg.root))

# for n in postordered_rdg_nodes:
#     print n,

In [97]:
successors_rdg_nodes = nx.dfs_successors(rdg_stripped, '"{}"'.format(rdg.root))

In [98]:
for source_node in successors_rdg_nodes:
    print source_node, sorted(successors_rdg_nodes[source_node], key=dg.util.natural_sort_key)


"rst:12" [u'"rst:13"', u'"rst:rst:12_0"', u'"rst:rst:12_1"', u'"rst:rst:12_2"', u'"rst:rst:12_3"', u'"rst:rst:12_4"', u'"rst:rst:12_5"', u'"rst:rst:12_6"', u'"rst:rst:12_7"', u'"rst:rst:12_8"', u'"rst:rst:12_9"', u'"rst:rst:12_10"']
"rst:32" [u'"rst:rst:32_0"', u'"rst:rst:32_1"', u'"rst:rst:32_2"', u'"rst:rst:32_3"', u'"rst:rst:32_4"', u'"rst:rst:32_5"', u'"rst:rst:32_6"']
"rst:3" [u'"rst:27"', u'"rst:rst:3_0"', u'"rst:rst:3_1"', u'"rst:rst:3_2"', u'"rst:rst:3_3"', u'"rst:rst:3_4"', u'"rst:rst:3_5"', u'"rst:rst:3_6"', u'"rst:rst:3_7"', u'"rst:rst:3_8"', u'"rst:rst:3_9"', u'"rst:rst:3_10"', u'"rst:rst:3_11"']
"rst:2" [u'"rst:16"', u'"rst:rst:2_0"', u'"rst:rst:2_1"', u'"rst:rst:2_2"', u'"rst:rst:2_3"', u'"rst:rst:2_4"', u'"rst:rst:2_5"', u'"rst:rst:2_6"', u'"rst:rst:2_7"', u'"rst:rst:2_8"']
"rst:7" [u'"rst:rst:7_0"', u'"rst:rst:7_1"', u'"rst:rst:7_2"', u'"rst:rst:7_3"', u'"rst:rst:7_4"']
"rst:6" [u'"rst:33"', u'"rst:rst:6_0"', u'"rst:rst:6_1"', u'"rst:rst:6_2"', u'"rst:rst:6_3"', u'"rst:rst:6_4"', u'"rst:rst:6_5"', u'"rst:rst:6_6"', u'"rst:rst:6_7"', u'"rst:rst:6_8"', u'"rst:rst:6_9"', u'"rst:rst:6_10"', u'"rst:rst:6_11"', u'"rst:rst:6_12"', u'"rst:rst:6_13"', u'"rst:rst:6_14"']
"rst:4" [u'"rst:5"', u'"rst:rst:4_0"', u'"rst:rst:4_1"', u'"rst:rst:4_2"', u'"rst:rst:4_3"', u'"rst:rst:4_4"', u'"rst:rst:4_5"', u'"rst:rst:4_6"', u'"rst:rst:4_7"', u'"rst:rst:4_8"', u'"rst:rst:4_9"', u'"rst:rst:4_10"', u'"rst:rst:4_11"']
"rst:33" [u'"rst:7"', u'"rst:32"']
"rst:15" [u'"rst:rst:15_0"', u'"rst:rst:15_1"', u'"rst:rst:15_2"', u'"rst:rst:15_3"', u'"rst:rst:15_4"', u'"rst:rst:15_5"', u'"rst:rst:15_6"', u'"rst:rst:15_7"', u'"rst:rst:15_8"', u'"rst:rst:15_9"']
"rst:13" [u'"rst:rst:13_0"', u'"rst:rst:13_1"', u'"rst:rst:13_2"', u'"rst:rst:13_3"', u'"rst:rst:13_4"', u'"rst:rst:13_5"', u'"rst:rst:13_6"', u'"rst:rst:13_7"', u'"rst:rst:13_8"', u'"rst:rst:13_9"', u'"rst:rst:13_10"', u'"rst:rst:13_11"', u'"rst:rst:13_12"', u'"rst:rst:13_13"', u'"rst:rst:13_14"', u'"rst:rst:13_15"', u'"rst:rst:13_16"', u'"rst:rst:13_17"', u'"rst:rst:13_18"', u'"rst:rst:13_19"']
"rst:27" [u'"rst:2"']
"rst:5" [u'"rst:rst:5_0"', u'"rst:rst:5_1"', u'"rst:rst:5_2"', u'"rst:rst:5_3"', u'"rst:rst:5_4"', u'"rst:rst:5_5"', u'"rst:rst:5_6"', u'"rst:rst:5_7"', u'"rst:rst:5_8"']
"rst:31" [u'"rst:30"']
"rst:23" [u'"rst:11"', u'"rst:21"']
"rst:9" [u'"rst:10"', u'"rst:rst:9_0"', u'"rst:rst:9_1"', u'"rst:rst:9_2"', u'"rst:rst:9_3"', u'"rst:rst:9_4"', u'"rst:rst:9_5"', u'"rst:rst:9_6"', u'"rst:rst:9_7"']
"rst:21" [u'"rst:9"']
"rst:30" [u'"rst:24"', u'"rst:29"']
"rst:8" [u'"rst:rst:8_0"', u'"rst:rst:8_1"', u'"rst:rst:8_2"', u'"rst:rst:8_3"', u'"rst:rst:8_4"', u'"rst:rst:8_5"']
"rst:11" [u'"rst:22"', u'"rst:rst:11_0"', u'"rst:rst:11_1"', u'"rst:rst:11_2"', u'"rst:rst:11_3"', u'"rst:rst:11_4"', u'"rst:rst:11_5"', u'"rst:rst:11_6"', u'"rst:rst:11_7"', u'"rst:rst:11_8"']
"rst:10" [u'"rst:rst:10_0"', u'"rst:rst:10_1"', u'"rst:rst:10_2"', u'"rst:rst:10_3"', u'"rst:rst:10_4"', u'"rst:rst:10_5"', u'"rst:rst:10_6"', u'"rst:rst:10_7"']
"rst:14" [u'"rst:15"', u'"rst:rst:14_0"', u'"rst:rst:14_1"', u'"rst:rst:14_2"', u'"rst:rst:14_3"', u'"rst:rst:14_4"', u'"rst:rst:14_5"', u'"rst:rst:14_6"', u'"rst:rst:14_7"', u'"rst:rst:14_8"', u'"rst:rst:14_9"', u'"rst:rst:14_10"', u'"rst:rst:14_11"', u'"rst:rst:14_12"', u'"rst:rst:14_13"', u'"rst:rst:14_14"', u'"rst:rst:14_15"', u'"rst:rst:14_16"', u'"rst:rst:14_17"', u'"rst:rst:14_18"', u'"rst:rst:14_19"']
"rst:29" [u'"rst:25"', u'"rst:26"', u'"rst:28"']
"rst:22" [u'"rst:12"']
"rst:24" [u'"rst:14"']
"rst:18" [u'"rst:4"']
"rst:25" [u'"rst:23"']
"rst:20" [u'"rst:18"', u'"rst:19"']
"rst:16" [u'"rst:rst:16_0"', u'"rst:rst:16_1"', u'"rst:rst:16_2"', u'"rst:rst:16_3"', u'"rst:rst:16_4"', u'"rst:rst:16_5"', u'"rst:rst:16_6"', u'"rst:rst:16_7"', u'"rst:rst:16_8"', u'"rst:rst:16_9"', u'"rst:rst:16_10"', u'"rst:rst:16_11"', u'"rst:rst:16_12"', u'"rst:rst:16_13"', u'"rst:rst:16_14"', u'"rst:rst:16_15"', u'"rst:rst:16_16"', u'"rst:rst:16_17"', u'"rst:rst:16_18"', u'"rst:rst:16_19"', u'"rst:rst:16_20"', u'"rst:rst:16_21"']
"rst:19" [u'"rst:6"', u'"rst:8"']
"rst:28" [u'"rst:3"']
"rst:26" [u'"rst:20"']

In [99]:
dfs_labeled_rdg_edges = nx.dfs_labeled_edges(rdg_stripped, '"{}"'.format(rdg.root))

In [100]:
# for e in dfs_labeled_rdg_edges:
#     print e

In [101]:
[(src, trg, attrs) for (src, trg, attrs) in rdg.edges(data=True) if attrs.get('edge_type') not in ('dominates, spans')]


Out[101]:
[]

In [131]:
import pydot
from networkx.drawing.nx_pydot import make_str

def to_pydot(M):
    """Return a pydot graph from a MultiDiGraph M.

    Parameters
    ----------
    M : networkx.MultiDiGraph
      A graph created with discoursegraphs and then stripped with ``preprocess_for_pydot()``
    """
    graph_type='digraph'
    name = M.graph.get('name')
    graph_defaults=M.graph.get('graph',{})
    P = pydot.Dot('"%s"'%name,graph_type=graph_type,strict=False,
                  **graph_defaults)

    for n,nodedata in sorted(M.nodes_iter(data=True), key=dg.util.natural_sort_key):
        str_nodedata=dict((k,make_str(v)) for k,v in nodedata.items())
        p=pydot.Node(make_str(n),**str_nodedata)
        P.add_node(p)

    for u,v,key,edgedata in sorted(M.edges_iter(data=True,keys=True), key=dg.util.natural_sort_key):
        str_edgedata=dict((k,make_str(v)) for k,v in edgedata.items())
        edge=pydot.Edge(make_str(u),make_str(v),key=make_str(key),**str_edgedata)
        P.add_edge(edge)
    return P

In [135]:
rdg_stripped = dg.readwrite.dot.preprocess_for_pydot(rstgraph_untokenized)

In [136]:
rdg_pydot = to_pydot(rdg_stripped)

In [137]:
%dotstr rdg_pydot.to_string()


maz-1423.rs3 discoursegraph:root_node discoursegraph:root_node rst:1 [i]:1: Zum Angewöhnen... rst:2 [s]:2: Bei der jüngsten Sit... rst:16 [s]:16: Die Diskussion , wie... rst:2->rst:16 rst:background rst:3 [s]:3: Vor allem kommerziel... rst:27 rst:group:span:27 rst:3->rst:27 rst:background rst:4 [s]:4: Die Einnahmen sind d... rst:5 [s]:5: Die Betriebskosten f... rst:4->rst:5 rst:evidence rst:6 [s]:6: Jetzt wird es darum ... rst:33 rst:group:multinuc:33 rst:6->rst:33 rst:reason rst:7 [n]:7: Je mehr Veranstaltun... rst:8 [s]:8: Die Halle muss ausge... rst:9 [s]:9: Und in der Region gi... rst:10 [s]:10: Auch die Nachbarstäd... rst:9->rst:10 rst:evidence rst:11 [s]:11: Wittstock dagegen mu... rst:22 rst:group:span:22 rst:11->rst:22 rst:evidence rst:12 [s]:12: Das Oktoberfest hat ... rst:13 [s]:13: Die Gäste aus nah un... rst:12->rst:13 rst:reason rst:14 [s]:14: Fest steht , dass di... rst:15 [s]:15: Ohne die Halle würde... rst:14->rst:15 rst:restatement rst:18 rst:group:span:18 rst:18->rst:4 rst:span rst:19 rst:group:span:19 rst:19->rst:6 rst:span rst:19->rst:8 rst:summary rst:20 rst:group:span:20 rst:20->rst:18 rst:reason rst:20->rst:19 rst:span rst:21 rst:group:span:21 rst:21->rst:9 rst:span rst:22->rst:12 rst:span rst:23 rst:group:span:23 rst:23->rst:11 rst:span rst:23->rst:21 rst:antithesis rst:24 rst:group:span:24 rst:24->rst:14 rst:span rst:25 rst:group:span:25 rst:25->rst:23 rst:span rst:26 rst:group:span:26 rst:26->rst:20 rst:span rst:27->rst:2 rst:span rst:28 rst:group:span:28 rst:28->rst:3 rst:span rst:29 rst:group:multinuc:29 rst:29->rst:25 rst:joint rst:29->rst:26 rst:joint rst:29->rst:28 rst:concession rst:30 rst:group:span:30 rst:30->rst:24 rst:interpretation rst:30->rst:29 rst:span rst:31 rst:group:span:31 rst:31->rst:30 rst:span rst:32 [n]:32: desto weniger wird d... rst:33->rst:7 rst:conjunction rst:33->rst:32 rst:conjunction

In [126]:
%dotstr to_pydot(rdg).to_string()

In [147]:
tdg = dg.read_tiger(os.path.join(CORPUS_DIR, 'syntax', 'tiger_test.xml'))

In [148]:
tdg_stripped = dg.readwrite.dot.preprocess_for_pydot(tdg)
tdg_pydot = to_pydot(tdg_stripped)

In [162]:
with open('/tmp/tdg_stripped.dot', 'w') as of:
    of.write(tdg_pydot.to_string().encode('utf8'))

In [150]:
print tdg_pydot.to_string()


digraph "tiger_test.xml" {
"VROOT-s2104";
"discoursegraph:root_node";
"s2104_1" [label="Der"];
"s2104_2" [label="rot-grünen"];
"s2104_3" [label="Koalition"];
"s2104_4" [label="steht"];
"s2104_5" [label="eine"];
"s2104_6" [label="Zerreißprobe"];
"s2104_7" [label="bevor"];
"s2104_8" [label=":"];
"s2104_500" [label="NP"];
"s2104_501" [label="NP"];
"s2104_502" [label="S"];
"tiger:root_node";
"VROOT-s2104" -> "discoursegraph:root_node"  [key=0];
"VROOT-s2104" -> "s2104_8"  [key=0];
"VROOT-s2104" -> "s2104_502"  [key=0];
"s2104_500" -> "s2104_1"  [key=0, label="NK"];
"s2104_500" -> "s2104_2"  [key=0, label="NK"];
"s2104_500" -> "s2104_3"  [key=0, label="NK"];
"s2104_501" -> "s2104_5"  [key=0, label="NK"];
"s2104_501" -> "s2104_6"  [key=0, label="NK"];
"s2104_502" -> "s2104_4"  [key=0, label="HD"];
"s2104_502" -> "s2104_7"  [key=0, label="SVP"];
"s2104_502" -> "s2104_500"  [key=0, label="DA"];
"s2104_502" -> "s2104_501"  [key=0, label="SB"];
"tiger:root_node" -> "VROOT-s2104"  [key=0];
}


In [149]:
%dotstr tdg_pydot.to_string()


tiger_test.xml VROOT-s2104 VROOT-s2104 discoursegraph:root_node discoursegraph:root_node VROOT-s2104->discoursegraph:root_node s2104_8 : VROOT-s2104->s2104_8 s2104_502 S VROOT-s2104->s2104_502 s2104_1 Der s2104_2 rot-grünen s2104_3 Koalition s2104_4 steht s2104_5 eine s2104_6 Zerreißprobe s2104_7 bevor s2104_500 NP s2104_500->s2104_1 NK s2104_500->s2104_2 NK s2104_500->s2104_3 NK s2104_501 NP s2104_501->s2104_5 NK s2104_501->s2104_6 NK s2104_502->s2104_4 HD s2104_502->s2104_7 SVP s2104_502->s2104_500 DA s2104_502->s2104_501 SB tiger:root_node tiger:root_node tiger:root_node->VROOT-s2104

In [160]:
%dotstr open('/tmp/mini.dot').read().decode('utf8')


tiger_test.xml s2104_1 Der s2104_2 rot-grünen s2104_3 Koalition s2104_4 steht s2104_5 eine s2104_6 Zerreißprobe s2104_7 bevor s2104_500 NP s2104_500->s2104_1 NK s2104_500->s2104_2 NK s2104_500->s2104_3 NK s2104_501 NP s2104_501->s2104_5 NK s2104_501->s2104_6 NK s2104_502 S s2104_502->s2104_4 HD s2104_502->s2104_7 SVP s2104_502->s2104_500 DA s2104_502->s2104_501 SB

TODO: set rank=same automatically for nodes which align horizontally

http://stackoverflow.com/questions/20910596/line-up-the-heads-of-dot-graph-using-pydot


In [ ]: