Una cadena de Markov escribe frases nuevas mirando solo las últimas palabras y preguntando al corpus: «cuando vi esto, ¿qué vino después?». No hay modelo, no hay entrenamiento, no hay GPU — es contar. Esta página deja jugar con el mecanismo entero y ver, con números, dónde funciona y dónde se rompe.
El estado son las últimas N palabras (N = el orden). Para cada estado, el corpus dice qué palabras pueden seguir y cuántas veces aparecieron. Se elige una al azar, ponderada por esas veces, y el estado se desplaza una palabra. Nada más. Dale a siguiente, o pincha tú una candidata para llevar la frase donde quieras.
Dibujar la cadena entera sería una maraña ilegible: son cientos de nodos. Esto es el vecindario — de dónde vienes, dónde estás y a dónde puedes ir. Pincha un nodo para avanzar.
Aquí está la tensión que decide si esto sirve. Cada frase generada se compara con el corpus: si ya existía tal cual es una copia; si no, es nueva. Sube el orden y verás las copias dispararse; bájalo y verás frases nuevas que además dejan de tener sentido.
Todo lo de arriba corre sobre 60 frases de demo. Pega aquí las del grupo —
o arrastra un .txt — y la página recalcula el mecanismo, las
métricas y el coste en la placa con vuestros datos. Formato:
registro: frase, una por línea; las que empiezan por #
se ignoran.
No se sube nada a ningún sitio. La página no tiene servidor: el corpus se queda en tu navegador y desaparece al recargar.
Las dos primeras filas de novedad pueden moverse en sentidos opuestos, y eso enseña algo: si las frases que añades son variaciones de las que ya había, suman puntos de empalme (más frases nuevas distintas) pero también refuerzan los caminos viejos (baja el porcentaje de generaciones nuevas). Para ganar variedad de verdad, escribe frases que compartan trozos con las existentes sin ser casi la misma frase.
La pregunta que esta página no podía responder con 60 frases. Ahora sí, con las tuyas: se toman submuestras del corpus cargado y se mide la novedad de cada una. Si la curva sube, escribir más frases compra variedad; si se aplana, no.
Sobre este mismo corpus de demo (60 frases, 4 registros, 330 palabras), 200 generaciones por registro y orden:
| orden | copias literales | frases nuevas | calidad de las nuevas |
|---|---|---|---|
| 1 | 41–78 % | 126 | rotas concordancia y sentido se pierden |
| 2 | 78–100 % | 8 | buenas todas gramaticales y en registro |
| 3 | 94–100 % | 2 | buenas pero casi no hay |
La sorpresa fue el orden 2. La predicción era que el español se rompería por la concordancia — la perro contenta — y con orden 1 pasa exactamente eso. Pero con orden 2 los empalmes caen en fronteras de sintagma y las frases salen limpias:
¿Me trajiste algo o seguimos mirándonos? Descansa un poquito, yo te espero. Cuídate mucho, yo te acompaño.
Son frases buenas. El problema real no es la gramática: es el
rendimiento. De 60 frases escritas salieron 8 nuevas — un 13 % extra.
Y depende del registro de una forma que enseña algo: tierno y
juguetón recombinan porque comparten trozos («yo te», «con toda
la»); seco y dramático dieron cero, porque
frases cortas y muy distintas no comparten ningún par de palabras donde
empalmar.
Ya no hace falta creerse el caveat. Aquello de «60 frases es minúsculo, con más saldrá mejor» está medido: corriendo lo mismo sobre CESS-ESP, un corpus real de español de prensa (5.972 frases, 192.686 palabras), filtrado a frases de ≤12 palabras porque es nuestra forma:
| frases en el corpus | novedad, orden 2 |
|---|---|
| 60 | 12,8 % |
| 200 | 22,7 % |
| 920 | 44,7 % |
Escribir más frases paga, y mucho — de 60 a 920 la novedad se multiplica por 3,5, y a ~1.000 frases casi la mitad de lo que diga el buddy será una combinación que nadie escribió, por 61 KB de RAM. De paso valida el número de esta página: 12,8 % con 60 frases cortas de CESS contra el 10–13 % que da nuestro corpus de demo con 60. No era un artefacto del corpus de juguete.
Y la trampa que conviene conocer: con las frases completas de CESS (30 palabras de media) el orden 2 da 76,8 % de novedad ya con 60 frases. A igualdad de corpus, la longitud de frase importa más que el tamaño: 76,8 % contra 12,8 % con las mismas 60. Quien mida sobre prosa larga y extrapole a frases de buddy se llevará una decepción.
Lo que se rompe no es la gramática. Con orden 2 sobre frases cortas reales, la concordancia aguanta; lo que falla es el sentido:
Pero Germán de Granda es un baño turco. Acabar de una vez con el mar Negro.
Frases bien construidas que dicen disparates. Para un bicho de escritorio eso es más benigno que lo agramatical: una frase rota parece un bug, una frase correcta que dice algo absurdo parece surrealismo, y eso pasa por personalidad. Además el disparate aquí viene de que CESS mezcla política, deportes y finanzas con nombres propios; un corpus del buddy es semánticamente estrecho —todo son reacciones a una persona— así que los empalmes se quedan dentro del mismo tema.
Hay dos formas de usar esto, y no son excluyentes. La diferencia está en quién ve la frase antes que el humano que la va a leer en voz del buddy.
Decidido: el grupo prefiere variedad a corrección. Una frase rara de vez en cuando se acepta a cambio de que el buddy no repita nunca. Técnicamente no hay obstáculo: con 5.000 frases son ~282 KB de PSRAM y ~26 µs por frase — unas 40.000 veces más rápido que el modelo neuronal, que además necesita ~1,2 MB de pesos.
Lo que sí conviene saber al implementarlo, porque son mandos, no reglas:
Sigue mereciendo la pena aunque se genere en el dispositivo: pasas el corpus, sacas solo lo que no existía, alguien lee y se queda con lo bueno, y lo aprobado entra al banco de frases como una línea más. Eso mejora también la generación en vivo, porque un corpus más rico recombina mejor.
python3 markov.py corpus.txt --measure # ¿da para recombinar? python3 markov.py corpus.txt --memory # coste en el ESP32-S3 python3 markov.py corpus.txt --order 2 --new 50 > propuestas.txt
Los flags están en inglés porque el código del proyecto lo está; el corpus
sigue en español, que es el dato. --measure es lo mismo que la
sección 3 de esta página, en terminal y sobre el corpus entero;
--memory estima lo que costaría en la placa un puerto en C.
Es el mismo patrón de «generar y curar» que usamos con Claude para redactar frases. La diferencia es que Markov escribe con la voz del propio grupo, porque solo sabe recombinar lo que el grupo ya escribió.
Esto es la rampa de entrada perfecta al modelo neuronal: se entiende entero en una hora, la salida da risa, y deja clarísimo qué añade el modelo. Un modelo de lenguaje hace esto mismo — predecir la siguiente pieza — pero con memoria de toda la frase y probabilidades aprendidas en vez de contadas. Quien haya jugado con esta página entiende el modelo a la primera.