[voikko] Mozvoikon Linux-jakeluversiota päivitetty ( myös yleistä Fedora-asiaa)

Harri Pitkänen hatapitk at iki.fi
Sat May 24 23:48:17 EEST 2008


On Saturday 24 May 2008, Ville-Pekka Vainio wrote:
> Erityisesti keskustelua aiheutuu nyt siitä, että Fedorassa yhdistettiin
> oikolukusanastoja hunspellin alle äskettäin ja Voikko-pakettien tekeminen
> periaatteessa rikkoo tätä. Vielä taustoista sen verran, että Christopher
> Aillon on tietääkseni upstream-Firefox-kehittäjä, joten Fx-laajennos ehkä
> sikäli erityisesti kiinnostaa. Jos joku haluaa kommentoida, niin saattaa
> olla, että listalle on liityttävä ensin.

En viitsi kommentoida suljetuille listoille. Tuota architecture-sivua voisin 
kyllä täydentää, on tainnut tulla kirjoitettua liian kiltisti Hunspellista :) 
Sanotaan nyt asiat vähän suoremmin, kun ollaan suomenkielisellä listalla. 
Tosiasia on se, että ilman merkittäviä muutoksia Hunspelliin olisi täyttä 
ajan haaskausta edes yrittää toteuttaa sen avulla samaa, mihin nyt olemme 
malagan avulla päässeet. Ja menettäisimme tavutuksen (ja mahdollisuuden 
toteuttaa kieliopin tarkistinta seuraavan kolmen vuoden kuluessa) siinä 
samalla, mikä saattaisi hiukan harmittaa käyttäjiä.

Otetaan nyt esimerkiksi seuraava bugi Hunspellistä:
http://sourceforge.net/tracker/index.php?func=detail&aid=1428496&group_id=143754&atid=756395

Raportoin tuon yli kaksi vuotta sitten. Korjaus luvattiin "parissa 
kuukaudessa". Sen sijaan ainoastaan segfaultti korjattiin (vuoden kuluttua). 
Ja nyt kun kokeilin tuota samaa testitapausta uusimmalla Hunspellilla 
(1.2.2), niin arvatkaapa mitä tapahtuu...

  > abcabcs
  Segmentation fault

Että sillä tavalla. Tietysti aina voi sanoa, että bugit pystyy korjaamaan. 
Mutta minä todella yritin tuon itsekin aikoinaan korjata, mutta en pystynyt. 
Taidot eivät riittäneet. No, pari vuotta vanhempana ja viisaampana voisin 
kokeilla uudelleen, joten katsotaanpa mitä Valgrind sanoo...

==23263== Invalid read of size 1
==23263==    at 0x4E398D0: AffixMgr::compound_check_morph(char const*, int, 
short, short, short, short, hentry**, char, char**, char*) 
(affixmgr.cxx:2128)
==23263==    by 0x4E481B1: SuggestMgr::suggest_morph(char const*) 
(suggestmgr.cxx:1530)
==23263==    by 0x4E4242B: Hunspell::analyze(char***, char const*) 
(hunspell.cxx:1340)
==23263==    by 0x400E95: main (analyze.cxx:62)
==23263==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

Huomatkaa rivinumerot! Nyrkkisääntönä mielestäni hyvin suunniteltujen 
lähdekooditiedostojen tulisi olla pääsääntöisesti alle tuhannen rivin 
mittaisia. No tyylinsä kullakin. Katsotaanpa, mitä affixmgr.cxx:2128 pitää 
sisällään. Ensinnäkin, tuo tiedosto on kokonaisuudessaan hulppeat 4115 riviä 
pitkä. Metodi compound_check_morph on "vain" 451 riviä pitkä. Mutta tuon 
koodin kauheutta ei voi täysin arvostaa näkemättä sitä itse, joten laitoin 
sen nyt oikein kokonaisuudessaan nähtäville:
  http://www.puimula.org/htp/hunspell/affixmgr.cxx
tuosta metodista voi ihailla mm. seuraavanlaisia insinööritaidon helmiä:

            oldnumsyllable2 = numsyllable;
            oldwordnum2 = wordnum;

// LANG_hu section: spec. Hungarian rule
            if ((rv) && (langnum == LANG_hu) && (TESTAFF(rv->astr, 'I', 
rv->alen)) && !(TESTAFF(rv->astr, 'J', rv->alen))) {
                numsyllable--;
            }
// END of LANG_hu section
            // increment word number, if the second root has a compoundroot 
