Project Tekstanalyse LIX017P05

In dit college wordt gewerkt aan een gezamenlijk project op het gebied van de tekstanalyse met behulp van eenvoudige toepassingen uit de taaltechnologie. Het doel van het college is drieledig:

Details

Waardering Opdrachten

Te vinden op Nestor.

Weekoverzicht

Week 1: 14 april

Inleiding. Doel en opzet van het college.

Het onderwerp van het college van dit jaar is: het vinden van woorden met een vergelijkbare betekenis. Voorbeelden.

Grote lijn:

Context:

Syntactische informatie:

Resources:

Opdrachtenset 1: syntactische annotatie en werken met DACT. Inleveren via Nestor voor 5 mei.

  1. Gebruik DACT op Lassy Klein voor het beantwoorden van de volgende vragen. Geef steeds ook kort aan hoe je het antwoord hebt verkregen, maar vergeet niet het antwoord zelf ook te geven.
    1. Hoeveel enkelvoudige zelfstandig naamwoorden zijn er? Tel hierbij geen eigennamen mee.
    2. Welk deel van deze naamwoorden zijn zijdig, en welk deel onzijdig. Zijn er ook gevallen die noch zijdig, noch onzijdig zijn? Kun je iets over deze gevallen zeggen?
    3. Hoeveel verschillende voorzetsels zijn er? Welke drie voorzetsels komen het vaakst voor?
    4. Werkwoorden komen in verschillende vorm voor, zoals persoonsvorm, voltooid deelwoord etc. Dit onderscheid wordt bij werkwoorden gerepresenteerd door het attribuut wvorm. Welke vier verschillende waardes kan dit attribuut krijgen? Leg kort uit wat de vier waardes betekenen.
    5. Hoe onderscheidt het corpus bij persoonsvormen de tegenwoordige tijd van de verleden tijd? Welke tijd komt vaker voor? Behalve tegenwoordige en verleden tijd is er nog een derde mogelijkheid, die met de waarde conj wordt aangegeven. Wat is dit?
    6. Bij bijvoeglijke naamwoorden worden traditioneel de trappen van vergelijking onderscheiden, zoals warm, warmer, warmst; koud, kouder, koudst. Hoe worden deze vormen in het corpus onderscheiden, en hoe vaak komen de verschillende "trappen" voor?
    7. Welke woordklasse (zoals gegeven door de waarde van het attribuut pt) telt de minste woorden?
    8. Welke rollen (@rel) kunnen naamwoordgroepen (@cat="np") zoal krijgen?
    9. Hoe vaak komt het werkwoord onderbreken voor met een lijdend voorwerp, en hoe vaak met een onderwerp?
    10. Welke vijf werkwoorden komen het vaakst voor met zowel een onderwerp, lijdend voorwerp, en een meewerkend voorwerp?
    11. Welke vijf werkwoorden komen het vaakst voor met een voorzetselvoorwerp?
    12. Welke vijf voorzetsels komen het vaakst voor als hoofd van een voorzetselvoorwerp?
    13. Welke rollen kunnen PP's (@cat="pp") krijgen indien ze bij een werkwoord horen (../node[@rel="hd" and @pt="ww"])?

Week 2: 21 april: Pasen

Geen college op maandag.

Week 3: 28 april

Tips

Complexere syntactische constructies.

Week 4: 5 mei: Bevrijdingsdag

5 mei is het gebouw dicht, dus geen college!

