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

  1. Voeg enkele regels en een `lexicon' voor constituenten van de categorie NP en PP toe aan de voorbeeldregels in parser.pl. 
  2. 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. 
  3. 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 .

  4. 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.
  5. 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....):
    1. 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 )
    2. 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

  1. Gebruik write(Cat), write(' ') (of tab(1)), etc., en nl, om naar het scherm te schrijven. 
  2. 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).
  3. 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