two potential errors in discoursegraphs RS3 parsing

Issue 1: Are all multinuc roots nucleii?

1) oft (nicht sicher ob evtl. sogar immer) sind die abstrakten Knoten über multinuklearen Relationen selbst als Nuklei gelabelt, selbst wenn sie eigentlich Satelliten eines anderen Nukleus sind. (siehe u.a. Anhang (maz-4636/maz-4636.png))


In [1]:
import os
import discoursegraphs as dg

DOC_ID = 'maz-4636'
RST_ROOTDIR = os.path.expanduser('~/corpora/potsdam-commentary-corpus-2.0.0/rst')
RST_TESTFILE = os.path.join(RST_ROOTDIR, '{}.rs3'.format(DOC_ID))

In [2]:
RST_TESTFILE


Out[2]:
'/home/arne/corpora/potsdam-commentary-corpus-2.0.0/rst/maz-4636.rs3'

In [3]:
with open(RST_TESTFILE) as rstfile:
    print rstfile.read()


<rst>
  <header>
    <relations>
      <rel name="antithesis" type="rst" />
      <rel name="background" type="rst" />
      <rel name="circumstance" type="rst" />
      <rel name="concession" type="rst" />
      <rel name="condition" type="rst" />
      <rel name="elaboration" type="rst" />
      <rel name="e-elaboration" type="rst" />
      <rel name="enablement" type="rst" />
      <rel name="evaluation-s" type="rst" />
      <rel name="evidence" type="rst" />
      <rel name="interpretation" type="rst" />
      <rel name="justify" type="rst" />
      <rel name="means" type="rst" />
      <rel name="motivation" type="rst" />
      <rel name="cause" type="rst" />
      <rel name="result" type="rst" />
      <rel name="otherwise" type="rst" />
      <rel name="preparation" type="rst" />
      <rel name="purpose" type="rst" />
      <rel name="restatement" type="rst" />
      <rel name="solutionhood" type="rst" />
      <rel name="summary" type="rst" />
      <rel name="unconditional" type="rst" />
      <rel name="unless" type="rst" />
      <rel name="unstated-relation" type="rst" />
      <rel name="evaluation-n" type="rst" />
      <rel name="reason" type="rst" />
      <rel name="conjunction" type="multinuc" />
      <rel name="contrast" type="multinuc" />
      <rel name="disjunction" type="multinuc" />
      <rel name="joint" type="multinuc" />
      <rel name="list" type="multinuc" />
      <rel name="restatement-mn" type="multinuc" />
      <rel name="sequence" type="multinuc" />
    </relations>
  </header>
  <body>
    <segment id="1">

Nicht erst seit gestern</segment>
    <segment id="2" parent="16" relname="evaluation-s">

Erst einmal tief durchatmen .</segment>
    <segment id="3" parent="16" relname="list">  Im benachbarten Berlin hat es keinen Anschlag mit Milzbrand-Erregern gegeben .</segment>
    <segment id="4" parent="16" relname="list">  In Bayern auch nicht .</segment>
    <segment id="5" parent="18" relname="concession">  Aber die Bilder von Männern in Mondanzügen und Atemschutzmasken haben durchaus etwas von Ausnahmezustand , ja Katastrophenalarm .</segment>
    <segment id="6" parent="18" relname="span">  Dennoch ist Panikmache unverantwortlich .</segment>
    <segment id="7" parent="6" relname="reason">  Was wir sehen , ist der spektakuläre , aber routinierte Einsatz von Profis .</segment>
    <segment id="8" parent="24" relname="span">

Zu einer Zeit , in der alles Denkbare auch machbar erscheint , ist es beruhigend zu wissen , dass die Rettungskräfte sich nicht erst seit gestern damit befassen , wie sie die Bürger vor Katastrophen schützen können .</segment>
    <segment id="9" parent="32" relname="span">  Ein eingespieltes Team von Spezialisten hält Ausrüstung und Fachleute bereit ,</segment>
    <segment id="31" parent="9" relname="purpose"> um schnell und umfassend handeln zu können .</segment>
    <segment id="21" parent="22" relname="span">  Dass sie unter normalen Umständen kaum in Erscheinung treten , ist ihrem steten Bemühen um Vorbeugung zu danken -</segment>
    <segment id="10" parent="21" relname="elaboration"> zum Beispiel im Brandschutz , wo die Feuerwehr schon in der Planung eines Gebäudes mitwirkt .</segment>
    <segment id="11" parent="28" relname="span">

