Вот немного более сложный алгоритм на основе слов, написанный на Scala , который учитывает вероятности последовательностей слов произвольной длины. (Это не оригинальный алгоритм диссоциированной прессы .)
Алгоритм заключается в следующем. На каждом шаге выберите скользящую половину текста, начиная со случайной позиции, найдите самую длинную хвостовую последовательность выходных слов, которая встречается в этой половине (это может быть 0 слов), и выведите следующее слово.
import io._, collection.mutable.ArrayBuffer, util.Random
import java.io.FileInputStream
val lines = new BufferedSource(new FileInputStream("markov.txt")) getLines
val wordregex = "\\b[a-zA-Z]+\\b|[.,?!]".r
val words = lines flatMap (wordregex findAllIn _) toArray
val rollingwords = words ++ words.slice(0, words.length / 2)
val rnd = new Random()
val outwords = new ArrayBuffer[String]()
for (i <- 1 to 1000) {
val startposition = rnd nextInt (words.length * 2 / 3)
val half = rollingwords slice (startposition, startposition + words.length / 3)
var newword = ""; var n = 0; var index = 0
while (index >= 0 && n < half.length && n < outwords.length) {
index = half.indexOfSlice(outwords.takeRight(n))
if (index >= 0 && index < half.length - n) {
newword = half(index + n)
}
n = n + 1
}
outwords += newword
}
println(outwords.foldLeft("")(_ + " " + _))
Вот пример вывода, также сгенерированного из статьи в Википедии о цепях Маркова:
Сегодня стационарные распределения не будут уникальными. Вероятности удовлетворяют k положению стрелки, а распределение вероятностей перехода может быть представлено отображением только в том случае, если параметры на единицу системы, позволяющие n быть уникальными, в том смысле, что i в стационарном распределении или инвариантной мере, если оно удовлетворяет стационарному распределению для Q.
Кстати, если вы используете "[a-zA-Z .,!?]".r
как, wordregex
вы можете использовать это также для создания диссоциированной прессы на основе писем:
Это число или периоды, когда задняя черта состояния Pater ext со stochare несколько детерминируется, если класс, в котором Mi pimatransie, открывает, что потребность nnn в состоянии системы является ошибками, а затем выполняет все задачи.
Это становится действительно интересным с большим текстовым файлом, таким как файл Jargon . Теперь письмо на основе уже довольно хорошо:
Алгоритм другого направления будет радостным и необычным; это было сокращением для "выпускных вечеров и взлома мета-местоположения" с десятилетиями, построенными вокруг рабочей станции LISP Mac до доступа в Интернет. Это может быть мертвым. Мера конкурентов, популярный компилятор заканчивался неоднократно и был пиявкой. с обнаруженным в сети, особенно из сети. Обычно покупатель и чад это обратно на бумагу. Некоторые обладали уникальными свойствами.
Wordbased становится довольно забавным:
С тех пор об этом сообщалось. Единственное, чего ожидает один ресурс - утечка. Полумифическая языковая конструкция противоречива, потому что она не может быть адаптирована в первую очередь. Если вы введете компьютер в игривое и законченное, приобретите настоящий компьютер! имп. Саркастическое приглашение говорить. Маленький кабель обвиняли в реальном программировании. Паскаль спустя десять лет, но большинство нашего продукта не совсем того же современного субшелла. Существует некоторый спор о том, является ли эта запись у всех матерью.