Naive Markov-Kettenwortgenerierung


9

Es gibt viele Möglichkeiten, zufällige Wörter zu generieren. Sie können zufällige Silben aus einer Menge nehmen, Sie können n-Tupel verwenden, wahrscheinlich neuronale Netze (was können sie nicht?), Die zwischen Konsonanten und Vokalen wechseln usw. Die Methode, auf der diese Herausforderung basiert, ist bei weitem die schlechteste . Es verwendet eine Markov-Kette, um zufällige Wörter zu generieren. Wenn Sie mit Markov-Ketten vertraut sind, wissen Sie wahrscheinlich, warum diese Methode so schrecklich ist.

Wenn Sie mehr über Markov-Ketten erfahren möchten, klicken Sie hier .

Ihr Programm nimmt ein oder mehrere Wörter auf und generiert ein einzelnes zufälliges Wort nach der Methode einer gewichteten Markov-Kette. Da dies wahrscheinlich nur für mich sinnvoll ist, folgt hier eine Erklärung anhand eines Bildes der Markov-Kette mit der Eingabe von abba:

Eine Markov-Kette für <code> abba </ code>

(Alle Kantengewichte sind für alle Bilder gleich.) Ihr Programm gibt den Pfad durch eine Markov-Kette basierend auf dem Eingabetext aus. Wie Sie sehen können, gibt es eine halbe Chance, die ausgegeben wird a, eine Chance von 1/8, eine Chance von aba1/16, eine Chance von abba1/32 ababausw.

Hier sind einige andere Beispiel-Markov-Ketten:

yabba dabba doo

Geben Sie hier die Bildbeschreibung ein

wolfram

Geben Sie hier die Bildbeschreibung ein

supercalifragilisticexpialidocious

Geben Sie hier die Bildbeschreibung ein

Wenn Sie weitere Beispiele wünschen, verwenden Sie diese . (Ich habe viel zu hart daran gearbeitet)

Details der Herausforderung:

  • Die Eingabe kann als Liste von Zeichenfolgen oder als durch Leerzeichen, Komma oder Zeilenumbrüche getrennte Zeichenfolge erfolgen
  • Sie können davon ausgehen, dass alle Wörter ohne Interpunktion vollständig in Kleinbuchstaben geschrieben sind (ASCII 97-122).
  • Sie können entweder ein Programm oder eine Funktion schreiben
  • Zum Testen könnten Sie wahrscheinlich die Beispiele eingeben und prüfen, ob alle Eingaben mit den Markov-Ketten übereinstimmen

Dies ist , daher wird Ihr Programm in Bytes bewertet.

Lassen Sie mich wissen, wenn ein Teil davon unklar ist, und ich werde versuchen, es sinnvoller zu machen.


Für ziemlich freie Leute macht es wahrscheinlich Sinn, weil Chatgoat und Marky beide gewichtete Markov-Chatbots IIRC sind.
Nur ASCII-

Ich verstehe die Beziehung zwischen dem Input und diesen Markov-Ketten nicht. Es scheint manchmal unmöglich zu sein , das Eingabewort durch Verwendung zu produzieren eine in der gegebenen Kettenbahn (zB „Yabba Dabba doo“. Keine Selbstschleife für bso dass Sie ein Doppel nicht produzieren können b. Außerdem , wenn Sie erreichen eine bes nicht möglich scheint zu kehre zu dem zurück start, um die anderen Wörter zu produzieren). Ich glaube, Sie müssen klären, was die Anforderungen sind ...
Bakuriu

@ Bakuriu der Fehler auf der yabba dabba dooist ein Unfall. Ich werde es so schnell wie möglich beheben. Wenn Sie nicht wieder zum Start zurückkehren können, generieren Sie nur ein Wort aus einem bestimmten Satz von Wörtern. Klärt das das?
DanTheMan

Antworten:


5

Pyth, 38 32 Bytes

VQJK1FZacN1k XKH]Z=KZ;WJ=JO@HJpJ

