Opgave 5 - Generatie en vloeiendheid
Introductie
In deze opgave werken we met uitvoer van de Alpino generator. De Alpino generator gebruikt abstract dependency trees (ADTs) als invoer en genereert meerdere realisaties op basis van deze semantiek.
Gegeven zijn een aantal Prolog bestanden in het archief opgave5.tar.gz:
- lfs.pl ADTs van een collectie zinnen uit de Nederlandstalige Wikipedia.
- realizations.pl Zinnen die gegenereerd zijn op basis van de ADTs in lfs.pl
- fluency.pl Module voor het bijhouden van de meest vloeiende realisatie per ADT.
- geneval.pl Implementatie van een aantal ROUGE maten.
- start.pl Interface definities, voor het gebruik van Hdrug.
Na het downloaden van het archief kun je het uitpakken met tar:
$ tar zxf opgave5.tar.gz
$ cd opgave5
De module met realisaties is vrij groot, en het duurt meestal enige tijd om het te laden. Als je wilt kun je de module eenmalig compileren, waardoor het daarna sneller zal laden:
$ make
Hdrug
Bij deze opgave wordt Hdrug gebruikt voor het visualiseren van de ADTs en voor het printen van realisaties. Je kunt Hdrug in de directory voor deze opgave starten met:
$ hdrug -l start
Als het Hdrug commando niet gevonden kan worden, voeg dan de directory /net/aps/64/bin toe aan het pad:
$ export PATH=$PATH:/net/aps/64/bin
Hdrug zal een grafische user interface tonen, die je kunt gebruiken voor het bekijken van ADTs. Daarnaast wordt een ‘command interpreter’ getoond in de terminal waarin je Hdrug hebt gestart.
Met behulp van de command interpreter kun je een boom-representatie van een ADT bekijken met het lf commando. Het volgende commando toont bijvoorbeeld een boom voor ADT 100:
1 |: lf 100
De realisaties die gegenereerd zijn kun je bekijken met het rls commando, bijvoorbeeld:
7 |: rls 100
100|1|Salmaneser wint weliswaar de slag maar zijn opmars wordt gestuit
100|4|zijn opmars wordt gestuit maar de slag wint weliswaar Salmaneser
100|15|weliswaar gewint Salmaneser de slag maar zijn opmars wordt gestuit
100|19|de slag gewint weliswaar Salmaneser maar zijn opmars wordt gestuit
100|22|zijn opmars wordt gestuit maar Salmaneser gewint weliswaar de slag
100|24|de slag wint Salmaneser weliswaar maar z'n opmars wordt gestuit
100|25|z'n opmars wordt gestuit maar weliswaar wint Salmaneser de slag
100|26|z'n opmars wordt gestuit maar de slag wint Salmaneser weliswaar
Als je tijdens deze opgave bestanden verandert, dan kun je ze opnieuw consulteren met het rc commando:
15 |: rc start
Met het p commando kun je de command interpreter verlaten, en krijg je een SICStus prompt. Andersom kun je in SICStus met het r/0 predicaat de command interpreter starten.
ADTs
In de vorige werkcolleges heb je met dependentie structuren gewerkt. Dependency trees (DTs) drukken dezelfde structuren als een boom uit. Abstract dependency trees (ADTs) zijn dependency trees waarin woordposities en woordvervoegingen weggelaten zijn. Ze bevatten dus alleen grammaticale relaties en woordstammen. Het bestand lfs.pl bevat ADTs voor bijna 1000 zinnen uit de Nederlandse Wikipedia in de vorm van Prolog feiten. Deze feiten hebben steeds de volgende vorm:
lf(ADTNummer,Boom).
De betekenis van de dependency relations in een ADT kun je in de onderaan deze opdracht vinden.
Realisaties
Op basis van elk van de ADTs zijn alle mogelijke realisaties gegenereerd die de Alpino grammatica en lexicon toelaten. De vloeiendheid van de realisaties is vervolgens beoordeeld met een log-linear model. Dit model een veeltal aan features om de vloeiendheid van een gegenereerde zin te bepalen. De realisaties zijn in het bestand realizations.pl te vinden, en hebben de volgende vorm:
realization(ADTNummer,RealisatieNummer,Zin).
De realisaties voor een gegeven ADT zijn steeds geordend op de waarschijnlijkheid die het maximum entropy model aan de realisatie toegekend heeft.
De opdracht
- Iedereen heeft 20 ADTs toebedeeld gekregen, zie het lijstje voor de verdeling. Probeer voor elke ADT de meest vloeiende realisatie te vinden, en noteer deze in fluency.pl in de aangegeven notatie. Tip: je kunt je werk versnellen door eerst naar de ADT te kijken, en te bedenken wat je de meest vloeiende zin vindt om de semantiek uit te drukken. Daarna kun je deze zin opzoeken in het lijstje van realisaties.
Nu je voor jouw set van ADTs weet wat de beste realisatie is, kun je de realisaties gaan beoordelen. De geneval module bevat predicaten voor diverse ROUGE maten. Zo is er bijvoorbeeld het rouge_n/4 predicaat voor het berekenen van een ROUGE-N score.
Het print_rls/1 predicaat in start.pl wordt aangeroepen om de zinnen af te drukken voor het rls commando. Pas dit predicaat aan, zodat na het realisatienummer een veld met de ROUGE-2 (ROUGE-N met N=2) score van die realisatie wordt opgenomen.
Zoals gezegd is het lijstje van realisaties geordend op basis van een maximum entropy vloeiendheidsmodel. De eerste realisatie voor een ADT werd dus door het model als beste beoordeeld.
Voeg een predicaat fluency_eval/1 aan start.pl toe dat de gemiddelde ROUGE-N score berekent van elke eerste realisatie voor het lijstje van ADTs dat je behandeld hebt (als er extra informatie aan fluency.pl toegevoegd wordt, moet het natuurlijk zonder veranderingen werken). Via het argument van fluency_eval/1 wordt de gemiddelde score teruggegeven. Als de gemiddelde score 0.5 is, moet het predicaat dus op de volgende manier werken:
?- fluency_eval(OverallScore). OverallScore = 0.5 ?
Tip: Gebruik wanneer nodig predicaten uit de lists module.
Voeg daarna een Hdrug commando fe toe dat fluency_eval/1 gebruikt om de score op het scherm af te drukken. Je kunt de lf en rls commando’s als inspiratie gebruiken.
Staan de volgens jou meest vloeiende realisaties altijd op de eerste plaats? Zo niet, beschrijf twee soorten fouten die je kunt vinden, en hoe je deze op zou kunnen lossen.
Voor deze opgave lever je in:
- fluency.pl met jouw keuzes voor de meest vloeiende zinnen.
- start.pl met jouw veranderingen.
- Je antwoord op vraag 4.
Stuur dit naar: .
Overzicht dependentielabels
Dependentielabel | Omschrijving |
---|---|
APP | appositie, bijstelling |
BODY | romp (bij complementizer) |
CMP | complementizer |
CNJ | lid van nevenschikking |
CRD | nevenschikker (als hoofd van conjunctie) |
DET | determinator |
DLINK | discourse-link |
DP | discourse-part |
HD | hoofd |
HDF | afsluitend element van circumpositie |
LD | locatief of directioneel complement |
ME | maat (duur, gewicht,…) complement |
MOD | bijwoordelijke bepaling |
MWP | deel van een multi-word-unit |
NUCL | kernzin |
OBCOMP | vergelijkingscomplement |
OBJ1 | direct object, lijdend voorwerp |
OBJ2 | secundair object (meewerkend, belanghebbend, ondervindend) |
PC | voorzetselvoorwerp |
POBJ1 | voorlopig direct object |
PREDC | predicatief complement |
PREDM | bepaling van gesteldheid tijdens de handeling |
RHD | hoofd van een relatieve zin |
SAT | satelliet; aan- of uitloop |
SE | verplicht reflexief object |
SU | subject, onderwerp |
SUP | voorlopig subject |
SVP | scheidbaar deel van werkwoord |
TAG | aanhangsel, tussenvoegsel |
VC | verbaal complement |
WHD | hoofd van een vraagzin |