Kieliteknologista haparointia osa I
Tein pienen Python-skriptin, joka generoi kaikki sanat muotoa (C)VCinA, jossa C on mikä tahansa konsonantti, V mikä tahansa vokaali sekä A joko a tai ä vokaalisoinnusta riippuen.
Tällaisia sanoja ovat siis esim. ininä, tutina, ähinä, lorina. Monet niistä ovat onomatopoeettisia, siis ääntä kuvaavia, toiset taas muulla tavalla deskriptiivisiä tai affektisia. Nämä sanat ovat aika epämääräinen joukko.
Skriptin generoimista sanoista osa on toki jotain ihan muuta. Halusin selvittää, kuinka suuri osa on mitäkin.
Seuraavaksi yritin käyttää skriptissäni NLTK- tai HFST-kirjastoa kunkin sanan vartalon ja sanaluokan löytämiseksi. Pahaksi onneksi kuitenkin NLTK:n suomituki vaikuttaa vaillinaiselta ja HFST:n asentaminen taas tyssäsi ongelmiin.
Lista ei onneksi ollut kovin pitkä, joten päätin käydä sen läpi käsin. Merkitsin listaan kaikki sanat, joissa oli jotain erikoista.
-
Osa on ei-deverbaalisia substantiiveja ihan vain nominatiivissa: apina, kapina, rusina. Osa on erisnimiä nominatiivissa: Rosina, Hamina.
-
Runsaat sata on eris- ja yleisnimiä yksikön tai monikon essiivissä: Jonina, Katina, Kyminä; läjinä, kesinä, susina.
-
Ehdottomasti suurin osa, 910/1056, on kuitenkin jotain muuta kuin ei-deverbaalisia nominatiiveja tai essiivejä.
Keskityn luokkaan 3. Seuraavaksi haluan tutkia jostakin korpuksesta, kuinka frekventti kukin näistä 910:stä on. Siis: mitkä osat teoreettisesta, generoimastani sana-avaruudesta ovat todellisessa käytössä? Tästä lisää seuraavassa jaksossa.
P.S. Eräs mielenkiintoinen sivuhavainto on, että koko tässä sana-avaruudessa on oikeastaan vain kolme ulottuvuutta, C1 (joka voi olla ∅), V ja C2. Voisiko siis jonkinlainen kolmiulotteinen kuvaaja tulla kysymykseen?
Lopuksi vielä se skripti:
#!/usr/bin/env python3
"""
Generate all Finnish words of the format (C)VCinA,
where C is any consonant, V is any vowel and A is either 'ä' or 'a'
depending on vowel harmony.
"""
CONSONANTS = ['', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'v']
BACK_VOWELS = ['u', 'o', 'a']
FRONT_VOWELS = ['y', 'ä', 'ö']
NEUTRAL_VOWELS = ['e', 'i']
words = []
for c in CONSONANTS:
for c2 in CONSONANTS[1:]: # second consonant must exist, ignore ''
for v in BACK_VOWELS:
words.append("%s%s%sina" % (c, v, c2))
for v in FRONT_VOWELS + NEUTRAL_VOWELS:
words.append("%s%s%sinä" % (c, v, c2))
f = open('words.txt', mode='w')
for w in words:
f.write("%s\n" % w)
f.close()