Haiku-generator


Det er vanskelig å skrive dikt, så hva om vi lager en bot som kan gjøre det for oss? I dette innlegget prøver vi å skrive en haikurobot, med varierende hell. Antall stavelser blir i alle fall riktig

Øystein Krogstie

26.3.2021

Lesetid: ca.3.7 minutter

Tempe, kjøttkake, svele

Jeg er en stor fan av spåkgeneratorer, enten de er twitterbotter, adjektivhistorier eller automatisk genererte referanser fra BankID. Det skal ikke så mange regler til for å generere tekst som, i alle fall av og til, er artig og overraskende. Jeg bestemte meg derfor en dag for å skrive en språkgenerator på egen hånd. Og den skulle skrive dikt.

Regler for dikt

Dikt kan kategoriseres etter hva slags stavelses- og rytmemønster de følger. For eksempel består et dikt med trykkmønsteret iamb av grunnelementer på to stavelser med trykk på den andre, mens et dikt skrevet etter mønsteret dactyl består av grunnelementer på tre stavelser med trykk på den første. I tillegg til trykkmønster kan diktformen også defineres ut i fra antall grunnelementer per linje. Om et dikt er skrevet i iambisk pentameter betyr dette at hver linje består av fem iamber.

Men det å skulle genrere dikt med gitte trykkmønster virker komplisert. Hvordan skulle genratoren vite hvordan trykkmønsteret i en tilfeldig genrert setning så ut? Det enkleste ville være å velge seg en diktform der trykkmønsteret ikke var del av reglene for hvordan diktet skulle skrives, slik som for eksempel haiku.

Haiku har enkeltstavelser som grunnelement. Den første linja har fem stavelser, den andre sju, og den tredje fem. Siden dette mønsteret er enkelt å beskrive i kode, så skulle det i alle fall være en grei oppgave å generere syntaktisk korrekte haiku.

Haikugeneratoren

Etter en ettermiddag med koding hadde jeg laget et python-script som produserte snutter som dette:

Ok, det er ikke stor poesi, men antallet stavelser er i alle fall riktig.

Måten dette scriptet fungerer på er at det laster inn en json-fil med ord kategorisert etter ordklasse og sortert på antall stavelser. For hver linje velges så tilfelige ord innenfor stavelsesbudsjettet helt til antall stavelser på linja er riktig.

Neste steg var å få haikuene til å i alle fall nærme seg en slags semantisk struktur. I følge wikipedia er det to elementer som brukes i tradisjonelle haiku i tillegg til stavelsesmønsteret. Det første er Kigo, et ord om impliserer en årstid. For å sørge for at vi får med en del ord i denne sjangeren er det nødvendig å definere hvilke ordklasser vi ønsker i en linje.

For å kunne styre hva slags ord som blir brukt i hver linje ble generatoren utvida til å kunne ta i mot setningsmønster. De består av lister av ordlassene som skal med på en linje, i rekkefølge. ["NOUN", "ADJ"] vil for eksempel gi en linje som alltid starter med et substantiv og deretter et adjektiv. Om det deretter gjenstår stavelser i budsjettet fylles linja opp med tilfeldige ord. Ved å kreve at første og siste linje starter med et adjektiv fulgt av et substantiv, eller bare et substantiv får man dikt på følgende format:

Problemet som melder seg nå er at mange av substantivene ikke egentlig har så mye med årstid å gjøre. Tyttebær kan forbindes med høst, mens trerot og fjell er mer nøytrale. For å løse dette kreves flere kategoriseringer av ord enn bare ordklasser. Det får imidlertid bli senere. Først må det neste elementet med: Kireji

Kireji er et ord som i følge wikipedia

"can be difficult to define"

Men essensen er visst at et kireji skal lukke diktet eller dele det opp i flere tanker. I praksis brukes gjerne et japansk gramatikalsk partikkel. Disse partiklene finnes jo naturligvis ikke på norsk, så steg én blir å prøve med spørreord, preposisjoner eller lignende.

Før vi kan gjøre det må imidlertid setningsgeneratoren støtte ord som legges til på slutten av en linje. Vi definierer syntaksen til å være "_<ordklasse>". Parseren jobber seg fremdelses fra høyre til venstre, men om en ordklasse har _ så legges den til bakerst og ikke forerst på linja.

Generatoren har en forkjærlighet for Gerhardsen.

Den har også blitt svært glad i å bruke spørreord over det hele. Dette kommer av at alle ordklasser er like sannsynlige å velge når det skal velges tilfeldig. Dette motiverer en ny funksjon: å nekte en ordklasse. Dette gjøres med "^<ordklasse>" i setningsmønsteret.

(På dette punktet begynner setningsdefinisjonsspråket å skli litt ut. Dette skyver vi under teppet inntil videre)

Nå som det er mulig å unngå spørreord i en gitt linje blir diktene litt mer kontrolerte.

Videre arbeid

På dette punktet er det tre naturlige veier videre.

  • Redesigne språket som brukes for å definere hvordan en linje skal genereres.
  • Legge til mer metainfo om ord. Kategoriseringsinfo og gramatikkinfo
  • Finne en måte for å gjøre om en tekstsamling til en ordliste med både gramatikkinformasjon og antall stavelser. Dette kommer til å kreve no litt voksen NLP

Men inntil videre får dette være greit. Du får elendige haiku servert på mjukvarelauget.no, og koden ligger på GitHub