k47.cz
mastodon twitter RSS
bandcamp explorer

Statistický generátor textu

— k47 (CC by)

Jednoduchý statistický generátor textu založený na principu Markovova řetězce. Funguje tak, že ze vstupního textu, postaví model reprezentující, jaká slova jak často následují po daných n-gramech (konkrétně bi-gramech). Když je model hotový, stačí mu zadat počáteční n-gram, program podle zjištěných pravděpodobností ybere následující slovo. Tohle slovo se pak stane součástí aktuálního n-gramu, vybere se, co po něm bude následovat a takhle to pokračuje dál.


Zkusmo jsem generátor nakrmil všemi svými povídkami a jeho snažení se automaticky publikuje na twitterovém účtu @robopovidka.


// you need Scala 2.10 to run this

val text = ???

// we are interested in bi-grams
val n = 2

// map from ngrams to seq of following words
val map = collection.mutable.Map[Seq[String], Seq[String]]() withDefaultValue Seq()

val words = text.toLowerCase.split("(?U)\\W+").toVector

for (ngram :+ next <- words sliding n+1)
  map(ngram) = map(ngram) :+ next

// generate text
var firstNgram, lastNgram = Seq("anomalocaris", "detrimentum", "něco").take(n)

val generatedWords = for (i <- 1 to 5000) yield {
  map.get(lastNgram) match {
    case Some(nextWords) =>
      val idx = util.Random.nextInt(nextWords.size)
      val next = nextWords(idx)
      lastNgram = lastNgram.tail :+ next
      Some(next)
    case None =>
      None
  }
}

var length = 0
for (w <- firstNgram ++ generatedWords.flatten) {
  length += w.length + 1

  if (length > 140) {
    length = w.length + 1
    println()
  }
  print(w+" ")
}
println()

Podobnost s Laholátorem je čistě náhodná a zcela neúmyslná.

píše k47, ascii@k47.cz