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

Hdrug

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

  1. 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.
  2. 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.

  3. 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.

  4. 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.

  5. 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