Aqui está um algoritmo baseado em palavras um pouco mais sofisticado, escrito em Scala , que leva em conta as probabilidades de seqüências de palavras de comprimento arbitrário. (Esse não é o algoritmo original da imprensa dissociada .)
O algoritmo é o seguinte. Em cada etapa, selecione uma metade rolante do texto, iniciando em uma posição aleatória, procure a sequência mais longa das palavras de saída que ocorre nessa metade (pode ser 0 palavras) e imprima a próxima palavra.
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("")(_ + " " + _))
Aqui está uma amostra de saída também gerada a partir do artigo da wikipedia sobre cadeias de markov:
Hoje, as distribuições estacionárias não serão únicas. As probabilidades satisfazem a posição direita e não a distribuição de probabilidade de transição pode ser representada mapeando apenas se os parâmetros na unidade do sistema, Permitindo que n seja único, em que i na distribuição estacionária ou medida invariante, se satisfaz a distribuição estacionária para Q.
A propósito, se você usar "[a-zA-Z .,!?]".r
como wordregex
você pode usar isso para gerar uma imprensa dissociada baseada em cartas:
Essa figura ou períodos em que uma probabilidade de o Estado-Membro estocar um número detelemely se houver uma classe de onde Mi pimatransie, abre que as nnn necessidades de um estado do sistema são erradas e limita todas as tarefas.
Fica realmente interessante com um arquivo de texto grande, como o arquivo Jargon . Agora, com base em cartas já é muito bom:
Outro algoritmo de direção terá erros felizes e incomuns; tem sido uma abreviação de "ser bailes de formatura e hackeamento de meta-localização com décadas construídas em torno da estação de trabalho de acesso pré-Internet do LISP Mac. Isso pode estar morto. Vários concorrentes, um compilador popular terminam repetidamente em segundo lugar e foram sanguessugas". com o encontrado na rede, especialmente a partir de uma rede.Em geral, `cliente e no Chade de volta ao papel.Vários tinham nas propriedades únicas.
Baseado em palavras torna-se bastante divertido:
Isso já foi relatado. A única coisa que espera um vazamento de recurso n. Uma construção de linguagem semi-mítica é inconsistente porque não pode se ajustar em primeiro lugar. Se você digitar um computador em um divertido e terminou Obter um computador real! criança levada . Convite sarcástico para dizer falando. Os pequenos cabos foram responsabilizados pela programação real. Pascal, dez anos depois, mas a maioria do nosso produto não é exatamente o mesmo subconjunto moderno. Há alguma disputa sobre se essa entrada é a mãe de todos.