Trotzdem sollte der Zivilschutz verbessert werden .</segment>
    <segment id="12" parent="27" relname="span">  Manches Vehikel im Gerätehaus gehört längst ins Technikmuseum .</segment>
    <segment id="13" parent="14" relname="circumstance">  Wenn landesweit die Polizei aufgerüstet wird ,</segment>
    <segment id="14" parent="25" relname="span"> sollten die Rettungskräfte nicht das Nachsehen haben .</segment>
    <segment id="15" parent="25" relname="evaluation-s">  Falls es doch einmal kein mieser Scherz war .</segment>
<group id="16" type="multinuc" parent="17" relname="span" />
<group id="17" type="span" parent="19" relname="background" />
<group id="18" type="span" parent="19" relname="span" />
<group id="19" type="span" parent="20" relname="span" />
<group id="20" type="span" parent="29" relname="background" />
<group id="22" type="span" parent="23" relname="joint" />
<group id="23" type="multinuc" parent="8" relname="evidence" />
<group id="24" type="span" parent="29" relname="contrast" />
<group id="25" type="span" parent="26" relname="span" />
<group id="26" type="span" parent="12" relname="elaboration" />
<group id="27" type="span" parent="11" relname="reason" />
<group id="28" type="span" parent="29" relname="contrast" />
<group id="29" type="multinuc" parent="30" relname="span" />
<group id="30" type="span" />
<group id="32" type="span" parent="23" relname="joint" />
  </body>
</rst>


In [4]:
rdg = dg.read_rs3(RST_TESTFILE)

In [5]:
rdg.node['rst:8']


Out[5]:
{'label': u'[s]:8: Zu einer Zeit , in d...',
 'layers': {'rst', 'rst:segment'},
 'rst:rel_name': 'evidence',
 'rst:segment_type': 'nucleus',
 'rst:text': u'Zu einer Zeit , in der alles Denkbare auch machbar erscheint , ist es beruhigend zu wissen , dass die Rettungskr\xe4fte sich nicht erst seit gestern damit befassen , wie sie die B\xfcrger vor Katastrophen sch\xfctzen k\xf6nnen .'}

In [6]:
rdg.node['rst:23']


Out[6]:
{'label': 'rst:group:multinuc:23',
 'layers': {'rst', 'rst:group'},
 'rst:group_type': 'multinuc',
 'rst:rel_name': 'joint',
 'rst:segment_type': 'satellite'}

In [7]:
for node, node_attrs in rdg.nodes_iter(data=True):
    if node_attrs.get('rst:group_type') == 'multinuc':
        print node, node_attrs['rst:segment_type']


rst:16 nucleus
rst:29 nucleus
rst:23 satellite

distribution of N/S over all multinuc root nodes


In [8]:
import glob
import sys
from collections import Counter

multinuc_segment_types = Counter()

for rst_file in glob.glob(os.path.join(RST_ROOTDIR, '*.rs3')):
    rdg = dg.read_rs3(rst_file)
    for node, node_attrs in rdg.nodes_iter(data=True):
        if node_attrs.get('rst:group_type') == 'multinuc':
            node_segment_type = node_attrs['rst:segment_type']  
            multinuc_segment_types[node_attrs['rst:segment_type']] += 1

In [17]:
# multinuc_segment_types

# before changing __get_segment_types()
# Counter({'nucleus': 317, 'satellite': 230})

In [9]:
multinuc_segment_types


Out[9]:
Counter({'nucleus': 280, 'satellite': 237, 'span': 30})

Issue 2: when are EDUs labeled as span?

2) das Label span wird manchmal unnachvollziehbar an Segmente vergeben. Zum Beispiel ist in maz-13758 eine EDU nämlich "rst:9" als span gelablet ist.


In [43]:
print maz_13758
print open(maz_13758).read()


