{"id":19703447,"url":"https://github.com/levysoft/markov-text-generator","last_synced_at":"2025-08-18T11:47:21.867Z","repository":{"id":219285634,"uuid":"748659644","full_name":"levysoft/markov-text-generator","owner":"levysoft","description":"Using a Markov chain to generate readable nonsense","archived":false,"fork":false,"pushed_at":"2024-07-14T12:21:18.000Z","size":622,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-27T16:56:58.520Z","etag":null,"topics":["markov-chain","natural-language-processing","open-source","python","text-generation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/levysoft.png","metadata":{"files":{"readme":"README.it.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-26T13:39:45.000Z","updated_at":"2024-12-06T11:58:43.000Z","dependencies_parsed_at":"2024-01-26T21:46:19.778Z","dependency_job_id":"b51d4468-8c3a-4bf3-b581-05af52e0fc6b","html_url":"https://github.com/levysoft/markov-text-generator","commit_stats":null,"previous_names":["levysoft/markov","levysoft/markov-text-generator"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/levysoft/markov-text-generator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levysoft%2Fmarkov-text-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levysoft%2Fmarkov-text-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levysoft%2Fmarkov-text-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levysoft%2Fmarkov-text-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/levysoft","download_url":"https://codeload.github.com/levysoft/markov-text-generator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levysoft%2Fmarkov-text-generator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270988167,"owners_count":24680669,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["markov-chain","natural-language-processing","open-source","python","text-generation"],"created_at":"2024-11-11T21:17:53.712Z","updated_at":"2025-08-18T11:47:21.802Z","avatar_url":"https://github.com/levysoft.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Markov Text Generator\n\n[ [English](README.md) | [Italiano](README.it.md) ]\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"logo.png\" alt=\"Markov Text Generator\"\u003e\n\u003c/p\u003e\n\n## Catena di Markov per la Generazione di Nonsense Leggibili\nMarkov è un generatore di testo che utilizza una semplice catena di Markov per produrre testo leggibile ma privo di significato.\nQuesta tecnica, sebbene generi prosa che non ha molto valore letterario, è sorprendentemente utile per prevedere la prossima parola, simile ai suggerimenti della tastiera del telefono.\n\n## Ispirazione\nQuesto progetto è stato ispirato dall'articolo \"_Understanding Markov Chains_\" di Ben Hoyt (https://benhoyt.com/writings/markov-chain/) e dal Capitolo 3 del libro \"_The Practice of Programming_\" di Kernighan and Pike (https://www.cs.princeton.edu/~bwk/tpop.webpage/). In particolare, l'articolo di Hoyt fornisce una spiegazione chiara dell'algoritmo e delle sue applicazioni, che vanno oltre la semplice generazione di testo.\nSuccessivamente mi sono ispirato all'articolo \"_Markov Chains are the Original Language Models_\" di Elijah Potter (https://elijahpotter.dev/articles/markov_chains_are_the_original_language_models) per creare anche una versione interattiva.\n\n## Algoritmo\nL'algoritmo inizia con un testo di input da cui generare l'output. Per ogni coppia di parole nel testo di input, registra una lista delle possibili parole che possono seguire la coppia. Una volta costruita questa struttura dati, è possibile generare output di qualsiasi lunghezza. Si inizia con una coppia di parole presente nell'input e si sceglie casualmente una delle possibili terze parole. Si procede poi spostandosi di parola in parola.\n\n## Esempio\nPer illustrare, utilizziamo un input piccolo come gli ultimi cinque dei Dieci Comandamenti dalla Bibbia del Re Giacomo. La struttura di \"terze parole possibili\" per alcune entrate iniziali sarebbe:\n\n- shalt not: kill. | commit | steal. | bear | covet | covet\n- Thou shalt: not | not | not | not | not\n\nE così via. L'output generato rifletterà la struttura e il \"sapore\" del testo di input, aggiungendo un tocco di originalità.\n\n## Implementazione in Python\nIl codice è conciso e leggibile, composto da meno di 25 linee. Questo codice prevede che il numero di parole venga passato come argomento da riga di comando e che il testo di input venga fornito su stdin.\n\n## Riferimenti per i File di Training\nÈ possibile usare vari testi liberamente accessibili in formato txt come input per la generazione di contenuti la catena di Markov. Di seguito, i riferimenti ai testi utilizzati:\n\n- Messaggio di Fine Anno del Presidente della Repubblica Sergio Mattarella (italiano): [https://www.quirinale.it/elementi/103914](https://www.quirinale.it/elementi/103914) (qui trovate l'archivio completo (italiano): [https://www.quirinale.it/ricerca/Discorsi](https://www.quirinale.it/ricerca/Discorsi))\n- Le avventure d'Alice nel paese delle meraviglie di Lewis Carroll (italiano): [https://www.gutenberg.org/ebooks/28371](https://www.gutenberg.org/ebooks/28371)\n- Le avventure d'Alice nel paese delle meraviglie di Lewis Carroll (inglese): [https://www.gutenberg.org/ebooks/19033](https://www.gutenberg.org/ebooks/19033)\n- Discorso di John Fitzgerald Kennedy per l'accettazione della nomina a presidente dal Partito Democratico (inglese): [https://www.jfklibrary.org/learn/about-jfk/historic-speeches/acceptance-of-democratic-nomination-for-president](https://www.jfklibrary.org/learn/about-jfk/historic-speeches/acceptance-of-democratic-nomination-for-president)\n\n## Esecuzione\nPer eseguire lo script, utilizza il seguente comando:\n\n```bash\npython3 markov.py \u003cnumero_parole\u003e \u003cfile_testo\u003e\n```\nDove `\u003cnumero_parole\u003e` è il numero di parole che vuoi generare e `\u003cfile_testo\u003e` è il percorso al file di testo di input.\n\n## Test markov.py\n\n```bash\npython3 markov.py 100 ./training-texts/Alice.txt\n\nBruco con disprezzo. \"Chi siete _voi_?\" E ciò li ricondusse da capo al\nprincipio della conversazione. Alice rispose con un cavallo di\nvetturale, così per alimentare la conversazione. \"Eh sì,\" rispose la\ncuoca. \"Di melazzo,\" soggiunse una voce rabbiosa--quella del\nConiglio:--\"Gianni! Gianni! Dove sei?\" E rispose una voce sonnolenta\ndietro ad un usciere, \"Recatemi la lista de' cantanti. \"Potete\nandare,\" disse il Bruco pipò senza dir nulla sullo sbaglio che il\nrimaner col Grifone non l'ha mai imparata.\" \"Non ebbi tempo,\" rispose\nil Ghiro, \"e si chiamavano Elce, Clelia e Tilla; e dimoravano nel\nfondo del pozzo?\" Il Ghiro scosse il capo;\n```\n\n```bash\npython3 markov.py 100 ./training-texts/Mattarella.txt\n  \nColtivarne la cultura nel sentimento delle nuove generazioni. Di\nfronte alle quali si presentano oggi, e nel loro possibile avvenire,\nbrutalità che pensavamo, ormai, scomparse; oltre che condannate dalla\nstoria. La guerra non nasce da sola. Non basterebbe neppure la spinta\ndi tante armi, che ne sono lo strumento di morte. Così diffuse. Sempre\npiù letali. Fonte di enormi guadagni. Nasce da quel che c’è nell’animo\ndegli uomini. Dalla mentalità che si autoalimenta, sta generando un\nprogresso inarrestabile. Destinato a modificare profondamente le\nnostre abitudini professionali, sociali, relazionali. Ci troviamo nel\nmezzo di quello che verrà ricordato come il grande balzo storico\n```\n\n# Markov Interactive Script\nHo pensato di creare lo script Python markov-interactive.py per implementare una catena di Markov in modo che generasse testo in modo interattivo, permettendo all'utente di scegliere la parola successiva basata su percentuali calcolate dalla frequenza di comparsa nel testo di input. \n\nL'idea è di esplorare come le sequenze di parole (o \"stati\") si susseguono in un testo fornito, offrendo un'esperienza diretta nella generazione di testo basata su probabilità e consentendo agli utenti di influenzare direttamente il percorso della generazione del testo scegliendo tra le parole successive proposte.\nCiò, implicitamente, permetterà di esplorare la varietà linguistica e le potenziali direzioni narrative che emergono dall'utilizzo di diversi testi di input.\n\n## Funzionamento\nLo script lavora in due fasi principali:\n\n1. **Calcolo delle Percentuali:** Per ogni coppia di parole nel testo (`prefix`), calcola le percentuali per ogni possibile parola successiva. Questo passaggio si basa sul numero di volte che ogni parola segue direttamente la coppia data.\n\n2. **Selezione Interattiva:** Presenta all'utente una lista numerata di parole possibili con le relative percentuali. L'utente seleziona il numero corrispondente alla parola desiderata per costruire progressivamente una nuova sequenza di testo.\n\n## Esecuzione\nPer eseguire lo script, utilizza il seguente comando:\n\n```bash\npython3 markov-interactive.py \u003cnumero_parole\u003e \u003cfile_testo\u003e\n```\n\nDove `\u003cnumero_parole\u003e` è il numero di parole che vuoi generare e `\u003cfile_testo\u003e` è il percorso al file di testo di input.\n\n## Test markov-interactive.py\n\n```bash\npython3 markov-interactive.py 100 ./training-texts/Alice.txt\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò\n--------------------------------------------------\n\nOpzioni per 'Alice afferrò':\n1. il: 100.00%\nScegli il numero della prossima parola: 1\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il\n--------------------------------------------------\n\nOpzioni per 'afferrò il':\n1. bimbo: 100.00%\nScegli il numero della prossima parola: 1\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo\n--------------------------------------------------\n\nOpzioni per 'il bimbo':\n1. guaiva: 20.00%\n2. su: 20.00%\n3. in: 20.00%\n4. ma: 20.00%\n5. porcellino: 20.00%\nScegli il numero della prossima parola: 2\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo su\n--------------------------------------------------\n\nOpzioni per 'bimbo su':\n1. e: 100.00%\nScegli il numero della prossima parola: 1\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo su e\n--------------------------------------------------\n\nOpzioni per 'su e':\n1. giù: 100.00%\nScegli il numero della prossima parola: 1\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo su e giù\n--------------------------------------------------\n\nOpzioni per 'e giù':\n1. provando: 50.00%\n2. con: 50.00%\nScegli il numero della prossima parola: 2\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo su e giù con\n--------------------------------------------------\n\nOpzioni per 'giù con':\n1. molta: 100.00%\nScegli il numero della prossima parola: 1\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo su e giù con molta\n--------------------------------------------------\n\nOpzioni per 'con molta':\n1. allegrezza: 5.26%\n2. civiltà:: 5.26%\n3. gravità: 5.26%\n4. avvedutezza: 5.26%\n5. violenza,: 5.26%\n6. ansietà: 5.26%\n7. deferenza.: 5.26%\n8. curiosità,: 5.26%\n9. delicatezza.: 5.26%\n10. premura.: 5.26%\n11. delicatezza:: 5.26%\n12. garbatezza,: 10.53%\n13. curiosità.: 5.26%\n14. premura: 10.53%\n15. sollecitudine,: 5.26%\n16. enfasi,: 5.26%\n17. delicatezza: 5.26%\nScegli il numero della prossima parola: 17\n\n--------------------------------------------------\nTesto corrente:\nAlice afferrò il bimbo su e giù con molta delicatezza\n--------------------------------------------------\n```\n\n## Note sulla Generazione di Testo\n- **Testi con Limitata Varietà di Transizioni:** Se il testo di input presenta una limitata varietà di sequenze di parole, potresti notare che le percentuali tendono spesso al 100% per la parola successiva, indicando una sola opzione possibile.\n\n- **Uso di Testi Vari e Ricchi:** Utilizzando testi con maggiore varietà linguistica (come \"Alice nel Paese delle Meraviglie\"), lo script offre una gamma più ampia di scelte, rendendo la generazione di testo più dinamica e imprevedibile.\n\nQuesto comportamento rispecchia la natura delle catene di Markov, che si basano esclusivamente sulla frequenza delle parole senza considerare il contesto più ampio o la coerenza grammaticale.\n\n## Conclusione\nL'algoritmo di catena di Markov, nonostante la sua semplicità, è un'introduzione pratica al concetto di catene di Markov che rivela come una struttura dati semplice e un generatore di numeri casuali possano produrre output affascinanti, semplicemente \"remixando\" testi esistenti in modi nuovi e creativi.\n\n## Considerazioni sul Pappagallo Stocastico\nHo realizzato questo progetto per dimostrare che il termine Pappagallo stocastico è un po' fuori luogo per gli LLM. Infatti, come potete vedere dal mio progetto, le catene di Markov sono concettualmente più vicine all'idea di un \"pappagallo stocastico\" rispetto ai Large Language Models (LLM) come GPT-3 e GPT-4. Questo perché le catene di Markov operano attraverso la generazione di sequenze basate su probabilità di transizione da uno stato all'altro, senza memoria del passato tranne l'ultimo stato (o gli ultimi stati, nelle catene di Markov di ordine superiore). Questo meccanismo di generazione di testo basato sulle probabilità senza una comprensione del contesto più ampio o delle strutture grammaticali complesse può essere paragonato a un pappagallo che ripete frasi senza realmente comprendere il loro significato.\n\nI LLM, d'altro canto, utilizzano architetture di rete neurale profonda e tecniche di addestramento avanzate per \"apprendere\" dalla vasta quantità di testo su cui sono addestrati. Sono in grado di generare testo che non solo segue le probabilità statistiche di parole o frasi basate sul contesto immediato, ma che può anche riflettere una comprensione del contesto più ampio, della coerenza tematica, e persino di nozioni di logica e senso comune. In effetti, se i primi modelli di linguaggio o quelli più semplici, possono sembrare che stiano semplicemente \"ripetendo\" ciò che hanno visto, anche se con una certa variabilità casuale, i modelli più avanzati come GPT-3 o GPT-4 (e oltre) vanno ben oltre la semplice ripetizione, dimostrando capacità di generare testo che riflette comprensione del contesto, coerenza logica, e persino creatività.\n\n## Licenza\nQuesto progetto è liberamente ispirato e basato su concetti esposti nell'articolo di Ben Hoyt e nel libro di Kernighan e Pike. Sei libero di utilizzare, modificare e distribuire il codice come preferisci.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevysoft%2Fmarkov-text-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flevysoft%2Fmarkov-text-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevysoft%2Fmarkov-text-generator/lists"}