You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
sanan osana muodostavat kummallisia<br />
kokonaisuuksia, jotka voivat olla merkki<br />
kirjoitusvirheestä. Lisäksi algoritmissa<br />
määritellään, että yhdysmerkki osien välissä<br />
pienentää kompleksisuuspistemäärää,<br />
koska yhdysmerkki on lyöntivirheenä<br />
harvinainen.<br />
Koska sekä avainarvon että kompleksisuuden<br />
laskeminen perustuu sanan<br />
yhdysosien tutkimiseen, on ne käytännöllistä<br />
toteuttaa yhdessä funktiossa (listaus<br />
3). Kaikkiin Voikon tunnistamiin sanoihin<br />
ei liity yhtään sanastotietokantaan tallennettua<br />
tietuetta (mm. pronominit), joten<br />
algoritmissa on varauduttu palauttamaan<br />
oletusarvona avaimeksi tyhjä merkkijono<br />
ja kompleksisuudeksi nolla.<br />
Listauksen 3 funktio on sellaisenaan<br />
riittävä vain sanoille, joille Voikko tuottaa<br />
täsmälleen yhden morfologisen analyysin.<br />
Aiemmin kuitenkin nähtiin, että<br />
sanoilla voi olla useita analyysituloksia.<br />
Toisaalta kaikille sanoille (mm. väärin<br />
kirjoitetut sanat) ei analyysejä synny lainkaan.<br />
Listauksessa 4 esitellään funktio,<br />
jonka avulla nämäkin tapaukset saadaan<br />
käsiteltyä.<br />
Näiden apufunktioiden varaan voidaan<br />
laatia aliohjelma, joka tulostaa annetusta<br />
tekstikappaleesta epäilyttävät<br />
sanat. Esimerkkikoodi on nähtävissä listauksessa<br />
5. Sanat erotetaan juoksevasta<br />
tekstistä Voikon tokens-metodilla. Säätämällä<br />
kompleksisuuden enimmäisarvoa<br />
(tässä 2,7) tai muokkaamalla itse kompleksisuusfunktiota<br />
(listaus 3) voidaan<br />
vaikuttaa siihen, mitkä sanat tulkitaan<br />
epäilyttäviksi.<br />
Jotta koodi olisi helpommin käytettävissä,<br />
kootaan funktiot samaan Pythontiedostoon,<br />
joka voidaan suorittaa käyttöjärjestelmän<br />
komentotulkista. Ohjelman<br />
runko on listauksessa 6. Kopioi sen sisään<br />
funktiot, jotka määriteltiin listauksissa<br />
3–5.<br />
def printSuspiciousWords(voikko, textParagraph):<br />
minScoreForSuspiciousWord = 2.7<br />
wordToKey = {}<br />
keyToScore = {}<br />
allTokens = voikko.tokens(textParagraph)<br />
words = [t.tokenText for t in allTokens if t.tokenType == Token.WORD]<br />
correctWords = [w for w in words if voikko.spell(w)]<br />
for word in correctWords:<br />
if word not in wordToKey:<br />
analysis = voikko.analyze(word)<br />
(key, score) = keyAndScore(analysis)<br />
wordToKey[word] = key<br />
if key in keyToScore:<br />
keyToScore[key] = 0<br />
else:<br />
keyToScore[key] = score<br />
for word in correctWords:<br />
if keyToScore[wordToKey[word]] >= minScoreForSuspiciousWord:<br />
print word.encode("UTF-8")<br />
Listaus 5. Funktio, joka tulostaa epäilyttävät eli mahdollisesti väärin kirjoitetut sanat.<br />
#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
import fileinput, re<br />
from libvoikko import Voikko, Token<br />
# Kopioi tähän kohtaan listauksissa 3, 4 ja 5<br />
# määritellyt funktiot.<br />
voikko = Voikko(u"fi-x-morphoid")<br />
for line in fileinput.input():<br />
printSuspiciousWords(voikko, unicode(line, "UTF-8"))<br />
voikko.terminate()<br />
Listaus 6. Pääohjelman runko, josta puuttuu listausten 3–5 koodi.<br />
Valmis esimerkki<br />
Nyt on kasassa esimerkkiohjelma, jolla<br />
saa tulostettua tekstissä olevat epäilyttävät<br />
sanat. Esimerkkiohjelman voi ladata<br />
myös Skrollin nettisivulta osoitteesta<br />
http://skrolli.fi/2014.2/. Ohjelma poimii<br />
tekstistä sellaiset sanat, jotka ovat kieliopillisesti<br />
oikein mutta sen verran erikoisia,<br />
että kyseessä saattaa olla kirjoitusvirhe.<br />
Tekstistä löytyvät esimerkiksi<br />
kirjoitusvirheet maksuase (kun tarkoitettiin<br />
maksutase) ja lumiura (kun tarkoitettiin<br />
lumiaura). Ohjelma on kuitenkin<br />
vain yksinkertainen esimerkki. Sitä kokeilemalla<br />
huomaa, että monet sen merkitsemistä<br />
sanoista ovat aivan tavallisia<br />
suomen kielen sanoja.<br />
Algoritmia voisi melko helposti parantaa<br />
ottamalla huomioon myös sanan osien<br />
tarkemman luokittelun. Esimerkiksi lyhenteet<br />
esiintyvät yhdyssanoissa yhdysmerkillä<br />
erotettuna, joten ne eivät käytännössä<br />
aiheuta hankalasti havaittavia<br />
kirjoitusvirheitä. Esimerkkialgoritmi ei<br />
huomioi sanojen luokittelua mitenkään,<br />
vaan kompleksisuuspisteytys kasvaa helposti<br />
suureksi, jos sanassa on mukana<br />
yhden tai kahden kirjaimen lyhenteitä.<br />
Jätämme tämänkaltaisen jatkokehittelyn<br />
haasteeksi lehden lukijoille. Vaihtoehtoisia<br />
algoritmeja voi lähettää Voikon kehittäjille,<br />
jos ne osoittautuvat toimiviksi.<br />
Voikko – suomalaisten<br />
NIH?<br />
Teksti: Teemu Likonen<br />
Avoimen lähdekoodin yhteisöissä on useamman<br />
kerran jouduttu selittämään ulkomaalaisille,<br />
miksi suomen kieli tarvitsee oman<br />
oikolukujärjestelmänsä. Miksi ette käytä<br />
Ispelliä? Onko teillä suomalaisilla NIH eli ”not<br />
invented here” -oireyhtymä, jonka vuoksi muiden<br />
tekemä valmis koodi kelpaa? Ei. Meillä on<br />
vain tällainen vähän erilainen kieli…<br />
Perinteisesti Unix-tyyppisissä käyttöjärjestelmissä<br />
oikoluku perustuu Ispell-järjestelmään,<br />
jonka juuret yltävät 1970-luvun alkuun.<br />
Ispelliin kuuluu kielioppi, jonka avulla sanasto<br />
ja sananmuodostus kuvataan. Unixin periaatteen<br />
mukaisesti siihen kuuluu myös komentotyökalu,<br />
joka toimii oikoluvun rajapintana<br />
muille ohjelmille.<br />
Ja Ispellille todellakin on tehty suomen<br />
kielen sanasto. Samoin on tehty Aspellille ja<br />
Myspellille, jotka ovat eräällä tavalla Ispellin<br />
seuraajia. Miksi emme käytä niitä?<br />
Laadun vuoksi. Käyttökelpoinen suomen<br />
kielen oikoluku vaatii hyvin taipuisan morfologisen<br />
järjestelmän, jotta suomen rikas<br />
taivutus ja sananmuodostus voidaan riittävän<br />
tarkasti määritellä. Ispell ja muut vastaavat<br />
ovat liian rajoittuneita. Tavallaan Voikko oli<br />
pakko tehdä, koska missään muualla ei kielestämme<br />
olla kiinnostuneita. Suurin kunnia<br />
ohjelmoinnista ja sanastotyöstä kuuluu Harri<br />
Pitkäselle ja Hannu Väisäselle.<br />
Suomen kielen oikoluvun kannalta Voikko<br />
on ollut valmis jo pitkään, mutta sen tekniikalle<br />
on löytynyt muutakin käyttöä. Esimerkiksi<br />
pohjoissaamen kielelle on kehitteillä<br />
Voikko-sanasto. Kansalliskirjasto käyttää<br />
Voikkoa hakujärjestelmissään. Sen ansiosta<br />
palvelun käyttäjä voi kirjoittaa hakusanat<br />
perusmuodossa ja hakujärjestelmä löytää silti<br />
taivutettuja muotoja.<br />
Avoimessa lähdekoodissa on etunsa,<br />
kun suomen kieliteknologian pyörää ei enää<br />
tarvitse jokaisen keksiä uudelleen.<br />
10 2014.2