/home/arne/corpora/potsdam-commentary-corpus-2.0.0/rst/maz-13758.rs3
<rst>
  <header>
    <relations>
      <rel name="antithesis" type="rst" />
      <rel name="background" type="rst" />
      <rel name="circumstance" type="rst" />
      <rel name="concession" type="rst" />
      <rel name="condition" type="rst" />
      <rel name="elaboration" type="rst" />
      <rel name="e-elaboration" type="rst" />
      <rel name="enablement" type="rst" />
      <rel name="evaluation-s" type="rst" />
      <rel name="evidence" type="rst" />
      <rel name="interpretation" type="rst" />
      <rel name="justify" type="rst" />
      <rel name="means" type="rst" />
      <rel name="motivation" type="rst" />
      <rel name="cause" type="rst" />
      <rel name="result" type="rst" />
      <rel name="otherwise" type="rst" />
      <rel name="preparation" type="rst" />
      <rel name="purpose" type="rst" />
      <rel name="restatement" type="rst" />
      <rel name="solutionhood" type="rst" />
      <rel name="summary" type="rst" />
      <rel name="unconditional" type="rst" />
      <rel name="unless" type="rst" />
      <rel name="unstated-relation" type="rst" />
      <rel name="evaluation-n" type="rst" />
      <rel name="reason" type="rst" />
      <rel name="" type="rst" />
      <rel name="conjunction" type="multinuc" />
      <rel name="contrast" type="multinuc" />
      <rel name="disjunction" type="multinuc" />
      <rel name="joint" type="multinuc" />
      <rel name="list" type="multinuc" />
      <rel name="restatement-mn" type="multinuc" />
      <rel name="sequence" type="multinuc" />
    </relations>
  </header>
  <body>
    <segment id="1">

Keine Garantie</segment>
    <segment id="10" parent="22" relname="circumstance">

Euphorische Beifallsstürme gab es in Fröhden nicht für die Dorferneuerungsplanung .</segment>
    <segment id="2" parent="22" relname="span">  Das war auch kaum zu erwarten ,</segment>
    <segment id="12" parent="21" relname="span"> handelt es sich doch um ein Gemeinschaftswerk ,</segment>
    <segment id="20" parent="12" relname="e-elaboration"> an dem die Einwohner mitgewirkt haben .</segment>
    <segment id="3" parent="23" relname="span">  Deshalb blieben auch kaum Fragen offen ,</segment>
    <segment id="13" parent="3" relname="e-elaboration"> zumindest nicht solche , die die Gestaltung der beiden Jüterboger Ortsteile betrifft .</segment>
    <segment id="4" parent="26" relname="span">

Das Interesse an der Planung war groß ,</segment>
    <segment id="14" parent="4" relname="evidence"> die Beteiligung an den Arbeitskreisen hat es gezeigt .</segment>
    <segment id="5" parent="27" relname="span">  Doch die Freude hält sich in Grenzen ,</segment>
    <segment id="15" parent="5" relname="cause"> denn inzwischen weiß jeder , dass die Fördermittelgießkanne nur noch tröpfchenweise austeilt .</segment>
    <segment id="6" parent="28" relname="list">  Wer auf das Ja-Wort aus Brieselang warten kann ,</segment>
    <segment id="16" parent="28" relname="list"> keine Scheu vor seitenlangen Fragebögen hat</segment>
    <segment id="17" parent="28" relname="list"> und in Kauf nimmt , dass er wahrscheinlich nicht billiger wegkommt , als wenn er nach eigenen Vorstellungen die Fassade gestrichen hätte -</segment>
    <segment id="18" parent="29" relname="span"> dem kann bescheinigt werden , dass ihm sein Dorf und dessen Erscheinungsbild am Herzen liegt .</segment>
    <segment id="7" parent="30" relname="span">  Schweren Herzens wird sich die Stadt von ihrem Geld trennen ,</segment>
    <segment id="19" parent="7" relname="circumstance"> wenn es nämlich darum geht , die Eigenanteile für bestimmte Vorhaben zur Verfügung zu stellen .</segment>
    <segment id="8" parent="9" relname="reason">

Die Dorferneuerungsplanung ist längst keine Garantie mehr für grenzenlosen Geldsegen .</segment>
    <segment id="9" parent="11" relname="span">  So könnte es passieren , dass viele schöne Vorhaben nur Visionen bleiben .</segment>
