Konvertere ordliste til object og matche verber

Den oprindelige plan

Jeg vil gennemføre en reduceret test, hvor jeg bruger de eksisterende lister fra HunSpell ordbogen (den kender de fleste fra deres browser og tidligere fra OpenOffice-programmerne) til at generere en liste med alle bøjninger af danske verber.

Hvorfor den her test?

Jeg har brug for at forstå de affix-regler, der er i HunSpell bedre. Ved at skrive en funktion, der bruger regelsættet til at generere forskellige bøjninger af verber ud fra grundordene i HunSpell tvinger jeg mig selv til at prøve at tage højde for de mange krinkelkroge, der er i reglerne.

Og måske er det også et vigtigt skridt på vej mod at bygge en reel dansk Part of Speech-tagger. Altså et stykke software der kan markere ordklasse (og tid) for de enkelte ord i en sætning.

Hvad har jeg lært af at gøre det?

Først og fremmest har jeg lært, at det ikke handler om at generere den fulde ordliste og så matche på den. Det er der alt for mange ord til. Det vidste jeg måske godt, men det blev meget tydeligt af at prøve bare med verber, der starter med A. Der er sygt mange ord lige pludselig.

I virkeligheden skal POS-taggeren gå en anden vej. Her gælder det om at matche med det mest sandsynlige scenarie først. Og så kun, hvis du ikke finder et match i de statiske ordlister begynder vi at lede efter et match ved at bøje ord (jeg er ikke 100 % sikker, men den proces hedder vist smoothing, når man POS-tagger).

At kunne danne de her ord eller bruge cirka samme teknik til at tagge ord er yderst nødvendig for at opnå præcision i sine tags. Men for at opnå høj hastighed i match, så bliver det også vigtigt at have en masse gode lister med bynavne, personnavne, mest almindelige ord og så videre, som jeg kan søge i først.

Den handling at søge i én lang liste er lynhurtig. Så det har vi råd til at gøre et par gange. Og så er der enkelte tilfælde, hvor vi skal ind og smoothe.

Rent praktisk foregår smoothing ved (som jeg lige løste det), at du har et ord, der så ikke bliver matchet.

I mit eksempel var det ordet avlede. Det ord er der ikke et eksakt match på i min ordbog. Så nu starter processen med at smoothe.

Jeg fik det til at virke ved at hakke ét bogstav af ad gange og så matche i min ordbog igen.

avled var heller ikke et match. Så vi skærer ét bogstav mere af.

avle var et match. HURRA.

Så langt så godt. Men vi er stadig ikke blevet klogere på, hvilken ordklasse det er. Eller hvilken tid, det er bøjet i.

Her kommer reglerne i spil. I min ordbog er der knyttet fire regler til ordet avle. Udfører jeg de regler med kode, så får jeg (her er bare et udsnit) følgende ord:

{
"avle": { "ordklasse": "verbum", "tid": "nutid" },
"avlede": { "ordklasse": "verbum", "tid": "datid" },
"avlet": { "ordklasse": "verbum", "tid": "perf_part" },
"avlende": { "ordklasse": "verbum", "tid": "præsens_part" },
"avles": { "ordklasse": "verbum", "tid": "passiv" }
}

Og så er der kun tilbage at matche på min meget lille liste af ord. Bum. Avlede er et verbum i datid. B

Min konklusion er, at jeg nok fik smoothing til at virke. Men at jeg formentlig skal finde nogle mere raffinerede måder at søge på. Det gik med en ok hastighed nu. Men jeg havde heller ikke åbnet for at skulle søge i hele ordbogen. Og min inputtekst var også relativt kort.