Opdrachtenset 2: syntactische annotatie voor gevorderden. Inleveren via Nestor. Deadline aangepast: 19 mei.

  1. Coordinatie. Achtergrondinformie: Lassy syntactische annotatie, hoofdstuk 4.
    1. Hoeveel zinnen in het Lassy corpus bevatten een nevenschikking?
    2. Bij hoeveel gevallen van nevenschikking is er precies één coordinator? Hint: je kunt de XPATH-functie count() gebruiken.
    3. Wat is het hoogst aantal coordinatoren binnen een nevenschikking?
    4. Welke coordinator komt het vaakst voor aan het begin van een nevenschikking? Hint: om aan te geven dat een knoop aan het begin van een woordgroep voorkomt, kun je eisen dat het attribuut begin van die knoop dezelfde waarde heeft als het attribuut begin van de moederknoop. Dit werkt alleen indien je de waarde van deze attributen met de functie number() converteert naar een getalswaarde. Dus je query bevat zoiets als: number(@begin)=../number(@begin).
    5. In een nevenschikking is het vaak zo, dat de delen van de nevenschikking van dezelfde categorie zijn. Je zegt wel "appels en peren", en niet "appels en blij". We beperken ons eerst tot nevenschikking van losse woorden. Hoe vaak bestaat een nevenschikking precies uit drie woorden, zoals in het voorbeeld "appels en peren"?
    6. Uitgaande van deze "appels en peren"-nevenschikking - hoe vaak komt het voor dat de woorden van de nevenschikking niet dezelfde woordsoort (@pt) hebben?
  2. WH-vragen. Achtergrondinformatie: Lassy syntactische annotatie, hoofdstuk 3.
    1. Wat is de verhouding in het corpus van directe WH-vragen en declaratieve hoofdzinnen?
    2. We bekijken het vraagwoord-deel van de directe WH-vragen. Hoe vaak is dit deel een woordgroep (en dus niet een enkel woord)? Geef de eerste twintig van deze woordgroepen.
    3. Probeer de volgende query:
      //node[not(@pt or @cat) and @index=//node[@rel='whd' and ../@cat='whq']/@index]
      Leg uit welke knopen door deze query worden geidentificeerd. Gebruik deze query om de vraag te beantwoorden of het onderwerp van een zin vaker bevraagd wordt dan het lijdend voorwerp.
    4. We bekijken nu de WH-vragen waarbij het vraagwoordeel bestaat uit het woord (@lemma) 'wie'. Geef een frequentie-overzicht van de rollen (@rel) die het vraagwoord speelt in de rest van de zin. Hoe verhoudt deze verdeling zich tot de verdeling voor het lemma 'wat'?
  3. Betrekkelijke bijzinnen. Achtergrondinformatie: Lassy syntactische annotatie, hoofdstuk 3.
    1. Hoeveel betrekkelijke bijzinnen bevat het corpus?
    2. Bekijk het relatieve deel (@rel='rhd') van de betrekkelijke bijzinnen, waarbij dit deel uit slechts één woord bestaat. Geef de frequenties van de waarde van het attribuut @postag.
    3. Als je de vorige vraag goed hebt beantwoord, komt ook de waarde VG(onder) in dit lijstje voor (7 maal). Zoek in de documentatie op, wat deze woordsoort betekent. Wat kun je zeggen over deze voorbeelden?
    4. Nu beperken we ons tot betrekkelijke bijzinnen die gemaakt worden met het betrekkelijk voornaamwoord 'die'. Welke rol speelt het betrekkelijk voornaamwoord het vaakst in de rest van de zin?
    5. In het Nederlands combineer je enkelvoudige het-woorden met het betrekkelijk voornaamwoord 'dat', en in andere gevallen gebruik je het betrekkelijk voornaamwoord 'die'. Dus: "het meisje dat ik gekust heb, de jongen die ik gekust heb, de kinderen die ik gekust heb", etc. Formuleer queries om te kijken of er in het corpus tegenvoorbeelden op deze regel voorkomen.

Week 5: 12 mei

Het werken met de treebank vanuit Python.

  1. library alpinocorpus om treebanks in te lezen (alpinocorpus op github)
  2. library etree from lxml om xml data te manipuleren, inclusief XPath (lxml homepage)

Om alpinocorpus en lxml te kunnen gebruiken, kun je het beste de volgende twee environment variabelen definieren:

export PATH=/net/aps/64/bin:$PATH
export PYTHONPATH=/net/aps/64/lib/python3.1

Voorbeeld-script 1: lees een corpus en print per zin alle lemma's:

#!/usr/bin/env python3.2
#
#
import io, sys
import alpinocorpus
from lxml import etree

if len(sys.argv) == 1:
    sys.stderr.write('\nUsage: {} filename(s)\n\n'.format(sys.argv[0]))
    sys.exit()

for filename in sys.argv[1:]:
    reader=alpinocorpus.CorpusReader(filename)
    for file in reader.entries():
        xml = reader.read(file.name())

        # work-around for silly limitation of lxml
        xml = xml.encode('utf-8')

        tree = etree.fromstring(xml)

        for node in tree.iter():
            lemma = node.get('lemma') 
            if lemma:
                print(lemma)

