Opgave 4 - Vragen beantwoorden
Deze opgave sluit aan bij opgave 3 en 4. In deze opgaves hebben jullie predikaten geschreven om informatie te extraheren. In deze opdracht gaan jullie de geëxtraheerde informatie gebruiken om vragen te beantwoorden.
Gegeven zijn de bestanden qa.pl, qsuite.pl, en run_alpino_qa.sh. Plaats deze bestanden in dezelfde directory als de opdracht van vorige week. De volgende bestanden zijn van belang:
- qa.pl Predikaten voor het analyseren en beantwoorden van vragen.
- qsuite.pl: Voorbeeldvragen.
Zoals in de vorige opdracht, zal Alpino gebruikt worden voor het ontleden van zinnen. Voor het gebruik van Alpino moet je eerst de ALPINO_HOME variabele instellen.
Je kunt nu Alpino starten met het volgende commando:
$ sh run_alpino_qa.sh
Dit commando zal Alpino starten, en qa.pl en qsuite.pl laden. In Alpino kun je een vraag ontleden in de command interpreter (in de terminal waar Alpino gestart is) met het asterisk (*) commando:
1 |: * Wat is de hoofdstad van Nederland ?
Let op dat je tokens moet scheiden met een spatie. Na het ontleden van een zin zul je in het linkervlak een dependency tree zien. Door het commando sdt te gebruiken kun je de daadwerkelijke dependency structure tonen. Deze zal dan in het rechtervlak van het Hdrug-scherm verschijnen.
Om de extractie van feiten te kunnen testen, kun je altijd het answer commando uitvoeren om de laatst ontleede zin te analyseren en de vraag die deze zin stelt te beantwoorden op basis van de feiten in facts.pl:
1 |: * Wat is de hoofdstad van Nederland ?
[...]
2 |: answer
Answer: 'Amsterdam'
Opdracht
In deze opdracht zul je vooral in qa.pl werken. Hier kun je predikaten toevoegen om een vraag te analyseren, en om op basis van de analyse een antwoord te zoeken. Er zijn al predikaten gedefinieerd om vragen van het type Wat is de hoofdstad van X? te beantwoorden. Zoals je kunt zien, analyseren we eerst de zinsstructuur, en gebruiken we daarna het find_answer predikaat om een antwoord te vinden.
Bij het uitbreiden van de code is de beste werkprocedure:
- Ontleed een vraag waarbij question-answering nog niet werkt.
- Bekijk met het sdt commando hoe de informatie in de dependency-structure beschikbaar is, en bedenk een zo algemeen (maar niet te algemeen) mogelijke manier om die vraag te analyseren en te beantwoorden.
- Voeg predikaten toe om de vraag te analyseren.
- Test: werkt het, is het algemeen genoeg, en werken andere gevallen nog goed?
De opdracht:
Voer het extract-all.sh script uit (sh extract-all.sh) bij de opgave van vorige week om automatisch feiten te extraheren. Als je nog niet voldoende extracties hebt om deze opgave te maken, kun je ook met de hand predikaten aan facts.pl toevoegen (let wel op dat je met de hand toegevoegde predicaten weer kwijt raakt als je extract-all.sh opnieuw draait.
Vergeet niet de module/2 definitie bovenaan facts.pl aan te passen, zodat het extra predikaat dat je vorige week hebt toegevoegd ook ge-exporteerd wordt.
Pas qa.pl aan, zodat je ook vragen met de vorm “Wanneer is X geboren?” kunt analyseren. Je kunt een aantal voorbeelden in qsuite.pl vinden.
Voeg aan facts.pl een aantal geboorteplaats-feiten toe van de vorm birth_location(Person,Location). En pas qa.pl aan zodat je vragen met de vorm “Waar is X geboren?” kunt beantwoorden. Let op: de structuur van de zin is hetzelfde als die in de vorige vraag, alleen het vraagwoord is veranderd.
Bedenk nu zelf nog een extra type feit en voeg een aantal voorbeelden toe aan facts.pl. Voeg een aantal vraagzinnen voor dit type feiten toe aan qsuite.pl, en zorg ervoor dat je programma deze vragen kan beantwoorden.
Vergeet niet de module/2 definitie bovenaan facts.pl aan te passen, zodat het extra predikaat dat je vorige week hebt toegevoegd ook ge-exporteerd wordt.
Bonus: Zorg dat je vragen met de vorm “Wie zijn in X geboren?” kunt analyseren. Voeg een aantal feiten aan facts.pl toe, zodat er meerdere mogelijke antwoorden zijn.
Voor deze opgave lever je in: qa.pl en facts.pl en qsuite.pl. Stuur je uitwerking naar: ikntv2013+opgave5@gmail.com.
Tips
- Zoals je in qsuite.pl kunt zien heeft elke zin een identifier. Je kunt een zin ontleden met het sen commando, bijvoorbeeld: sen hoofdstad1
- Je kunt de volgende zin ontleden met next en de vorige met prev.
- Als je qa.pl gewijzigd hebt, kun je het opnieuw laden (reconsult) met het rc commando: rc qa
- Je kunt een predikaat ‘tracen’ met het spy commando. De volgende keer dat het predikaat bewezen wordt, zul je automatisch een Prolog trace prompt krijgen. Bijvoorbeeld: spy fact
- Met het p commando kun je een SICStus prompt krijgen. Met het r/0 predikaat kom je weer terug in de command interpreter.