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á.