Tuota kieliopillista suomea tietokoneella (NLG)

Suomi on suhteellisen hankala kieli tuottaa automaattisesti tietokoneella (NLG). Siinnä missä enkun kohdalla sanoja voi vain mäiskiä peräkanaa lauseeseen perusmuodossa, suomi vaatii taivuttelua. Tietokoneen on hallittava kongruenssi- ja rektiosäännöt, mikä on jokseenkin haastavaa. 🤷🏼‍♂️

Onneksi sinun ei tarvitse moisella päätäsi vaivata! Olen tehnyt suomen tuottamista varten python-kirjaston, syntax makerin. Sitä saa käyttää aivan vapaasti. Oletko valmis vapauttamaan syntax maker -pedon? 😊😊

Lyö terminaaliin vain loitsu pip install syntaxmaker asentaaksesi sen koneelle. Kirjasto vaatii Omorfin. Lataa Omorfin binääriversiot täältä. Jos asennuksessa tulee ongelmia, kannattaa kurkata ohjeita HFST:n asentamiseen ja syntax makerin wikiä. Jos olet kiinnostunut ainoastaan suomen sanojen taivuttamisesta, kannattaa lukaista ohjeet helppoon Omorfin käyttöön.

Miten sitä käytetään?

Kirjaston toimintalogiikka perustuu lausekkeisiin ja pääsanoihin. Otetaan esimerkiksi lauseen kissa syö ruokaa syntaktinen jäsennys  VP [ NP [ kissa ] syö NP [ ruokaa ] ]. Jokainen pääsana on omaa sanaluokkaansa vastaavan lausekkeen sisällä: syödä on verbilausekkeen (VP) pääsana, kissa nominilausekkeen jne. Lausekkeet on upotettu toisiinsa siten, että verbilauseke jää syntaktisen puun juureksi. Näin syntax makerkin toimii; kaikki lausekkeet pistetään verbilausekkeen alle.

Muodostaaksesi lauseen kissat syövät ruokaa, sinun tulee vain luoda syntaktinen rakenne kuten alla.

a syntactic tree for kissa syödä ruokaa

Tämä saadaan aikaan seuraavalla koodilla:

from syntaxmaker.syntax_maker import *
vp = create_verb_pharse("syödä") #luo uuden Phrase-olion, joka on verbilauseke

subject = create_phrase("NP", "kissa", {u"NUM": "PL"}) #luo nominilausekkeen, jonka valinnaisena argumenttina on luku
vp.components["subject"] = subject #tämä asettaa nominilausekkeen verbilausekkeen subjektiksi

dir_object = create_phrase("NP", "ruoka")
vp.components["dir_object"] = dir_object

print vp
#tuloste: kissat syövät ruokaa

Kirjasto tukee myös monimutkaisempia lauseita kuten jopa relatiivilauseita. Muutama asia on kuitenkin selvitettävä ennen kuin kirjastoa osaa täysin käyttää. Ensiksi, kun luot uuden lausekkeen, voit halutessasi antaa parametrina sanakirjarakenteen, joka määrittää morfologiaa. Mahdollisia arvoja ovat:

Jokaisen Phrase-olion rakenteeseen kuuluvat seuraavat muuttujat: components (alisteiset lausekkeet), order (lausekkeiden järjestys tulostettaessa), head (pääsana) ja agreement (kongruenssi). Kaikki mahdolliset lauseketyypit ja niiden rakenteet on listattu grammar.json:issa. Jos haluat lisätä uuden alisteisen lausekkeen johonkin toiseen lausekkeeseen, lisää se vain uudella nimellä componentsiin ja lisää sama nimi order-listaan.

Jatketaan edellistä koodiesimerkkiä lisäämällä adpositiolauseke:

np = create_phrase("NP", "käsi", {u"NUM": "PL"})
pp = create_adposition_phrase("ilman", np) #tämä lause on ilman käsiä

vp.components["adposition"] = pp #lisätään pp vp:hen
vp.order.append("adposition") #lisätään sen nimi myös order-listaan, jotta lauseke tulostuu
print vp
#tuloste: kissat syövät ruokaa ilman käsiä

Order-listan sisällön voi jopa halutessaan sekottaa mielivaltaisesti:

from random import shuffle
shuffle(vp.order)
print vp
#output ilman käsiä ruokaa syövät kissat

Huom. Tämä sekoittaa vain lausekkeiden järjestyksen. Ei siis sanojen. Siksi ilman käsiä esiintyy aina oikeassa järjestyksessä.

Lisää neuvoja

Syntax maker wikissä on lisää tietoa kirjaston käytöstä tai siten voit olla minuun yhteydessä.

Lopuksi

Minulla on ollut jo pitkään tarkoitus kirjoittaa tutoriaali kirjaston käytöstä. Olen pistänyt jonkin verran omaa aikaani kirjaston kehittämiseen, joten olisi kiva, jos sitä myös käytettäisiin. 😊