Ecco un algoritmo basato su parole leggermente più sofisticato scritto in Scala , che tiene conto delle probabilità di sequenze di parole di lunghezza arbitraria. (Questo non è l' algoritmo di stampa dissociato originale .)
L'algoritmo è il seguente. In ogni passaggio selezionare una metà mobile del testo che inizia in una posizione casuale, cercare la sequenza di coda più lunga delle parole di output che si verifica in quella metà (potrebbero essere 0 parole) e produrre la parola successiva.
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("")(_ + " " + _))
Ecco un esempio di output generato anche dall'articolo di Wikipedia sulle catene markov:
oggi le distribuzioni stazionarie non saranno uniche I probabilità soddisfano la posizione di destra non la distribuzione della probabilità di transizione può essere rappresentata mappando solo se i parametri sull'unità del sistema, permettendo a n di essere unici, in quanto i nella distribuzione stazionaria o misura invariante se soddisfa la distribuzione stazionaria per Q.
A proposito, se usi "[a-zA-Z .,!?]".r
come wordregex
puoi usare questo per generare anche stampe dissociate basate su lettere:
Questo momento o periodi in cui una backgrobability il Pater ext afferma con stochare un numero di classi detelemely se la classe di Mi pimatransie, apre che il nnn bisogno di uno stato del sistema è un errore, quindi limita tutte le attività.
Diventa davvero interessante con un file di testo di grandi dimensioni come il file Jargon . Ora la lettera è già abbastanza buona:
Un altro algoritmo di direzione sarà felicemente un errore e non comune; è stata una scorciatoia per "essere proms, e meta-location hack con decenni costruiti attorno alla postazione di accesso pre-Internet per Mac LISP. Questo potrebbe essere morto. Un certo numero di concorrenti, un popolare compilatore finisce ripetutamente al secondo, ed è stato organizzato con sanguisuga. con l'incontro in rete, in particolare da una rete. Di solito `cliente e sul chad lo riporta su carta. Molti avevano proprietà uniche.
Wordbased diventa abbastanza divertente:
Da allora questo è stato segnalato. L'unica cosa che prevede una perdita di risorse n. Un costrutto di linguaggio semi-mitico in un modo incoerente perché non può adattarsi in primo luogo. Se entri in un computer in modo giocoso e finisci Ottieni un vero computer! imp. Invito sarcastico a dire Talking. I cavi piccoli sono stati accusati di una vera programmazione. Pascal dieci anni dopo, ma la maggior parte dei nostri prodotti non è esattamente la stessa sottostruttura moderna. C'è qualche disputa sul fatto che questa voce sia la madre di tutti.