Vielen Dank an FryAmTheEggman für 5 Bytes! Um ehrlich zu sein, habe ich angefangen, Python-Antworten zu schreiben, als ich bemerkte, dass jemand eine sehr ähnliche Antwort gepostet hat. Deshalb habe ich beschlossen, mich mit etwas Neuem herauszufordern, und meine Antwort (die im Grunde Pietus Antwort war) in Pyth neu geschrieben.

Eingabe ist ein Array von Zeichenfolgen ["Mary" , "had" , "a" , "little"]


Nizza erster Beitrag, willkommen zu PPCG :) Einige Golf - Tipps: Fist immer nur dann nützlich , wenn der Variable Vwürde die Verwendung außer Kraft gesetzt wird , wenn Sie nicht wollen , um es zu, so dass Sie die ersten ändern Fdzu Vund ersetzen dmit Nanderen Ländern. [)um ein Element ist das gleiche wie ]. Anstatt zu einer Liste hinzuzufügen, können Sie adas Casting mit append ( ) speichern. Generell denke ich, dass Sie dies wahrscheinlich verkürzen können, indem Sie einen funktionaleren Ansatz wählen. Ich bin mir auch nicht sicher, wofür das +kJist. Das Hinzufügen der leeren Zeichenfolge zu einer Zeichenfolge sollte ein Noop sein.
FryAmTheEggman

Vielen Dank! Ich würde gerne einen funktionaleren Ansatz wählen, leider bin ich nicht gut mit funktionalen Dingen vertraut (Lambda-Ausdrücke sind wahrscheinlich meine engste Erfahrung). Danke übrigens für die Bytes!
Pause

4

Python 2, 138 133 Bytes

from random import*
M={}
for w in input():
 P=p=1
 for k in list(w)+[""]:M[p]=M.get(p,[])+[k];p=k
while P:P=choice(M[P]);k+=P
print k

Nimmt ein Array von Zeichenfolgen wie z ["yabba", "dabba", "doo"].

Beispielausgaben mit dieser Eingabe:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Ich möchte dieses Ergebnis auch hervorheben.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

Die Eingabe erfolgt durch standardmäßige, durch Zeilenumbrüche getrennte Zeichenfolgen.

QPaysTaxes hat beim Golfen sehr geholfen!

M={}
while gets
k=''
$_.each_char{|c|M[k]||=[];M[k]<<c;k=c}
end
k=''
print k=M[k].sample while M[k]

1
Ich würde mich über Kredit freuen: D (Etwas wie "Dank an QPaysTaxes für die Hilfe beim Golfen" oder ähnliches scheint hier üblich zu sein)
Fund Monica's Lawsuit

1

Matlab, 160 Bytes

Nimmt die Eingabe als Zellenarray von Zeichenfolgen, wie z {'string1','string2','string3'}.

s=input('');n=[];l=96;for i=1:numel(s);n=[n 96 double(s{i}) 123];end
while(l(end)<123);p=n(find(n==l(end))+1);l=[l p(randsample(nnz(p),1))];end
char(l(2:end-1))

Dies liest die Wörter und konvertiert sie in einen Vektor von ASCII-Werten, wobei eine 96 den Anfang eines Wortes markiert und eine 123 das Ende eines Wortes darstellt. Um ein zufälliges Wort zu konstruieren, beginnen Sie mit einer 96. Suchen Sie nach allen ganzen Zahlen, die auf 96 im Vektor folgen, und nehmen Sie eine zufällige Stichprobe aus diesen, um den nächsten Buchstaben auszuwählen. Wiederholen Sie diesen Vorgang und suchen Sie nach allen Ganzzahlen, die auf die aktuelle folgen, bis 123 erreicht ist, was das Ende des Wortes signalisiert. Konvertieren Sie es zurück in Buchstaben und zeigen Sie es an.

Die Eingabe {'yabba','dabba','doo'}erzeugt Ergebnisse wie da. Hier sind die Ergebnisse von zehn Läufen: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.