Opgave 3
Chart Parsing
Deadline: vrijdag 17 maart
In deze opgave maak je een hulpmiddel voor het zoeken naar taalkundige
patronen in een tekst die reeds voorzien is van `part of speech tags' (Gsearch is een voorbeeld van zo'n pakket). Als
voorbeeld gebruiken we het Eindhoven corpus. Materiaal in dit corpus ziet
er als volgt uit:
Dit Pron(aanw,neut,zelfst)
in Prep(voor)
verband N(soort,ev,neut)
met Prep(voor)
de Art(bep,zijd_of_mv,neut)
gemiddeld Adj(adv,stell,onverv)
langere Adj(attr,vergr,verv_neut)
levensduur N(soort,ev,neut)
van Prep(voor)
de Art(bep,zijd_of_mv,neut)
vrouw N(soort,ev,neut)
. Punc(punt)
Een gebruiker wil in tekst van deze vorm bijvoorbeeld alle NPs vinden. Hiervoor
zou je een grammatica kunnen schrijven die bijvoorbeeld een Art gevolgd door
een N als een NP herkent.
Met een chart-parser kun je vervolgens alle constituenten vinden in de input
die een NP vormen. Met behulp van de chart kun je de input vervolgens aan
de gebruiker tonen met haakjes om de NPs.....
Het corpus
Het corpus is voor deze opgave omgezet in Prolog. Zinnen zijn gecodeerd als
zin(Nr,LijstTags), waar LijstTags een lijst van (Part of Speech) Tags is,
gecodeerd als Prolog termen, met als laatste argument altijd het woord
zelf.
zin(1,[art(bep,zijd_of_mv,neut,'De'),
n(soort,mv,neut,verzekeringsmaatschappijen),
v(trans,ott,of_123,mv,verhelen),
adv(gew,geen_func,stell,onverv,niet),
....]).
Het corpus (1000 zinnen) staat in cdb.pl. In cdb.tag en cdb.zinnen vind je delen van hetzelfde materiaal in een formaat dat beter leesbaar is voor mensen.
De grammatica
De chart-parser (zie beneden) werkt voor grammatica's waar regels de vorm
rule(Moeder,LijstDochters) hebben, bv.
rule(np, [det,n]).
Omdat de input al voorzien is van categorieen hoef je niet een echt woordenboek
te maken. Het enige wat je moet definieren (als
lex(Categorie,Woord) ) is
welke categorieen uit de grammatica met welke POS tags corresponderen,
bv.
lex(det,art(_,_,_,_)).
Een determiner kan dus een POS tag art (voor artikel) met 4 argumenten
zijn.
De Parser
De parser is een shift-reduce chart-parser die met behulp van assert een
chart opbouwt. Items in de chart hebben de vorm constituent(Begin,End,Category),
bv
constituent(0, 2, np).
Je roept de parser aan met
:- parse(Input).
waar Input een lijst Tags is.
Je kunt een overzicht krijgen van alle constituenten door na parsing
:- listing(constituent).
te doen.
Een gemakkelijke manier om de parser aan te roepen en het resultaat te
bekijken is via het predikaat test:
test(N) :-
zin(N,Zin),
parse(Zin),
pprint_zin(Zin),
listing(constituent).
pprint_zin schrijft de woorden uit de zin (altijd het laatste
argument van een Tag) naar het scherm.
De parser staat in parser.pl
De Opdracht
- Voeg enkele regels en een `lexicon' voor constituenten van de
categorie NP en PP toe aan de voorbeeldregels in parser.pl.
- Voeg een predicaat find(Cat,Nr) aan de parser toe, dat
de begin- en eindposities van alle constituenten van categorie Cat in zin
Nr naar het scherm schrijft.
- Voeg een predicaat match(Cat,Nr) toe, dat de zin Nr op het
scherm zet, met haakjes rond de constituenten van categorie Cat. Bv.
[Het loodswezen] ressorteert onder [de Marine] waardoor [de loodsen] ambtenaren zijn .
- N.b. Wanneer op positie N 2 constituenten met categorie Cat beginnen,
geef je alleen de haakjes voor de langste constituent (longest match).
- Voeg een predicaat search(Cat) toe, dat voor iedere zin in
het corpus onderzoekt of er constituenten van categorie Cat aanwezig zijn.
Zo ja, dan produceer je output zoals match/2, maar nu geef je ook het zinsnummer.
- N.b. Wanneer een zin geen matching constituent bevat, schrijf je
die zin ook niet naar het scherm.
- Test je programma nu door regels en lex-definities toe te voegen die het mogelijk maken te zoeken naar de
volgende twee constructies (je moet dus regels schrijven die precies met onderstaande constituenten matchen, uitbreiden van de definitie van NP is niet voldoende....):
- Eigennamen. Eigennamen zijn nouns met het kenmerk eigen in het corpus. Merk op dat eigennamen uit
meer dan 1 woord kunnen bestaan. (bv.
Met het concert van woensdag door het Concertgebouworkest onder Eugen Jochum is voor Amsterdam de muziekwinter aangebroken )
- Werkwoordsclusters, dat wil zeggen (zinnen met daarin)
twee of meer werkwoorden achter elkaar
(bv. Besloten werd de resultaten van het jachtseizoen 1969-1970 af
te wachten om zich dan tijdens de algemene vergadering die in mei
volgend jaar te Boedapest wordt gehouden , te beraden of een
verkorting van de jachttijd op de houtsnip moet worden
overwogen .).
- n.b. De reeks besloten werd in dit voorbeeld is
volgens taalkundigen geen werkwoordscluster. Je programma
mag zulke reeksen wel als werkwoordscluster aanmerken. Je hoeft dus
alleen te zoeken naar werkwoorden naast elkaar, en je hoeft geen
diepere taalkundige analyse te doen.
- N.b. je kunt natuurlijk lex-definities schrijven die naar kenmerken van een tag verwijzen.
Tips
- Gebruik write(Cat), write(' ') (of tab(1)), etc., en nl, om naar het scherm te
schrijven.
- Het predicaat extract_word(Tag,Word), kun je gebruiken om het laatste
argument van Tag te unificeren met Word (handig voor het printen van de string).
- Negatie in Prolog is \+ (bv \+ ( constituent(_,_,np) ).
Inleveren
Lever de aangepaste parser-code in, waar nodig voorzien van commentaar. Geef een voorbeeld van de output die je krijgt bij opdracht 3.5.
Deadline: vrijdag 17 maart