Uppgift 2: Grammatisk analys

I denna uppgift kommer du att använda Språkbankens annoteringslaboratorium och NLTK för att studera hur datorn automatiskt kan analysera ordklasser och satsdelar i meningar.

Morfologisk analys och disambiguering

Gå till websidan som innehåller Språkbankens annoteringslaboratiorium. Här kan du analysera svensk text med ett antal språkteknologiska verktyg.

Skriv in nedanstående mening i den stora textrutan, och tryck därefter på knappen Kör! längst ned till höger.

Kör en enkel mening och observera ordklass och morfologisk analys. För muspilen över ordklasserna i grafen. Kolla på listan över vilka böjningar som finns.

Låt oss spela en glad låt!

När du tryck på knappen tar det några sekunder, och sedan kommer analysen upp nedanför knappen.

Överst visas analysen grafiskt i ett grammatiskt träd. Ovanför varje ord kan du se vilka ordklasser som analysprogrammet har tilldelat varje ord. För muspilen över ordklassetiketten så kan du se vad etiketterna betyder, t.ex. att NN betyder substantiv etc.

Under trädet visas analysen i en mer detaljerad tabell. Den andra kolumnen (msd) visar en mer detaljerad morfologisk analys. Även här kan du få mer information genom att föra muspilen över etiketten, t.ex. att VB.PRS.AKT betyder verb i presens aktiv. På denna sida finns en lista över alla böjningar som används.

Den tredje kolumnen visar ordets grundform, t.ex. att dricker kommer av dricka.

I nedanstående meningar så finns det olika tvetydigheter när det gäller grundformen. Kan du gissa varför Annoteringslabbet kan gissa grundformen för de två olika koppar men inte för de två fiskarna? Tips: du kan skriva in alla tre meningarna samtidigt om du vill.

Mina koppar är gjorda av koppar.

Fiskarna styrde sin båt in i hamn. 

De färska fiskarna såldes sedan i fiskhallen.

Undersök ordklassanalysen av ordet låg följande tre fall. Vad tycker du om resultatet? Kan du gissa vad det beror på?

Pelle låg på sin säng.

Sängen var alldeles för låg.

Rummet där han sov låg i ett litet hus.

Om du vill kan du söka i Språkbankens sökverktyg Korp efter rev som substantiv. (Fråga övningsledaren om hjälp om du behöver instruktioner.) Sök därefter efter en rev eller ett rev och kommentera resultatet.

Syntaktisk analys

Skriv in nedanstående mening i annoteringslabbet och kör analysen.

Gustav dricker kaffe varje morgon.

För muspilen över etiketterna på de pilar som går mellan orden. Här kan du se de olika grammatiska relationerna som finns i meningen, t.ex. att Gustav fungerar som subjekt (SS) i meningen.

Studerar hur verktygen analyserar följande meningar. Vad tycker du om analyserna?

Jag såg en hund på gatan. Jag såg en hund, på gatan.

I Göteborg bor det glada studenter och lärare.

Undersök följande tre meningar. Varför tror du att den syntaktiska analysen har gått illa i det första och tredje fallet men inte i det andra?

Jag såg en såg

Jag såg en såg.

Rummet där han sov låg i ett litet hus.

Här är ytterligare tre meningar att undersöka. Program som analyserar grammatik brukar ha en del svårigheter med pilar som korsar varandra (så kallade ickeprojektiva relationer). Om du funderar på den sista av de tre meningarna så inser du kanske att den också borde ha haft en korsande pil (från läst till boken), men det har inte analysverktyget klarat av.

Vem litar du på?

Vad har du gjort i skolan?

Den boken känner jag ingen som har läst.

Ordklassanalys med NLTK

Nu ska du i stället använda Python för att avgöra ordklassen för ord i meningar.

Vi börjar med att analysera en engelsk mening eftersom NLTK innehåller färdiga engelskspråkiga ordklassmärkningprogram. Skriv in följande kommandon i en Python-fil eller direkt i Python. Om detta är oklart, be handledaren om hjälp.

import nltk

text = nltk.word_tokenize("They refuse to permit us to obtain the refuse permit")

nltk.pos_tag(text)

De symboler som används för de engelska ordklasserna finns beskrivna t.ex. här.

Hämta en bit av Stockholm-Umeå-korpusen (SUC) här och spara filen i din arbetskatalog. Titta på hur filen ser ut.

Hämta denna Python-fil och lägg den i samma katalog. Skriv därefter följande kommandon:

from tagged_corpus import *
meningar = read_tagged_corpus("suc_liten.tagged")

Nu kan du se hur första meningen ser ut:

print meningar[0]

Vi delar in korpusen i två delar:

ena_halvan = meningar[:10000]
andra_halvan = meningar[10000:]

Vi konstruerar tre olika ordklassmärkare med hjälp av NLTK:

enkel_taggare = nltk.DefaultTagger('NN')
taggare1 = nltk.UnigramTagger(ena_halvan, backoff=enkel_taggare)
taggare2 = nltk.BigramTagger(ena_halvan, backoff=taggare1)

Vi ser hur våra tre ordklassmärkare klarar en testmening.

testmening = "Vi bar hem veden och sedan sov vi under bar himmel .".split()

print enkel_taggare.tag(testmening)
print taggare1.tag(testmening)
print taggare2.tag(testmening)

Slutligen utvärderar vi genom att analysera alla meningar i den andra halvan av SUC. Vilken av de tre fungerar bäst?

print enkel_taggare.evaluate(andra_halvan)
print taggare1.evaluate(andra_halvan)
print taggare2.evaluate(andra_halvan)