flag
            if ((rv) && (compoundroot) &&

Siis kieliriippuvaa koodia sotkettu muutenkin yli 400-rivisen metodin sisään. 
Kyllähän tuolla tavalla toki voi saada aikaan jotain, joka toimii hyvin 
unkarin kielellä, mutta siitä ei voi mitenkään yleistää, että koodi toimisi 
samaan tapaan suomen kielellä, jos jo perusalgoritmit sisältävät 
kielikohtaisia maagisia toimintoja. Tämä ei tosiaankaan ole yksittäistapaus:

  $ cat affixmgr.cxx | grep LANG_hu | wc -l
  26

Ei mikään ihme, että Hunspellia kehittää yksi ihminen. Tuskin tuota koodia 
kovin mielellään kukaan muukaan vakavasti haluaisi kehittää. Hunspellilla ei 
myöskään ole julkista versionhallintajärjestelmää, joten kenenkään on 
käytännössä mahdotonta löytää selitystä sille, miksi jossain kohdassa koodia 
tehdään jotain tiettyä tarkistusta ja mihin se liittyy.

Ja yllä oleva bugi ei ole mikään akateeminen yksityiskohta. Se käytännössä 
estää yhdyssanojen järkevän morfologisen analyysin, jota tarvittaisiin, jos 
haluttaisiin toteuttaa tavutustoiminto Hunspellin päälle.


Toki on totta, että tämä on yleinen ongelma muussakin akateemisesta maailmasta 
tulevassa koodissa. Ei malagallakaan ole julkista 
versionhallintajärjestelmää, silläkin on vain yksi kehittäjä ja koodissa on 
paljon merkkejä siitä, että se on kirjoitettu enemmän tutkimustyökaluksi kuin 
käytettäväksi tuotantojärjestelmissä (mm. rankka globaalien muuttujien 
käyttö, joka juurikin estää koodin säikeistetyn käytön). Mutta malaga toimii, 
ja sen on selvästi koodannut ihminen, joka algoritmien osalta todella tietää 
mitä tekee. Itse LAG-jäsentimestä ei ole tämän viimeisen reilun kahden vuoden 
aikana löytynyt muistini mukaan kuin yksi ainoa bugi, ja sekin muistaakseni 
toukokuussa 2006.

Malaga on myös melko hyvin optimoitua koodia. Se ei siis ole sinällään hidas, 
hitaus johtuu käyttämästämme kieliopista, joka on monimutkainen. Tämä 
monimutkaisuus tulisi väistämättä eteen myös Hunspell-toteutuksessa, ja on 
toisaalta pitkälti korjattavissa malaga-toteutuksessa, jos todella olisi 
tärkeää saada siitä tehokkaampi (käytännössä kukaan ei minulle ole valittanut 
oikoluvun hitaudesta, parempia korjausehdotuksia kyllä voisimme saada, jos 
analyysi olisi tehokkaampaa). Olen tehnyt vertailuni englanninkielisen 
hunspell-sanaston ja Voikon välillä. Tässä vertailussa hunspell oli 
muistaakseni kymmenen kertaa nopeampi, mutta kuten sanottu, nämä eivät ole 
vertailukelpoiset sanastot.

Lisäksi tuolla www-sivulla on myös mainittu, että jos malagasta luovumme, 
siirrymme todennäköisesti johonkin yleisesti käytettyyn ja "oikeiden" 
ammattilaisten käyttämään teknologiaan, kuten äärellisiin automaatteihin 
(joihin muuten Soikkokin perustui). Tällaistakin teknologiaa kun on nykyään 
(toisin kuin pari vuotta sitten) GPL-lisenssillä saatavissa, ja aivan kaikki 
ei välttämättä edes ole patentoitu :) Helsingissähän tämän parissa jo 
vakavasti puuhataan, kuten talvella tällä listalla on ollut puhetta. Myös 
Hunspellin kehittäjä tuntuu tietävän, että nykyinen Hunspellin toteutus olisi 
voitu tehdä täysin eri tekniikalla, jos lisenssiltään sopivia työkaluja olisi 
silloin ollut olemassa (tähän artikkeliin osoittava linkki sivullamme on 
näemmä rikki tällä hetkellä):
  http://mokk.bme.hu/archive/nemeth04hunmorph

No niin, eiköhän tässä ole perusteita. Jos jotain konkreettista haetaan, eli 
mitä hunspellilla ei voi tehdä ja mitä välttämättä suomessa tarvitsisimme, 
niin muistini mukaan ainakin silloin kaksi vuotta sitten ongelma oli, että 
jos vaikkapa adjektiivista johdetaan automaattisesti substantiivi, Hunspell 
ei tarjonnut mitään menetelmää, jolla yhdyssanan muodostuksessa tätä 
johdettua substantiivia olisi voitu käsitellä substantiivina. Melkoinen 
ongelma suomen kielessä, mutta en tosiaankaan varmasti tiedä, onko tuo 
rajoitus edelleen olemassa nykyisessä Hunspellin versiossa.

Harri



More information about the voikko mailing list