28.10.2014 Views

1tgD67B

1tgD67B

1tgD67B

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!