- Inspiré du programme Mark V. Shaney des années 1980, un générateur de texte de Markov simple, Mark V. Shaney Junior, a été créé en environ 30 lignes de code Python
- Ce modèle prédit probabilistiquement le mot suivant à partir de trois mots (trigramme) et utilise comme données d’entraînement plus de 200 billets de blog (environ 200 000 mots)
- Les phrases générées prennent la forme d’un charabia (gibberish) mêlant des mots liés à Lisp, Emacs, les mathématiques et la programmation, thèmes récurrents du blog
- Quand on augmente l’ordre du modèle, les phrases deviennent plus cohérentes, mais à partir de 5 il recopie le texte source tel quel, ce qui fait disparaître la créativité
- Même à l’ère des grands modèles de langage (LLM), la clarté structurelle de ces modèles de Markov simples est présentée comme un bon point de départ pour comprendre les principes de la génération de langage
Aperçu du programme Mark V. Shaney Junior
- Mark V. Shaney Junior est un générateur de texte qui imite l’utilisateur virtuel Mark V. Shaney, actif sur Usenet dans les années 1980
- L’original était un programme qui générait automatiquement des messages à l’aide d’un modèle de Markov
- Cette implémentation en est une version minimaliste simplifiant l’idée, publiée sur GitHub
- L’ensemble du code tient dans environ 30 lignes de Python et privilégie la simplicité plutôt que l’efficacité
- Même une personne découvrant les modèles de Markov pour la première fois peut le comprendre en moins de 20 minutes
La programmation expérimentale comme loisir
- L’auteur aime programmer non pour résoudre un problème précis, mais pour explorer des idées
- Il a expérimenté à plusieurs reprises des chaînes de Markov avec divers espaces d’états
- Il rassemble ensuite ces codes expérimentaux et les partage sur GitHub ou Codeberg
- Mark V. Shaney Junior est lui aussi l’un de ces essais, publié après avoir été suffisamment peaufiné
Génération de texte à partir des données du blog
- Après avoir testé le modèle en l’entraînant sur A Christmas Carol de Charles Dickens, il a utilisé comme données d’entrée 24 années de billets de blog (plus de 200, environ 200 000 mots)
- Les commentaires (environ 40 000 mots) ont été exclus
- Les phrases produites prennent la forme de phrases illogiques mêlant commandes de programmation, termes mathématiques et commandes d’éditeur
- Exemple : des commandes Emacs, du code Lisp et des termes mathématiques combinés aléatoirement
- Certaines phrases reprennent des mots issus de billets précis du blog pour former des combinaisons dénuées de sens
- Exemple : “Lisp source file” et “self-esteem” sont extraits de billets différents puis assemblés
Propriété de Markov et structure de l’algorithme
- La configuration de base repose sur un trigramme (3 mots), avec une structure de map qui stocke les deux mots précédents comme clé (
key) et le troisième comme valeur (value) - Processus de génération du texte
- Sélection d’une paire de mots aléatoire → choix uniforme d’un des mots suivants possibles
- Répétition en formant une nouvelle paire avec le mot nouvellement choisi et le mot précédent
- Arrêt lorsqu’il n’y a plus de mot suivant ou lorsque la limite de 100 mots est atteinte
- Quand un même trigramme apparaît plusieurs fois, le mot suivant correspondant est stocké en doublon dans la liste, ce qui permet une sélection probabiliste proportionnelle à la fréquence d’apparition
- Ce processus est une transition probabiliste dépendant uniquement de l’état courant ; sous forme mathématique, il s’écrit
P(Xₙ₊₁ | Xₙ, Xₙ₋₁, …, X₁) = P(Xₙ₊₁ | Xₙ)- Cette propriété sans mémoire (memoryless) est au cœur de la propriété de Markov
Expériences supplémentaires et ajustement de l’ordre du modèle
- L’ordre par défaut est 2 et peut être modifié via un argument en ligne de commande
- En portant l’ordre à 3 ou 4, les phrases deviennent plus cohérentes et plus naturelles
- Exemple : génération de phrases relativement logiques mêlant commandes IRC et concepts mathématiques
- En revanche, quand l’ordre passe à 5, le modèle tend à reproduire textuellement le texte d’origine, et le charabia créatif (gibberish) disparaît
- Il est également possible de générer du texte à partir d’un prompt initial
- Exemple : en fournissant une phrase commençant par “Finally we”, on obtient une longue phrase mélangeant Emacs, MATLAB et GNU bash
L’intérêt d’un modèle simple
- En 2025, les grands modèles de langage (LLM) dominent, mais les modèles de Markov ne parviennent pas à capturer la structure globale ni les dépendances de long terme
- Malgré cela, grâce à la simplicité de leur conception et à la clarté de leur implémentation, ils gardent de la valeur comme modèle d’initiation pour apprendre les principes de la génération de langage
- L’auteur le décrit comme le « Hello, world » des modèles de langage
1 commentaires
Réactions sur Hacker News
Un Markov Model est une version statistique d’une machine à états qui génère probabilistiquement le token suivant uniquement à partir de l’état courant
Il faut définir clairement la relation entre états et tokens pour pouvoir avoir une discussion pertinente
Par exemple, si l’état est une fonction des k dernières observations, on parle alors de Markov Chain d’ordre k
On peut voir les RNN comme une extension où l’état est défini comme une fonction des états précédents et des tokens récents
Les probabilités de transition d’état peuvent être déterministes ou probabilistes, et la longueur du contexte peut aussi être définie de manière variable
Mais tous les Markov Models ne sont pas apprenables
Je me souviens avoir acheté un programme de ce genre chez Egghead Software en 1992 pour 3 dollars
J’y avais injecté des textes du type journal intime sur 5 ans, et j’avais bien ri en voyant le résultat
Pour un vieil exemple, on peut voir Babble 1.0.20 ainsi que ce fil de forum associé : Software Spotlight: Babble
Après avoir lu le billet, j’ai moi aussi essayé avec un modèle de Markov
J’ai commencé au niveau caractère, mais même en passant à un modèle d’ordre 2, il n’y avait pas de grande différence
En ordre 3 (trigram), c’est devenu un peu plus naturel
Ensuite, j’ai appliqué un modèle de Markov d’ordre 1 à un texte tokenisé avec BPE (Byte Pair Encoding), et le résultat était un peu plus cohérent
Mais en passant à l’ordre 2, il copiait le texte source tel quel — parce que le BPE supprimait les tokens répétés et rendait les transitions déterministes
En limitant le nombre de tokens (par ex. : 894 → 800), c’est redevenu non déterministe, et le texte est devenu légèrement plus naturel
Quand on monte trop haut en ordre (par ex. ordre 5), le texte donne une impression sèche, purement factuelle
Au final, les modèles de Markov sont simples, mais restent des outils très amusants pour expérimenter
Supprimer les chaînes où il n’y a qu’un seul token suivant pourrait aider, mais il y a aussi un risque d’effacer la structure grammaticale
Je cherche une meilleure façon d’éviter les longues chaînes uniques
S’il n’existe qu’un seul chemin possible, on réduit par exemple à 4 mots
Ou alors c’est simplement notre esprit qui cherche de l’ordre dans le chaos, alors qu’en réalité nous sommes seuls
J’avais moi aussi fait une expérience similaire autrefois
J’avais injecté dans un modèle de Markov environ 500 000 mots de fantasy et de SF écrits sur 20 ans, avec un curseur ajustable de 2 à 5-grammes
C’était une sorte de « puits de rêves » dans lequel je replongeais chaque fois que j’avais besoin d’inspiration
Ça me rappelait mon habitude d’enfant d’ouvrir une page au hasard dans le dictionnaire pour y trouver une idée d’écriture
Avec un corpus comme ça, il y aurait de quoi faire un projet assez amusant
Il y a même une vidéo de présentation
Est-ce qu’on pourrait entraîner un modèle personnel sur l’ensemble de mes écrits ?
J’aimerais savoir quels modèles et outils utiliser, et s’il pourrait écrire dans mon style sans system prompt
Et même au-delà, je me demande s’il pourrait répondre naturellement à des appels téléphoniques ou à des messages Discord
Il existe une fanfic Harry Potter générée avec une Markov Chain
Son titre est Harry Potter and the Portrait of What Looked Like a Large Pile of Ash
On peut la lire via ce lien sur botnik.org
Dès la première phrase, j’ai eu l’impression de lire un texte creux
À mon avis, il y a encore moins d’émotion ou de sens que dans le pire livre écrit par un humain
Des tentatives du genre « I Fed 24 Years of My Blog Posts to a Markov Model » sont déjà quelque chose que plusieurs LLM répètent depuis un moment
Un auteur comme Barbara Cartwright, qui a écrit plus de 700 romans sentimentaux assez similaires, semble pouvoir être reproduit avec un modèle de Markov
Ma femme rachète parfois par erreur un roman qu’elle a déjà lu, puis le relit
Je me souviens avoir vu des bots à base de Markov chain sur IRC au milieu des années 2000
Avant l’arrivée de GPT, on n’avait rien de mieux que ça
En réalité, c’est plus proche d’un modèle trigram que d’un Markov Model
En l’étendant à des 4-grammes ou plus, on obtiendrait des phrases bien plus naturelles
Il y a eu autrefois des recherches sur un modèle n-gram géant appelé « infini-gram », qui aurait montré, dans certains domaines, des performances proches de celles des LLM
Merci de partager 24 ans d’expérience et de réflexion
À une époque comme la nôtre, saturée de consommation et de stimulation, ce genre de partage sincère a quelque chose de particulièrement précieux