<group id="21" type="span" parent="2" relname="reason" />
<group id="22" type="span" parent="24" relname="span" />
<group id="23" type="span" parent="25" relname="span" />
<group id="24" type="span" parent="23" relname="reason" />
<group id="25" type="span" parent="32" relname="background" />
<group id="26" type="span" parent="27" relname="concession" />
<group id="27" type="span" parent="32" relname="span" />
<group id="28" type="multinuc" parent="18" relname="condition" />
<group id="29" type="span" parent="31" relname="joint" />
<group id="11" type="span" parent="32" relname="summary" />
<group id="30" type="span" parent="31" relname="joint" />
<group id="31" type="multinuc" parent="27" relname="elaboration" />
<group id="32" type="span" parent="33" relname="span" />
<group id="33" type="span" />
  </body>
</rst>


In [44]:
from discoursegraphs.readwrite.rst import get_edus

edu_segment_types = Counter()

for rst_file in glob.glob(os.path.join(RST_ROOTDIR, '*.rs3')):
    rdg = dg.read_rs3(rst_file)
    for edu_node_id in get_edus(rdg):
        edu_segment_types[rdg.node[edu_node_id]['rst:segment_type']] += 1

edu_segment_types
# before changing __add_segment()
# Counter({'nucleus': 1395, 'satellite': 1117, 'span': 330, 'isolated': 176})


Out[44]:
Counter({'nucleus': 1395, 'satellite': 1117, 'span': 330, 'isolated': 176})

In [ ]:
# find docs w/ least # of EDUs

from collections import defaultdict

edu_count = defaultdict(list)

for rst_file in glob.glob(os.path.join(RST_ROOTDIR, '*.rs3')):
    rdg = dg.read_rs3(rst_file)
    edu_count[len(get_edus(rdg))].append(rst_file)

In [48]:
print edu_count.keys()
edu_count[11]


