Oslo-korpuset består av taggede tekster, altså tekster hvor hvert enkelt ord er merket med en tagg som angir grammatisk informasjon som ordklasse, undergruppe, morfosyntaktiske trekk o.a. for akkurat dette ordet. Det er ikke gjort i en håndvending å utstyre ordene i en tekst med slike tagger. Man må benytte et automatisk, disambiguerende taggeprogram, som tidligere ikke har eksistert for norsk. Et slikt program har vi nå utviklet ved Tekstlaboratoriet, i Taggerprosjektet. Det har kostet seks årsverk, og blitt finansiert av Norges forskningsråd, Dokumentasjonsprosjektet og Tekstlaboratoriet.
Et taggeprogram skal kunne ta en hvilken som helst tekst, analysere den, og forsyne hvert eneste ord i teksten med en tagg. Spesielt viktig er det at hvert ord bare får én tagg. Selv om det er mange ord i norsk som i utgangspunktet er flertydige (homonyme), bør altså taggeren klare å finne fram til den ene riktige analysen. Står den på ordet murer, som faktisk kan betegne fire forskjellige grammatiske ord (se nedenfor), skal den klare å velge ett.
"murer" | |
"substantiv M ubestemt plural, MUR" | |
"substantiv M ubestemt plural, MURE (bot.)" | |
"substantiv M ubestemt singular, MURER" | |
"svakt verb presens, MURE" |
Det er et systematisk forhold mellom mange svake verb og bestemt form av det avledede substantivet, som i hoppet, foret osv., så det er av stor viktighet at den morfologiske taggeren selv kan disambiguere en ordform, og dermed fjerne alle tolkninger bortsett fra én. Dette må selvsagt bare kreves dersom entydiggjøringen kan skje på et solid grunnlag.
Taggeren som omtales her, er en regelbasert tagger (i motsetning til en statistisk basert tagger), mer spesielt er den en såkalt føringsbasert (Constraint-Based) tagger. Denne typen har vært utviklet ved Universitetet i Helsinki, Finland, under ledelse av Fred Karlsson. En føringsbasert tagger er en hvor det er laget lingvistisk baserte regler for hvert eneste disambigueringsvalg. Den bygger på dependensgrammatikk, hvilket i praksis vil si at taggeren ikke bygger opp fraser, men at alle valg gjøres på grunnlag av forholdet mellom enkeltord. Denne typen tagging er beskrevet i Karlsson et al., 1995, Constraint Grammar.
Her følger en kort oversikt over taggerens enkelte deler,
presentert i kronologisk rekkefølge, etter hvilke biter som
gjøres når i taggingsprosessen.
Utgangspunktet for taggingen er en ren tekstfil. Det stilles ingen
spesielle krav til utseendet på fila - den kan godt ha overskrifter (av
forskjellig format), tabeller og andre ting som kan gjøre teksten
vanskelig å tolke for en datamaskin. (Men om en tekst er kodet med f.eks.
SGML-kode, må den kjøres gjennom et program som fjerner slik kode
først.) Beskrivelsen nedenfor deler preprosessering og multitagging i to
deler av pedagogiske grunner, men det dreier seg om ett program, som benytter
mange enkeltdeler, bl.a. den leksikalske databasen og
sammensetningsanalysatoren, samt mange spesialdeler for å kunne
gjenkjenne ulike typer ord og tekst.
Et eksempel på en tekst før tagging:
Lang tradisjon I over hundre år har sportsfiskere og elveeiere
prøvd å hjelpe laksen til |
Teksten over er svært enkel. Likevel er det mange ting som må ordnes før multitaggeren trer i aksjon. Teksten må først preprosesseres:
Skill ut overskrifter
Det er viktig for taggingen
senere at teksten oppdeles på riktig måte, f.eks. at overskrifter
skilles ut. De kjennetegnes jo ofte, som over, ved at de ikke har noe sluttegn
som punktum. Fordi vi ikke vil at en overskrift skal tolkes som en del av neste
setning, må den derfor gjenkjennes. Her har vi valgt å bruke endel
formkriterier som store bokstaver, blanke linjer på begge sider, antall
ord på linja o.a. for at overskrifter skal skilles ut.
Gjenkjenn setninger
At setninger deles opp på
riktig sted, er et beslektet mål. På dette stadiet i prosessen
finnes det ikke tilgang til noen grammatisk analyse, så alle regler
må gjelde for enkeltord og bokstaver i umiddelbar nærhet av
skilletegn. Visse tegn er typiske helsetningsskilletegn (periodeskilletegn),
slik som utropstegn, spørsmålstegn, og ikke minst punktum.
Imidlertid utgjør punktum et stort problem, siden det finnes mange
tilfeller hvor punktum også finnes setningsinternt. Betrakt de
følgende setningene:
(1) Her ser vi bl.a. en fisk, en fugl og en slange.
(2) Her
har man f.eks. Jørgensen og Christensen.
(3) Dette skjedde
05.04.97.
For at helsetningene og ingenting annet skal gjenkjennes, har vi samlet inn en god del forkortelser, og laget programvare som tolker et punktum i en forkortelse annerledes enn ellers. Er forkortelsen en stor bokstav, tolkes den som egennavn. Men det viser seg at forkortelser også kan forekomme ved setningsslutt, og da ønsker man selvsagt å nettopp kjenne igjen setningsslutt:
(4) Vi kjenner leger, advokater og lingvister osv. Alle er
velutdannet.
(5) Mens leger, advokater osv. ikke kjenner seg igjen,
er det lett for oss andre.
Gjenkjenn datoer
Preprosessoren må skille datoer
(se nedenfor) fra tall, som ganske enkelt regnes som kvantifiserte uttrykk:
(6) Dette skjedde 01.01.60.
(7) Det skjedde også noe
15/9-91.
Gjenkjenn "koordinerte sammensetninger"
Noen
tekstuelle sammenstillinger av flere ord må likevel betraktes som enkle
ord. Dette gjelder nærmere bestemt sammensetninger hvor ett av leddene er
koordinert av en konjunksjon:
(8) Vi snakker om barnehage- og dagmammabarn.
(9)
Julegavene og -maten er blitt overdådige.
Gjenkjenn faste uttrykk
Vi har foretatt innsamling av
mange faste uttrykk, som går over flere ord. Der vi ønsker at de
skal betraktes som ett og samme ord, ordnes det av preprosessoren:
(10) Vi tar en sjokolade i ny og ne.
(11) Dette gjør
vi ikke i utide.
Multitaggeren tar for seg teksten ord for ord. (Faste uttrykk, koordinerte sammensetninger o.a. regnes nå som enkle ord.) Hvert ord slås opp i en fullformsordliste - altså en liste av oppslagsordene i den leksiksalske databasen samt alle deres fulle former når de er bøyd. Hvert ord gis alle muligheter som fullformsordlista gir uten at konteksten for ordet undersøkes. I tillegg kommer disse delene:
Egennavn
Egennavn gjenkjennes enkelte ganger ved at
de finnes i ordlista. For resten av navnene finner programmet ut av det
på grunnlag av store bokstaver i ord som ikke finnes i ordlista og som
gjerne ikke kommer etter punktum.
Sammensetninger
Ord som ikke finnes i den leksikalske
databasen blir forsøkt analysert som sammensetninger gjennom et eget
sammensetningsprogram. Hvis det kan analyseres som en sammensetning, vil
sisteleddet bli slått opp I fullformsordlista, og ordet gis alle tagger
derfra. Noen eksempler:
(12) laksestamme
(13) utsettingsforskrifter
Alle kan prøve multitaggeren selv ved å skrive inn en
setning eller legge ved en liten fil. Den interaktive multitaggeren ligger
på http://dina.uio.no/cgi-bin/tagger/www_mtag.
Eksempel på en multitagget tekst
Nedenfor
følger en kort del av teksten vi så ovenfor, men i multitagget
utgave.
"<lang>"
"lang" adj pos
mask fem ub ent
"lange" verb imp
<trans1>
"<tradisjon>"
"tradisjon" subst mask appell ent ub
"<$|>"
"$|" CLB
<OVERSKRIFT>
"<*i>"
"i"
prep
"<over>"
"over" prep
"<hundre>"
"hundre" det
kvant fl
"hundre" subst nøyt
appell ent ub
"hundre" subst
nøyt appell fl ub
"<år>"
"år" subst fem appell ent ub
"år" subst mask appell ent ub
"år" subst nøyt appell ent
ub
"år" subst nøyt appell
fl ub
"<har>"
"ha" verb pres
<trans6><auxp>
"<sportsfiskere>"
"sportsfisker" subst mask appell fl ub
"<og>"
"og" CLB konj
"og" adv
"og" konj
"<elveeiere>"
"elveeier" subst mask appell fl ub
"<prøvd>"
"prøve"
adj <perf-part>mask fem ub ent <trans1><trans3>
"prøve" adj
<perf-part>nøyt ub ent <trans1><trans3>
"prøve" verb perf-part
<trans1><trans3>
"<å>"
"å" inf-merke
"å" interj
"å" subst fem appell ent ub
"å" subst mask appell ent ub
"<hjelpe>"
"hjelpe" verb inf
<trans1>
"<laksen>"
"laks" subst mask appell ent be
"<til>"
"til" prep
"<å>"
"å" inf-merke
"å" interj
"å" subst fem appell ent ub
"å" subst mask appell ent ub
"<formere>"
"former" subst mask
appell fl ub
"formere" verb inf
<trans1><refl4>
"<seg>"
"seg" pron refl ent/fl akk
"sige" verb pret <intrans2>
"<I>"
"i" prep
"<norske>"
"norsk" adj pos mask
fem nøyt be ent
"norsk" adj pos
ub be fl
"norske" verb inf
<trans1>
"<elver>"
"elv" subst fem appell fl ub
"elv" subst mask appell fl ub
"<$.>"
"$." CLB <PUNKT>
Til slutt trengs den disambiguerende taggeren, som fjerner (helst) alle tagger som ikke hører hjemme i akkurat den konteksten.
Eksempel på disambiguert tekst
."<*lang>"
"lang" adj pos
mask fem ub ent
"<tradisjon>"
"tradisjon" subst mask appell ent ub
"<$|>"
"$|" CLB
<OVERSKRIFT>
"<*i>"
"i" prep
"<over>"
"over" prep
"<hundre>"
"hundre" det kvant fl
"<år>"
"år" subst
nøyt appell fl ub
"<har>"
"ha" verb pres <trans6> <auxp>
"<sportsfiskere>"
"sportsfisker" subst mask appell fl ub
"<og>"
"og" konj
"<elveeiere>"
"elveeier" subst
mask appell fl ub
"<prøvd>"
"prøve" verb perf-part
<trans1> <trans3>
"<å>"
"å" inf-merke
"<hjelpe>"
"hjelpe" verb inf
<trans1>
"<laksen>"
"laks" subst mask appell ent be
"<til>"
"til" prep
"<å>"
"å" inf-merke
"<formere>"
"formere" verb
inf <trans1> <refl4>
"<seg>"
"seg" pron refl ent/fl akk
"<i>"
"i" prep
"<norske>"
"norsk" adj pos ub be
fl
"<elver>"
"elv" subst fem
appell fl ub
"elv" subst mask appell
fl ub
"<$.>"
"$." CLB
<PUNKT>