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.
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:
- NUM; "PL" or "SG"
- CASE; "PAR", "NOM", "GEN", "ESS", "TRA", "INE", "ELA", "ADE", "ABL", "ALL", "ABE", or "ILL"
- PERS; "SG1", "SG2" ,"SG3", "PL1", "PL2", "PL3" or "PE4" (passiivilauseille käytä turn_vp_into_passive(vp))
- MOOD; "INDV", "IMPV", "OPT", "COND" or "POTN" (käytä mielummin set_vp_mood_and_tense(vp, mood, tense))
- TENSE; "PRESENT" or "PAST" (käytä mielummin set_vp_mood_and_tense(vp, mood, tense))
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. 😊