[11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
Out[48]:
['/home/arne/corpora/potsdam-commentary-corpus-2.0.0/rst/maz-6539.rs3',
 '/home/arne/corpora/potsdam-commentary-corpus-2.0.0/rst/maz-1818.rs3',
 '/home/arne/corpora/potsdam-commentary-corpus-2.0.0/rst/maz-7220.rs3']

In [49]:
print open('/home/arne/corpora/potsdam-commentary-corpus-2.0.0/rst/maz-6539.rs3').read()


<rst>
  <header>
    <relations>
      <rel name="antithesis" type="rst" />
      <rel name="background" type="rst" />
      <rel name="circumstance" type="rst" />
      <rel name="concession" type="rst" />
      <rel name="condition" type="rst" />
      <rel name="elaboration" type="rst" />
      <rel name="e-elaboration" type="rst" />
      <rel name="enablement" type="rst" />
      <rel name="evaluation-s" type="rst" />
      <rel name="evidence" type="rst" />
      <rel name="interpretation" type="rst" />
      <rel name="justify" type="rst" />
      <rel name="means" type="rst" />
      <rel name="motivation" type="rst" />
      <rel name="cause" type="rst" />
      <rel name="result" type="rst" />
      <rel name="otherwise" type="rst" />
      <rel name="preparation" type="rst" />
      <rel name="purpose" type="rst" />
      <rel name="restatement" type="rst" />
      <rel name="solutionhood" type="rst" />
      <rel name="summary" type="rst" />
      <rel name="unconditional" type="rst" />
      <rel name="unless" type="rst" />
      <rel name="unstated-relation" type="rst" />
      <rel name="evaluation-n" type="rst" />
      <rel name="reason" type="rst" />
      <rel name="" type="rst" />
      <rel name="conjunction" type="multinuc" />
      <rel name="contrast" type="multinuc" />
      <rel name="disjunction" type="multinuc" />
      <rel name="joint" type="multinuc" />
      <rel name="list" type="multinuc" />
      <rel name="restatement-mn" type="multinuc" />
      <rel name="sequence" type="multinuc" />
    </relations>
  </header>
  <body>
    <segment id="1">

Riesenstaatsmann</segment>
    <segment id="8" parent="14" relname="preparation">

Alles hängt wieder einmal mit allem zusammen .</segment>
    <segment id="2" parent="13" relname="span">  Der Kanzler gibt seinen Berliner Genossen den entscheidenden Fingerzeig in Richtung rot-gelb-grüner Ampel-Koalition ,</segment>
    <segment id="9" parent="2" relname="reason"> weil er sich die Liberalen als möglichen Koalitionspartner für die Bundestagswahl im kommenden Jahr warmhalten möchte .</segment>
    <segment id="3" parent="4" relname="span">  Und FDP-Luftikus Jürgen W. Möllemann bereist seinerseits schon jetzt eifrig den Nahen Osten ,</segment>
    <segment id="10" parent="3" relname="purpose"> um für diesen Fall gerüstet zu sein und sich als neuer liberaler Außenminister zu empfehlen .</segment>
    <segment id="5" parent="15" relname="conjunction">  &quot; Riesenstaatsmann Mümmelmann &quot; , wie Franz-Josef Strauß den schnauzbärtigen Fallschirmspringer aus Münster einmal titulierte , ist auch schon voll im Geschäft</segment>
    <segment id="11" parent="15" relname="conjunction"> und wird nicht müde , Israels Politik der &quot; präventiven Liquidierungen &quot; als &quot; Staatsterrorismus &quot; zu geißeln .</segment>
    <segment id="6" parent="12" relname="concession">  Unter rechtsstaatlichen Gesichtspunkten sollte diese Methode der Hinrichtungen auf Verdacht in der Tat besser nicht Schule machen ,</segment>
    <segment id="12" parent="16" relname="span"> doch ist ein Möchtegern-Chefdiplomat womöglich besser beraten , nicht schon vor Amtsantritt verbrannte Erde ausgerechnet in Israel zu hinterlassen .</segment>
    <segment id="7" parent="16" relname="reason">  Das mit Glück und einigem Geschick von Außenminister Joschka Fischer erarbeitete Gewicht Deutschlands in der Krisenregion sollte auch ein Oppositionspolitiker nicht leichtfertig verspielen .</segment>
<group id="13" type="span" parent="14" relname="conjunction" />
<group id="14" type="multinuc" parent="19" relname="span" />
<group id="4" type="span" parent="14" relname="conjunction" />
<group id="15" type="multinuc" parent="17" relname="evaluation-n" />
<group id="16" type="span" parent="17" relname="span" />
<group id="17" type="span" parent="18" relname="span" />
<group id="18" type="span" parent="20" relname="span" />
<group id="19" type="span" parent="18" relname="background" />
<group id="20" type="span" />
  </body>
</rst>


In [41]:
maz_13758 = os.path.join(RST_ROOTDIR, 'maz-13758.rs3')
rdg = dg.read_rs3(maz_13758)
for edu_node_id in get_edus(rdg):
    print edu_node_id, rdg.node[edu_node_id]['rst:segment_type']


rst:1 isolated
rst:10 satellite
rst:2 nucleus
rst:12 nucleus
rst:20 satellite
rst:3 nucleus
rst:13 satellite
rst:4 nucleus
rst:14 satellite
rst:5 nucleus
rst:15 satellite
rst:6 nucleus
rst:16 nucleus
rst:17 nucleus
rst:18 nucleus
rst:7 nucleus
rst:19 satellite
rst:8 satellite
rst:9 span

Issue 3: are all root nodes labeled as spans?


In [27]:
for rst_file in glob.glob(os.path.join(RST_ROOTDIR, '*.rs3')):
    rdg = dg.read_rs3(rst_file)
    group_type = rdg.node[rdg.root]['rst:group_type']
    if group_type != 'span':
        print os.path.basename(rst_file), group_type


maz-2316.rs3 multinuc
maz-18912.rs3 multinuc
maz-16353.rs3 multinuc
maz-17242.rs3 multinuc
maz-4794.rs3 multinuc
maz-9612.rs3 multinuc
maz-4959.rs3 multinuc
maz-19012.rs3 multinuc
maz-17953.rs3 multinuc
maz-10205.rs3 multinuc
maz-8981.rs3 multinuc
maz-12473.rs3 multinuc
maz-3277.rs3 multinuc
maz-15545.rs3 multinuc
maz-6193.rs3 multinuc
maz-4282.rs3 multinuc
maz-17254.rs3 multinuc
maz-4031.rs3 multinuc
maz-18712.rs3 multinuc
maz-00001.rs3 multinuc
maz-13125.rs3 multinuc
maz-7220.rs3 multinuc
maz-12510.rs3 multinuc
maz-13153.rs3 multinuc

In [ ]: