Sisällön generointia Markovin ketjuilla
Käyttöliittymiä ja taittoa suunniteltaessa tarvitaan usein jonkinlaista täytetekstiä korvaamaan varsinaista sisältöä. Latinankielistä ”Lorem Ipsum”-tekstiä on käytetty täytetekstinä kirjapainoalalla jo 1500-luvulta asti, ja sama perinne jatkuu edelleen myös modernissa verkkosivustosuunnittelussa.
Jotta ”Lorem Ipsum”-tekstiä olisi helppo käyttää, on nettiin pelmahtanut useita ”Lorem Ipsum”-tekstigeneraattoreita, joista esimerkkinä voisi toimia vaikkapa lipsum.com-osoitteessa asusteleva simppeli perusgeneraattori. Näiden innoittamana on syntynyt lukematon määrä erilaisia täytetekstigeneraattoreita, joilla perinteisen latinan saa vaihdettua johonkin hiukan modernimpaan vaihtoehtoon. Tällaisia ovat esimerkiksi:
- Paluu tulevaisuuteen -elokuvista ammentava DeLorean Ipsum
- Hipsterikulttuurin syövereihin sukeltava Hipster Ipsum
- Carl Sagan -lainauksiin pohjautuva Sagan Ipsum
Vaihtoehtoja siis löytyy, mutta suomeksi tarjontaa on valitettavan vähän. Koska täytetekstiä käytetään usein juuri ulkoasun suunnittelun apuna, on varsin tärkeää, että kieli näyttää oikealta. Koska ainakin omasta mielestäni suomenkielinen teksti näyttää merkittävästi erilaiselta kuin englanti tai latina, halusin tehdä jotakin tilanteen korjaamiseksi.
Tuloksena syntyi vimpain, jonka nimesin Karhuttimeksi. Karhutin käyttää lähdemateriaalinaan Karhulla on asiaa -blogin sisältöä ja luo sen pohjalta 20–40 sanan tekstikappaleita.
Miten tekstiä voi luoda?
Suomi on kielenä todella vaikea ja se aiheuttaa muutamia haasteita myös tekstin automaattiselle generoinnille. Oikeiden sijamuotojen ja partikkelien käyttö on usein hankalaa ihmisillekin – koneelle niiden selvittäminen tuntuu likimain mahdottomalta. Onneksi tavoitteenamme ei ole luoda täysin virheetöntä suomenkielistä tekstiä, vaan tärkeintä on, että lauseet näyttävät riittävän paljon suomelta. Hommassa voidaan siis oikaista!
Paras oikotie tällaiseen tekstin generointiin löytyy Markovin ketjuista. Markovin ketju on yksinkertainen kone, joka luo jonoja yksi askel kerrallaan seuraavasti:
- Etsitään lähdemateriaalista sellaiset jäsenet, jotka seuraavat tällä hetkellä käsiteltävää jäsentä
- Valitaan yksi noista löytyneistä jäsenistä ja liitetään sen jonon jatkoksi
- Siirrytään jonon viimeiseen jäseneen ja toistetaan prosessin vaiheet uudestaan
Jonon jäseninä voidaan käyttää yksittäisiä sanoja, jolloin luonnollista kieltä sisältävän mallisisällön pohjalta pystytään luomaan toimivaa sisältöä lähes kokonaan kielestä riippumatta.
Pelkästään yhden sanan perusteella seuraavaa sanaa haettaessa tulee tekstistä kuitenkin suurella todennäköisyydellä silkkaa merkityksetöntä hölynpölyä. Jotta edes jonkinlainen tolkku tekstissä saataisiin säilytettyä, on askelkohtaista sanavalikoimaa pystyttävä rajaamaan jotenkin. Tämä onnistuu siten, että jokaisella askeleella etsitäänkin seuraavaa sanaa sillä perusteella, mikä sana esiintyy lähdemateriaalissa useamman edellisen sanan yhteydessä. Mitä useampaa edeltävää sanaa tässä käytetään hakuperusteena, sitä vähemmän vaihtoehtoja – ja siten myös satunnaisuuden tuomaa luovuutta – algoritmille jää käyttöön.
Markovin ketjut käytössä
Kuten aikaisemmin kerroin, halusin itse rakentaa suomenkielisen tekstigeneraattorin, joka tuottaa ainakin suomelta näyttävää tekstiä. Toteutuksen reunaehtoina olivat seuraavat:
- Toteutuksen tulee pohjautua Markovin ketjuihin, koska muut mahdolliset vaihtoehdot ovat liian epäkäytännöllisiä tai tylsiä
- Toteutuksessa on käytettävä tekijänoikeudellisesti ongelmatonta materiaalia
- Toteutuksen on oltava yksinkertainen, mutta laajennettavissa
Tuloksena syntyi vimpain, jonka nimesin Karhuttimeksi. Karhutin käyttää lähdemateriaalinaan Karhulla on asiaa -blogin sisältöä ja luo sen pohjalta 20–40 sanan tekstikappaleita. Jos käyt kurkkaamassa Karhutinta, suosittelen naksuttelemaan muutamaan kertaan ”Karhua uusi”-nappia, sillä toisinaan generoidut tekstipätkät ovat varsin hupaisia.
Itse en lähtenyt Markovin ketjuja Karhuttimeen rakentamaan (en varmaan olisi edes osannut), vaan käytössä on selainkäyttöön muokattu versio Thomas Castlemanin string-markov-js -paketista. JavaScriptille paketteja näytti olevan NPM:ssä saatavilla vaikka kuinka paljon, mutta muutamaa kokeiltuani totesin tuon tähän käyttöön ehdottomasti parhaaksi.
Myöhemmin vielä halusin Karhutinta vastaavan toiminnallisuuden itselleni käyttöön komentoriville, joten rakensin Go-kielellä pienen komentorivisovelluksen. Komentoriviversio käyttää hieman erilaista toteutusta Markovin ketjuihin perustuvasta tekstigeneroinnista (Esther Miñanon markov-kirjasto), joten tulokset eivät pääse ihan alkuperäisen web-sovelluksen tasolle. Komentoriviversio on kuitenkin helposti skriptattavissa ja sillä pystyy tuottamaan suomenkielistä täytetekstiä nopeasti ja vaivattomasti.