![]() |
![]() |
![]() |
![]() |
![]() |
3. TextgenerierungWie kann man zufälligen Text generieren? Man könnte einfach ohne System Text über die Tastatur eingeben.
Das ergibt natürlich keine sinnvollen Text. Wie könnte man das verbessern? Verschiedene Buchstaben treten mit unterschiedlicher Häufigkeit und häufig in Verbindung mit anderen Buchstaben auf. Man könnte also zählen, wie oft ein Buchstabe auf die anderen folgt (z.B. wie oft ein 'a' auf alle anderen Buchstaben folgt, wie oft ein 'b' ...). Man bildet nun den nächsten "zufälligen" Buchstaben mit Hilfe eine Funktion, die die vorherigen Buchstaben berücksichtigt. Das ergibt dann eine sogenannte Markovkette. Bei solch einem Markovprozess werden die Übergangswahrscheinlichkeiten eindeutig durch die Zustände festgelegt. Wir haben also zum Beispiel den Zustand, daß bereits ein 'q' generiert wurde. Es gibt nun eine sehr hohe Wahrscheinlichkeit, daß der nächste Buchstabe ein 'u' ist. Die folgenden Beispiele sind nach diesem Schema generiert. Ein Ordnung 1-Text berücksichtig nur einen vorherigen Buchstaben, der Ordung 2-Text berücksichtigt schon zwei (digram oder 2-gram),...
Beim Ordnung 5-Text sind die Wörter schon sehr gut lesbar. Man kann also durch solche Markovketten eine Verbesserung bei der Text Generierung erreichen. Das ganze kann man natürlich auch auf die Wortebene erweitern. Dafür werden dann die Wörter gezählt und entsprechend ihrer Häufigkeit zufällig ausgewählt. Claude E. Shanon beschreibt in "Mathematical Theory of Communication" einen Algorithmus, der diesem schon sehr nahe kommt: Um Text zu generieren durchsucht man ein Buch oder einen Text und wählt aus diesem zufällig ein Wort aus. Dann sucht man sich eine andere Stelle, an der das gleiche Wort auftaucht. Das daruffolgende Wort bildet dann das nächste Wort der Zufallstextes. Erweitert man dies von einem auf zwei oder mehr Wörter ergibt sich schon recht guter Text. Das kann man natürlich automatisieren: |
||||||
|
||||||
k gibt hier an wieviele Wörter berücksichtigt werden sollen. word[] ist eine Art Suffix Array. Die Zeiger zeigen allerdings nicht auf jeden Buchstaben, sondern immer nur auf den Wortanfang. In der while-Schleife wird die Eingabe gelesen und jedes Wort wird an inputchars angehangen. Ist die Eingabe gelesen werden die ersten k Wörter ausgegeben. Dann wird der Array word[] mit Quicksort sortiert. Mit der Binärsuche wird jetzt jedes Vorkommen der ersten beiden Wörter festgestellt. Daraus wird dann zufällig eines ausgewählt. Das nächste Wort bildet dann das Zufallswort, das generiert wird. Ist das k-te Wort NULL so wird die Text Generierung beendet. Führt man diese Programm aus (für k = 2), kommt man schon zu recht gutem Text: |
||||||
|
||||||
Es sie noch angemerkt, daß der generierte Text natürlich stark von der Eingabe abhängt, wie man an dem Beispiel gut erkennen kann. |
![]() |
![]() |
![]() |
![]() |
![]() |