{"id":12978,"date":"2019-06-12T18:58:04","date_gmt":"2019-06-12T16:58:04","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=12978"},"modified":"2022-12-04T13:42:45","modified_gmt":"2022-12-04T12:42:45","slug":"markow-ketten-und-textgenerierung","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2019\/06\/markow-ketten-und-textgenerierung.htm","title":{"rendered":"Markow-Ketten und Textgenerierung"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2019\/06\/markow-ketten-und-textgenerierung.htm#comments'>2 Kommentare.<\/a>)<\/small> <\/div>\n<p>Ich entschuldige mich daf\u00fcr, dass ich das hier schreibe, weil es dazu so viel schon im Web gibt, und ich alles, was ich dazu wissen muss, in wenigen Minuten gefunden habe. Aber mein Blog ist ja auch Archiv.<\/p>\n\n\n\n<p>Automatische Textproduktion ist wohl gerade ein Thema. Manche Leute haben Angst vor &#8222;social bots&#8220;, kleinen Programmen, die selbstst\u00e4ndig und automatisch Nachrichten etwa bei Twitter verfassen, die klingen, als w\u00e4ren sie von einem Menschen geschrieben, und die zur politischen Einflussnahmen genutzt werden k\u00f6nnen. Anderswo hei\u00dft es, dass diese Angst v\u00f6llig unbegr\u00fcndet ist, weil es solche Programme in der freien Wildbahn gar nicht gibt. Im Guardian <a href=\"https:\/\/www.theguardian.com\/technology\/2019\/feb\/14\/elon-musk-backed-ai-writes-convincing-news-fiction\">stand neulich<\/a> etwas \u00fcber ein Programm, das so gut k\u00fcnstlichen Text (Sachtext oder fiktional) erzeugt, dass es nicht ver\u00f6ffentlicht wird.<\/p>\n\n\n\n<p>Darum geht es heute nicht, sondern um eine ganz simple Methode, Text zu generieren, der nur auf den allerersten Blick nat\u00fcrlich wirkt, und auf schon auf den zweiten hofft man, dass vielleicht irgendwas ein bisschen Sinn macht, und beim dritten gibt man auf. Hier zwei Beispiele:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p> vollen Backen verzehren und mir antwortete:\u2014ich fand ich mich auf mein Lieber, la\u00df uns so schwach, alles Gewehr geht vorbei wie er gewartet, h\u00e4tte mir mit mir selbst. Und da standen um mich, ob t\u00e4uschende Geister um zweimal im Kreise seiner Ehren und meinen Sinnen, und da\u2014wenn ich solle mit einer br\u00e4unlichen Farbe war, als das nicht zu rauben, das<br>(Goethe)<\/p><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>asked. They sat in the shadow the leaves.&#8220; &#8222;Good night,&#8220; the same.&#8220; &#8222;You do not wish he likes it.&#8220; &#8222;He&#8217;s lonely. I know.&#8220; &#8222;I want to be unjust. He should have everything I have everything I have killed himself last week,&#8220; he continued the wind. A clean, well-lighted cafe was not lonely. I&#8217;m not wish he said. Turning off the<br>(Hemingway)<\/p><\/blockquote>\n\n\n\n<p>Wie das geht: Man f\u00fcttert den Algorithmus mit einem mehr oder weniger kurzen Text.  Das folgende sch\u00f6ne Beispiel habe ich <a href=\"https:\/\/golang.org\/doc\/codewalk\/markov\/\">von dieser Seite geklaut,<\/a> die das Thema f\u00fcr die Sprache Golang betrachtet:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>I am not a number. I am a free man.<\/p><\/blockquote>\n\n\n\n<p>Dann geht der Algorithmus den Text Wort f\u00fcr Wort durch und legt f\u00fcr jedes Wort eine Liste an, die die im Text vorkommenden Folgew\u00f6rter enth\u00e4lt. F\u00fcr das Beispiel sieht das so aus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">I [ am am ]\nam [ not a ]\nnot [ a ]\na [ number free ]\nnumber. [ I ]\nfree [ man. ]\nman. [ ]<\/pre>\n\n\n\n<p>Nach dem &#8222;I&#8220; steht zweimal &#8222;am&#8220;, weil das Wort &#8222;I&#8220; zweimal von &#8222;am&#8220; gefolgt wird und sonst von nichts. Nach &#8222;man.&#8220; steht nichts, weil im Ausgangstext nach diesem Wort nichts anderes mehr kommt. Bei l\u00e4ngeren Texten ist das unwahrscheinlicher. Und dann nimmt man ein zuf\u00e4llig ausgew\u00e4hltes Wort aus dieser Sammlung (oder, wie im folgenden Beispiel, man f\u00e4ngt gleich mit &#8222;I&#8220; an) und w\u00e4hlt aus der Liste der Folgew\u00f6rter zuf\u00e4llig eines aus. Und dann macht man mit diesem Folgewort weiter, sucht sich einen von dessen Nachfolgern aus, und so weiter, bis entweder ein Wort kommt, das keinen Nachfolger hat (selten, eher bei kurzen Eingabetexten) oder bis man die gew\u00fcnschte Wortzahl zusammen hat. Heraus kommen dann zum Beispiel solche Texte:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">I am a free man.\nI am a number. I am not a free man.\nI am a number. I am a free man.\nI am not a free man.\nI am not a number. I am a number. I am not a number. I am a free man.\nI am not a number. I am not a free man.\nI am not a number. I am a free man.\nI am a number. I am a number. I am a free man.\nI am a number. I am a number. I am not a free man.\nI am not a number. I am not a number. I am not a free man.<\/pre>\n\n\n\n<p>Nach &#8222;man.&#8220; h\u00f6ren die Texte jeweils auf &#8211; klar, da geht es nicht weiter. Nach &#8222;a&#8220; kommt mit gleicher Wahrscheinlichkeit entweder &#8222;number&#8220; oder &#8222;free&#8220;. Nach &#8222;I&#8220; kommt mit einer Wahrscheinlichkeit von 1 &#8222;am&#8220;. (Tats\u00e4chlich w\u00e4re es vielleicht sauber, jede Instanz eines Folgewort nur einmal in einer Liste zu speichern, zusammen mit der relativen Wahrscheinlichkeit, wobei die Wahrscheinlichkeiten aller W\u00f6rter sich dabei zu 1 summieren m\u00fcssten. Aber bei relativ kleinen Texten ist das so einfacher.)<\/p>\n\n\n\n<p>F\u00fcr Hemingways &#8222;A clean, well-lighted place&#8220; sieht ein Teil des W\u00f6rterbuchs \u00fcbrigens so aus:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Hail [ nothing ]\nHe [ would disliked smiled was was did can has drinks might sat put should ]\nI [ am am have have.\" am wish have never should know.\" never ]\nI'm [ not ]\nIn [ the ]\nIt [ was was was was was is is was ]\nLook [ at ]\nMany [ must ]\nNor [ can ]\nNow, [ without ]\nOur [ nada ]<\/pre>\n\n\n\n<p>Weil das so viele W\u00f6rter sind, gehen wir erst einmal zur\u00fcck zu unserem kurzen Ausgangstext. Man kann die Information in dem W\u00f6rterbuch auch als Graph angeben:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"417\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-700x417.png\" alt=\"\" class=\"wp-image-12993\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-150x89.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-300x179.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-135x80.png 135w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Dabei ist jedes Wort, jeder Lexikoneintrag, ein Zustand des Systems, dargestellt als ein Knoten, verbunden mit den m\u00f6glichen Folgew\u00f6rtern durch gerichtete Kanten, die durch eine Gewichtung ausgezeichnet sind, die die Wahrscheinlichkeit des \u00dcbergangs angibt &#8211; es muss lediglich gelten, dass die Summe aller Kantengewichte, die von einem Knoten ausgehen, 1 ist. <\/p>\n\n\n\n<p>Klar, sch\u00f6ner w\u00e4re es, wenn man von &#8222;free&#8220; auch noch mit einer gewissen Wahrscheinlichkeit zu &#8222;number&#8220; k\u00e4me. Aber das kommt im &#8211; zugegeben sehr kurzen &#8211; Ausgangstext nun mal nicht vor. Eine Markow-Kette w\u00e4re das dann trotzdem.<\/p>\n\n\n\n<p>Man kann die \u00dcbergangswahrscheinlichkeiten der Zust\u00e4nde auch als Tabelle angeben:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"267\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-tabelle-700x267.png\" alt=\"\" class=\"wp-image-12996\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-tabelle.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-tabelle-150x57.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-tabelle-300x114.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette-tabelle-135x51.png 135w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Was eine Markow-Kette nun genau ist, muss ein Mathematiker erkl\u00e4ren. Hier geht es nur um die einfachen F\u00e4lle, mit endlich vielen Zust\u00e4nden, und \u00dcbergangswahrscheinlichkeiten, die nur vom letzten Zustand abh\u00e4ngen. Man k\u00f6nnte ja auch die <em>zwei<\/em> vorhergehenden W\u00f6rter heranziehen, um das Folgewort zu ermitteln.<\/p>\n\n\n\n<p>Markow-Ketten eignen sich wohl zur Simulation von Systemen, die sich damit gut simulieren lassen. :-)  Wenn man f\u00fcr ein Computerspiel zum Beispiel zuf\u00e4lliges Wetter braucht, kann man entweder jeden Tag neues Wetter ausw\u00fcrfeln mit 50% Chance f\u00fcr Sonne oder Regen, oder man erstellt eine Markow-Kette, wo man vom Zustand Sonne aus am n\u00e4chsten Tag mit 80% Wahrscheinlichkeit wieder im Sonnenzustand landet, aber mit 20% bei Regen &#8211; und der Zustand Regen funktioniert \u00e4hnlich. Dann \u00e4ndert sich das Wetter auch ab und zu, und es gibt eben so viele Sommer- wie Regentage, aber es gibt l\u00e4ngere Folgen und seltenere Wechsel.<\/p>\n\n\n\n<p>Zum Schluss noch ein Auszug aus der modifizierten Schulordnung f\u00fcr Gymnasien in Bayern:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>zugelassener Hilfsmittel bei ausreichendem Leistungsstand in Latein mindestens zwei Ausbildungsabschnitten 12\/1 ist, abgesehen vom Kurzreferat; 2. Nach Beginn der Gesamtnote \u201eausreichend\u201c oder staatlich genehmigten Ersatzschule abzunehmen, wenn nicht auf dem Abschlusszeugnis die Fortsetzung eines schul\u00e4rztlichen Zeugnisses eine mindestens 1 und Sch\u00fcler, die nach \u00a7 2 Satz 2 Satz 2, der m\u00fcndlichen Pr\u00fcfungen abgelegt und Gesellschaft. (3) F\u00fcr Schulaufgaben in eine \u00c4nderung der Nachpr\u00fcfung erfolgreich unterzogen haben, erhalten sie oder des Ausbildungsabschnitts 12\/1 oder dem doppelt gewichteten Durchschnitt der Schulleiter kann f\u00fcr den F\u00e4chern Deutsch, Mathematik (Abiturpr\u00fcfungsf\u00e4cher 1 und 3. am Kolleg kann bei der Jahrgangsstufe mit der \u00dcbertritt in einem vom Staatsministerium gesondert fest. 2Sch\u00fclerinnen und das Vorr\u00fccken gef\u00e4hrdet, so bem\u00fchen sich auf Ausschluss von Leistungsnachweisen und Recht sowie in der Hauptpr\u00fcfung dauern in Anlage 9 nach dem gew\u00e4hlten Ausbildungsrichtung hat die zweite Fremdsprache 1 Punkt bewertet. 8. \u00fcber das Ziel der Schulleiter festzusetzenden Frist, die sich auf einem Sch\u00fcler w\u00e4hrend der Realschule, die Belegung und Worten) ausgedr\u00fcckt, die Punktzahl der f\u00fcnf Abiturpr\u00fcfungsf\u00e4chern wird ermittelt, indem die ihnen die Schule wird in Satz 1 genannte Zeitpunkt. (4) W\u00e4hrend des Gymnasiums sind ferner am Musischen Gymnasien als Abiturpr\u00fcfungsf\u00e4cher ist und welche beiden F\u00e4cher (Abiturpr\u00fcfungsf\u00e4cher 4 erreicht haben sich die auch darauf<\/p><\/blockquote>\n\n\n\n<p>Links:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Sch\u00f6ne Seite, bei der man mit einfachen Markow-Ketten in Echtzeit experimentieren kann: <a href=\"http:\/\/setosa.io\/ev\/markov-chains\/\">http:\/\/setosa.io\/ev\/markov-chains\/<\/a><\/li><li>Sch\u00f6ne Erkl\u00e4rung, wie das mit der Textgenerierung geht, zusammen mit mehr oder weniger fertigem Python-Code: <a href=\"http:\/\/www.cyber-omelette.com\/2017\/01\/markov.html\">http:\/\/www.cyber-omelette.com\/2017\/01\/markov.html<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>(2 Kommentare.) Ich entschuldige mich daf\u00fcr, dass ich das hier schreibe, weil es dazu so viel schon im Web gibt, und ich alles, was ich dazu wissen muss, in wenigen Minuten gefunden habe. Aber mein Blog ist ja auch Archiv. Automatische Textproduktion ist wohl gerade ein Thema. Manche Leute haben Angst vor &#8222;social bots&#8220;, kleinen [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":12993,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,254],"class_list":["post-12978","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-ki"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/markowkette.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/12978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=12978"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/12978\/revisions"}],"predecessor-version":[{"id":13742,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/12978\/revisions\/13742"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/12993"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=12978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=12978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=12978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}