Generación de palabras en cadena ingenua de Markov


9

Hay muchas formas de generar palabras aleatorias. Puede tomar sílabas aleatorias de un conjunto, puede usar n-tuplas, probablemente redes neuronales (¿qué no pueden hacer?), Alternando entre consonantes y vocales, etc. El método en el que se basa este desafío es, con mucho, el peor . Utiliza una cadena de Markov para generar palabras aleatorias. Si conoce las cadenas de Markov, probablemente sepa por qué este método es tan terrible.

Si desea leer sobre las cadenas de Markov, haga clic aquí .

Su programa tomará una entrada de una o más palabras y generará una sola palabra aleatoria, a través del método de una cadena de Markov ponderada. Dado que eso probablemente no tiene sentido para nadie más que para mí, aquí hay una explicación a través del uso de una imagen de la cadena de Markov con la entrada de abba:

Una cadena de Markov para <code> abba </code>

(Todos los pesos de los bordes son iguales para todas las imágenes) Su programa generará la ruta a través de una cadena de Markov basada en el texto de entrada. Como puede ver, hay una probabilidad de 1/2 de que salga a, una probabilidad de 1/8, una probabilidad de aba1/16, una probabilidad de abba1/32 ababa, etc.

Aquí hay algunos otros ejemplos de cadenas de Markov:

yabba dabba doo

ingrese la descripción de la imagen aquí

wolfram

ingrese la descripción de la imagen aquí

supercalifragilisticexpialidocious

ingrese la descripción de la imagen aquí

Si quieres más ejemplos, usa esto . (Trabajé demasiado duro en eso)

Detalles del desafío:

  • La entrada puede tomarse como una lista de cadenas, o como una cadena separada por espacios, comas o líneas nuevas
  • Puede suponer que todas las palabras estarán en minúsculas sin puntuación (ASCII 97-122)
  • Puedes escribir un programa o una función
  • Para probar, probablemente podría ingresar los ejemplos y ver si todas las entradas se alinean con las cadenas de Markov

Este es el , por lo que su programa se puntúa en bytes.

Avíseme si alguna parte de esto no está clara e intentaré que tenga más sentido.


Probablemente tenga sentido para un pueblo bastante libre, porque Chatgoat y Marky son dos chatbots de Markov ponderados IIRC.
Solo ASCII

No entiendo la relación entre la entrada y esas cadenas de Markov. A veces parece ser imposible producir la palabra de entrada utilizando una ruta en la cadena dada (por ejemplo, "yabba dabba doo". No hay bucle automático para bque no pueda producir un doble b. Además, una vez que llega a un bno parece posible volver al startpara producir las otras palabras). Creo que debe aclarar cuáles son los requisitos ...
Bakuriu

@Bakuriu el error en el yabba dabba dooes un accidente. Lo arreglaré lo antes posible. En cuanto a la imposibilidad de volver a comenzar, solo genera una palabra a partir de un conjunto de palabras dado . ¿Eso lo aclara?
DanTheMan

Respuestas:


5

Pyth, 38 32 bytes

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

¡Gracias a FryAmTheEggman por 5 bytes! Para ser honesto, comencé a escribir la respuesta de Python cuando noté que alguien había publicado una muy similar, así que decidí desafiarme con algo nuevo, así que reescribí mi respuesta (que era básicamente la respuesta de Pietu) en Pyth.

La entrada es una matriz de cadenas ["Mary" , "had" , "a" , "little"]


Buen primer mensaje, la bienvenida a PPCG :) Algunos consejos de golf: Fes solamente siempre útil cuando la variable Vsería el uso se invalida cuando no se quiere que, para que pueda cambiar la primera Fda Vy reemplazar dcon Notros lugares. [)alrededor de un elemento es lo mismo que ]. En lugar de agregar a una lista, puede usar append ( a) para guardar el casting. Más en general, creo que probablemente puedas acortar esto si adoptas un enfoque más funcional. Tampoco estoy seguro de para qué +kJsirve, ¿agregar la cadena vacía a una cadena debería ser un noop?
FryAmTheEggman

¡Gracias! Me encantaría adoptar un enfoque más funcional, lamentablemente, no estoy bien versado en cosas funcionales (las expresiones lambda son probablemente mi experiencia más cercana). Gracias por los bytes por cierto!
Lause

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

Toma una serie de cadenas como ["yabba", "dabba", "doo"].

Ejemplo de salidas con esa entrada:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

También quiero resaltar este resultado.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

La entrada es stdin, cadenas separadas por nueva línea.

¡QPaysTaxes ayudó mucho a jugar golf!

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
Agradecería el crédito: D (Algo así como "gracias a QPaysTaxes por la ayuda en el golf" o algo similar parece común por aquí)
Financia la demanda de Mónica el

1

Matlab, 160 bytes

Toma la entrada como una matriz de celdas de cadenas, como {'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))

Esto lee las palabras y las convierte en un vector de valores ASCII, con un 96 para marcar el comienzo de una palabra y un 123 para representar el final de una palabra. Para construir una palabra aleatoria, comience con un 96. Busque todos los enteros que siguen al 96 en el vector y tome una muestra aleatoria de ellos para elegir la siguiente letra. Repita esto, buscando todos los enteros que siguen al actual, hasta llegar a 123, que señala el final de la palabra. Convierta de nuevo a letras y visualice.

La entrada {'yabba','dabba','doo'}produce resultados como da. Estos son los resultados de las carreras de diez: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.