[voikko] libvoikko HFST-transduktoreilla

Harri Pitkänen hatapitk at iki.fi
Fri Oct 30 20:57:22 EET 2009


On Friday 30 October 2009, Flammie Pirinen wrote:
> 2009-10-29, Harri Pitkänen sanoi:
> > Toinen vaihtoehto on muokata libvoikkoa siten, että toteuttaisi
> > HFST:n avulla tiedostossa src/morphology/Analyzer.hpp määritellyn
> > rajapinnan. Tuohonhan tarvitaan oikeastaan vain yhden metodin
> > toteutus (alustukset on vielä lisäksi hoidettava muualla), jonka
> > jälkeen kaikki oikolukuun, tavutukseen, morfologiseen analyysiin ja
> > kieliopin tarkistukseen liittyvät toiminnot toimisivat suoraan HFST:n
> > päällä.
> 
> Tuo kuulostaa kanssa ihan mahdolliselta ja kätevältä. Käytin tuossa
> toisessa toteutuksessa neljää automaattia jotka vastaavat funktioita
> osin optimointisyistä, kysymys onko jokin sana hyvä ratkeaa
> yksinkertaisella yksinauhaisella automaatilla joka on väistämättä nopea
> ja tehokas, katso kaikki morfologiset analyysit taas nykyisellään
> vaatii isomman ja hitaan kaksinauhaisen automaatin (ei välttämättä,
> mutta niin on tähän mennessä aina tehty).

Tosiaan, Malagaa käytettäessä ei ole kovin oleellista suorituskykyeroa sillä, 
katsotaanko kaikki analyysit läpi pyritäänkö vain hyväksymään/hylkäämään sana. 
Täytyy harkita, että jos (kun?) siirrymme jossain vaiheessa käyttämään 
automaatteja, olisiko tällainen optimointi järkevää. Tässä on huomioitava myös 
muistin käyttö, eli erilliset automaatit voivat olla käytännön sovelluksissa 
epäkäytännöllisiä, jos ne kasvattavat ohjelmiston kokoa kovin paljon.

> Ehdotusten aikaansaaminenkin
> onnistuu kuten sanottua vain yhdellä kaksinauhaisella painollisella
> automaatilla pelkästään hakemalla merkkijonolla. Tästä tietysti myös
> seuraa että kaikki toimintalogiikka on automaateissa joten osaan itse
> viritellä niitä tarpeen mukaan, mikä on aina hauskaa.

Ehdotusten puolella meillä on jo jonkinlainen abstraktio 
(spellchecker/suggestion/SuggestionStrategy.hpp), jonka avulla olisi 
mahdollista pultata libvoikkoon ehdotuksia generoiva komponentti, joka hakisi 
ehdotukset suoraan automaatilta. Ihan tähän sitä ei kyllä alun perin 
tarkoitettu, mutta ajatusta voisi kehitellä. Tällä hetkellä sen kaikki 
toteutukset käyttävät Analyzer-oliota taustalla.

> Mutta niin, ilmeisesti tuon analyysifunktion osalta riittäisi jos
> osaisi huolella koodata esityksen morfologisesta analyysistä jonka
> voikko tai suomi-malaga tuottaa, niin saisi suoraan saman lopputuloksen
> oikoluvussa ja kielentarkistuksessa? Tätä esitystä ei kuitenkaan kai
> sanota suoraan Analyzer.hpp- tai Analysis.hpp-tiedostoissa.

Joo, tuota ei ole oikein dokumentoitu, täytyykin yrittää kirjoitella asiasta 
jotain. Mutta mitään kovin kummallista tähän ei tarvita. Analyzer-toteutuksen 
pitää siis palauttaa joukko Analysis-olioita. Näihin sen täytyy addAttribute-
metodilla lisätä attribuutteja. Kolme attribuuteista on tällä hetkellä 
pakollisia, eli kaikkien analyysien tulee sisältää vähintään ne. Enemmänkin 
attribuutteja saa lisätä, jos toteutuksella on tarjota muutakin kuin 
pakolliset tiedot.