Opdrachtenset 3: werken met treebanks vanuit Python. Inleveren via Nestor vóór 26 mei. Inleveren via Nestor.

  1. Uitgaande van voorbeeld-script 1:
    1. maak een variant van dit script waarbij je alleen die lemma's print waarvoor geldt dat ze als hoofd optreden (dus het attribuut rel heeft als waarde hd.
    2. maak een variant van dit script waarbij je alleen die lemma's print waarvoor geldt dat de eerste letter van het lemma gelijk is aan de laatste letter.
    3. maak een variant van dit script waarbij je alleen het langste lemma van het hele corpus print.
    4. maak een variant van dit script waarbij je de lemma's niet print, maar in een data-structuur bijhoudt. Per lemma houd je bij hoe vaak je dat lemma hebt gezien. Uiteindelijk print je de tien meest frequente lemma's. Achtergrond: hoofdstuk 11.6 van het Python-boek van John Zelle.

    Als het werken met het hele Lassy corpus te langzaam is, kun je om je script(s) te testen ook eerst werken met een klein corpus:

    /net/corpora/cdb.dact
    
  2. Hier is een veel uitgebreider script. In dit script worden steeds hoofden geprint met de bijbehorende complementen. Pas dit script toe op het Lassy corpus en bewaar de resultaten in een bestand. Beantwoord op basis van dit bestand de volgende vragen. Je kunt hiervoor kiezen of je met Unix utilities wilt werken, of (eenvoudige) Python programmaatjes wilt schrijven.
    1. Maak een frequentie-overzicht van alle lemma's die voorkomen als obj1 bij het voorzetsel "zonder".
    2. Maak een frequentie-overzicht van alle lemma's die voorkomen als obj1 bij het werkwoord "drinken".
    3. Maak een frequentie-overzicht van alle lemma's die voorkomen als mod bij "bepaling".
  3. Schrijf een variant van het tweede voorbeeld-script zodat je paren van lemma's extraheert die samen in een nevenschikking voorkomen. Dus, voor een zin zoals "de lekkere appels en overrijpe peren" extraheer je "appel peer".

Afspraken maken voor de eindopdracht

  1. Wat moet het programma precies kunnen: op basis van een in te geven zelfstandig naamwoord of eigennaam presenteert het programma de tien meest lijkende woorden.
    • Gebruik de techniek zoals in week 1 uitgelegd: een woord wordt gerepresenteerd als een vector waarbij elke positie in de vector een context-eigenschap representeert, zoals bijvoorbeeld "aantal keren dat het woord optreedt als lijdend voorwerp van het werkwoord schilderen", etc. Om de meest lijkende woorden te kunnen bepalen moet je de afstand tussen twee vectoren bepalen. Je mag zelf kiezen welke afstandmaat je wilt gebruiken. De tien woorden met de kortste afstand presenteer je als de meest lijkende woorden.
    • Je mag zelf kiezen welke context-eigenschappen je wilt gebruiken. Tip: vermoedelijk wil je alleen context-eigenschappen gebruiken die regelmatig voorkomen. Bijvoorbeeld, het voorkomen als lijdend voorwerp bij een werkwoord is een goede context-eigenschap voor werkwoorden die "vaak genoeg" voorkomen.
    • Als je meer data gebruikt om de vectoren te "vullen", zullen de prestaties van het programma vermoedelijk beter worden. Er is heel veel data beschikbaar. Je kunt *.dact en *.dz bestanden gebruiken. Bijvoorbeeld, de hele Nederlandse wikipedia:
      /net/aps/64/src/Alpino/Treebank/Machine/NLWIKI20110804/DACT/wik_part*.dact
      
  2. Vereisten:
    1. Demonstratie op de afsluitende bijeenkomst, aan de hand van een aantal door de docent te geven inputs. Dit zijn zelfstandige naamwoorden en eigennamen die steeds uit 1 woord bestaan.
    2. Korte rapportage (max 3 pagina's) waarin je uitlegt:
      1. Wat je hebt gedaan
      2. Hoe je het hebt gedaan
      3. Welke data je precies hebt gebruikt
      4. Welke context-eigenschappen je precies hebt gebruikt
      5. Welke afstandsmaat je precies hebt gebruikt
      6. Wie verantwoordelijk was voor wat
      De rapportage moet worden ingeleverd via Nestor, deadline: zondag 15 juni

Week 6: 19 mei

Bespreking opdrachtenset 3. Bespreking van de voortgang. Mogelijkheid tot het stellen van vragen etc.

Week 7: 26 mei

Bespreking van de voortgang. Mogelijkheid tot het stellen van vragen etc.

Afsluitende bijeenkomsten: LET OP

De afsluitende bijeenkomsten van elke groep met de docenten worden gepland op maandag 16 juni

Waardering opdrachten