Tie koodariksi

Ohjelmoinnin alkeet

Luku 11: Kielen tunnistaja

Tietokoneen tapa päätellä asioita on joskus hyvin toisenlainen kuin ihmisillä, kuten tulemme huomaamaan seuraavaksi. Tavoitteemme on tehdä ohjelma, joka veikkaa, onko sille annettu teksti suomea vai englantia.

Tällaisen ohjelman tekemiseen on useita mahdollisuuksia. Yksi tapa olisi liittää ohjelmaan sanakirja ja päätellä kieli sen avulla. Esimerkiksi jos ohjelmalle annetaan teksti "hello world", se voisi päätellä sanakirjan avulla, että sanat "hello" ja "world" ovat englantia, joten teksti on englantia. Tässä tavassa olisi kuitenkin joitakin hankaluuksia: meidän tulisi etsiä jostain sanakirja, onnistua liittämään se ohjelmaan ja toivoa, että käyttäjä syöttää tekstiä, jonka sanat esiintyvät sanakirjassa. Hyväkään sanakirja ei sisällä kaikkia kielen sanoja. Esimerkiksi sana "hattivattisaari" on selvästi suomea, mutta sitä on turha etsiä sanakirjoista.

Teemme nyt ohjelman täysin toisella tavalla niin, että siinä ei ole sanakirjaa ja se pystyy päättelemään minkä tahansa tekstin kielen.

Osoittautuu, että hyödyllinen ominaisuus kielen tunnistamisessa on tekstin vokaalisuhde. Se lasketaan kaavalla v/(v+k), missä v on vokaalien määrä ja k on konsonanttien määrä. Esimerkiksi sanan "apina" vokaalisuhde on 3/5 = 0.60. Vokaalisuhde ilmaisee, miten paljon vokaaleja tekstissä on. Esimerkiksi vokaalisuhde 0.60 tarkoittaa, että 60 prosenttia tekstin kirjaimista on vokaaleja.

Voimme arvata tekstin kielen vokaalisuhteen avulla, koska eri kielissä on tilastollisesti eri vokaalisuhde. Tutkimalla vokaalien määrää suurissa tekstiaineistoissa on saatu selville, että suomessa vokaalisuhde on 0.48, kun taas englannissa se on 0.40. Toisin sanoen vokaalit ovat yleisempiä suomessa kuin englannissa. Tämän tiedon avulla ohjelma voi veikata tekstin olevan suomea, jos vokaalisuhde on lähempänä lukua 0.48, ja englantia, jos vokaalisuhde on lähempänä lukua 0.40.

Seuraava koodi näyttää, kuinka voimme toteuttaa kielen tunnistajan käytännössä. Tutkittava teksti annetaan ohjelman alussa muuttujassa teksti.

teksti = "mieleni minun tekevi, aivoni ajattelevi"
v = 0
k = 0
for x in teksti:
    if x in "aeiouyåäö":
        v += 1
    if x in "bcdfghjklmnpqrstvwxz":
        k += 1
suhde = v/(v+k)
if suhde >= 0.44:
    print("suomea")
else:
    print("englantia")

Tässä muuttuja x käy läpi tekstin merkit. Jos x on vokaali, muuttujan v arvo kasvaa, ja jos x on konsonantti, muuttujan k arvo kasvaa. Lopuksi ohjelma laskee vokaalisuhteen ja tulostaa veikkauksen tekstin kielestä.

Esimerkiksi tekstin "mieleni minun tekevi, aivoni ajattelevi" vokaalisuhde on 0.52941, joten ohjelma arvelee sen olevan suomea, mikä on oikein.

Vastaavasti tekstin "a monkey has three bananas and a harpsichord" vokaalisuhde on 0.40541, joten ohjelma veikkaa sen kieleksi englantia, mikä on myös oikein.

Käytännössä ohjelma toimii sitä paremmin, mitä enemmän tekstiä sille annetaan. Jos ohjelmalle annetaan vain yksi sana, se saattaa erehtyä, mutta jos tekstissä on sata sanaa, ohjelma tunnistaa kielen oikein käytännössä varmasti.


Voit testata vokaalisuhteen laskemista ja kielen päättelyä kirjoittamalla tekstiä seuraavaan kenttään:

Vokaalit:
Konsonantit:
Vokaalisuhde:
Kieli:

Kielen päätteleminen vokaalisuhteen avulla toimii usein hyvin, mutta voisiko konetta hämätä kuitenkin?

Keksitkö jonkin suomenkielisen lauseen, joka on koneen mukaan englantia? Entä keksitkö vastaavasti englanninkielisen lauseen, joka on koneen mukaan suomea?