> talonmies
> [##]talonmies[POS=NOUN][KTN=42][NUM=SG][CASE=NOM][##]	2
> [##]talo[POS=NOUN][KTN=1][NUM=SG][CASE=GEN,ACC][#][?]mies[POS=NOUN][KTN=42]
> [NUM=SG][CASE=NOM][##] 11

Vastaavat MalagaAnalyzerin tuottamat attribuutit ovat seuraavat (nämä näkee 
komennolla voikkospell -m):

A(talonmies):1:BASEFORM=talonmies
A(talonmies):1:CLASS=nimisana
A(talonmies):1:SIJAMUOTO=nimento
A(talonmies):1:STRUCTURE==ppppp=pppp
A(talonmies):1:WORDBASES=+talo(talo)+n+mies(mies)
A(talonmies):1:WORDIDS=+talo(w515227)+n+mies(w508727)

Pakollisia noista attribuuteista ovat CLASS, SIJAMUOTO ja STRUCTURE. CLASS ja 
SIJAMUOTO sisältävät sanaluokan ja nominien sijamuodon. Molempien sallitut 
arvot ovat Suomi-malagasta peräisin eivätkä ihan helposti arvattavissa koodia 
lukematta. Onneksi lähes kaikki toimii oikein vaikka noihin laittaisi arvoksi 
"none", koska kyseisiä tietoja ei libvoikon sisällä vielä kovin paljon 
hyödynnetä. Attribuutteja BASEFORM, WORDBASES ja WORDIDS ei libvoikossa 
käytetä lainkaan. Ne ovat vielä jossain määrin kokeellista toiminnallisuutta 
ja hyvin todennäköisesti muuttuvat tulevissa versioissa.

Eli lopulta noihin analyyseihin jää ainoastaan yksi attribuutti, jonka arvolla 
on aidosti väliä, eli STRUCTURE. Tämäkin on aika helppo. Jokaista sanan alkua 
sekä yhdyssanan osan alkua merkitään yhtäsuuruusmerkillä. Jokaista sanan 
kirjainta merkitään kirjainmerkillä p, q, i tai j, joiden merkitys selviää 
seuraavasta taulukosta:

                              Kirjainkoko (pitääkö kyseinen kirjain
                              kirjoittaa isolla muuallakin kuin virkkeen
                              alussa)
                                pieni    iso
Onko tavutus merkin    kyllä    p        i
edeltä sallittu?       ei       q        j

Käytännössä q ja j ovat meillä olleet käytössä vain lyhenteissä, joten aika 
pitkälle pääsee käyttämällä pelkästään merkkejä p ja i.

Lopuksi on huomioitava, että Analyzer-oliot eivät saa välittää sanojen 
kirjainkoosta analyysejä muodostaessaan. Eli sanalle "pekka" on muodostettava 
sama analyysi kuin sanalle "Pekka", vaikka sana olisikin puhdas erisnimi. 
Tässä hiukan hämäävästi voikkospell -m kuitenkin kieltäytyy näyttämästä 
pienellä kirjoitetun sanan analyysit, jos sana on "väärin kirjoitettu":

W: pekka
Pekka
C: Pekka
A(Pekka):1:BASEFORM=Pekka
A(Pekka):1:CLASS=etunimi
A(Pekka):1:SIJAMUOTO=nimento
A(Pekka):1:STRUCTURE==ipppp
A(Pekka):1:WORDBASES=+Pekka(Pekka)
A(Pekka):1:WORDIDS=+Pekka(w520841)


Yritän viikonlopun aikana tai ensi viikolla lisätä libvoikkoon kokeellisen 
käännösaikaisen valitsimen, jolla Malagan saisi korvattua HFST:llä.

Harri



More information about the voikko mailing list