Kauderwelsch-Generator „Gibberize“

Gibberish heißt übersetzt Kauderwelsch. Allerdings ist es nicht der Zweck des in Java geschriebenen Gibberizers, Kauderwelsch im Sinne von Unverständlichem, Verworrenen zu erzeugen. Dieses kleine Werkzeug soll ähnlich klingende, plausible Namens- und Wortvariationen erzeugen. Schon praktisch so etwas, wenn man händeringend nach Namen für fiktionale Menschen, Orte und Dinge sucht, und einem partout nichts einfallen will. Autor Dale Emery definiert den Zweck so:

„Fantasy and Science Fiction writers working in invented worlds and cultures can use it to invent names for people, places, and things. Given a list of names from a culture, Gibberizer will invent other names that seem, more or less, to come from the same culture.“ — (Introducing Gibberizer: Automated Gibberish)

Die kostenlose GUI-Anwendung kann über die Projektseite des Gibberizers in Form eines Java-Archivs heruntergeladen werden. Zur Ausführung wird nur eine vorhandene Java-Installation (mind. Java 5) benötigt.

Namen erzeugen

Die Anwendung ist denkbar einfach. Im Gibberizer-Fenster gibt man einige Beispiele für die Art der Worte ein, die man gerne erzeugen möchte, und erhält dann eine Liste mit ähnlich klingenden, ähnlich aussehenden Worten zurück (siehe Abbildung).

Gibberizer mit normaler Ähnlichkeit

(Abb. 1) Bei normaler Ähnlichkeitsstufe (Similarity 3 oder 4) er zeugt der Gibberizer neue, aber ähnliche Kombinationen

Man sollte hierbei besonderes Augenmerk auf das Wort ähnlich legen. Es handelt sich bei dem Prozess der Kauderwelsch-Erzeugung nicht um Anagramme. Vielmehr wird eine Eingabe in bestimmten Paarungen re-kombiniert. Wie das geschehen soll, dass kann über die Einstellungen im oberen Teil des Fensters justiert werden. Die wichtigsten Einstellungen dazu sind im Abschnitt Create versammelt:

  • BatchSize definiert die Anzahl der Ausgaben, die erzeugt werden sollen
  • mit Similarity kann die Ähnlichkeit zwischen Ein- und Ausgabe gesteuert werden, die Einstellung legt fest, wie groß die Teilstücke sind, die neu kombiniert werden. Ein kleinerer Wert führt zu weniger Ähnlichkeit
  • Persistence entscheidet darüber, wie hartnäckig die Anwendung versucht, neue Ausgaben zu erzeugen, bevor sie aufgibt. Besonders wichtig bei wenigen Eingaben
Gibberizer mit wenig Ähnlichkeit

(Abb. 2) Bei geringer Ähnlichkeitsstufe (Similarity 2) erzeugt der Gibberizer völlig neue Wortkominationen

Um das Beispiel in der Abbildung zu erzeugen, wurde eine Ähnlichkeitsstufe (similarity) von 3 genutzt. Das ist auch der Standard. Die Stufen 3 und 4 erzeugen meist Variationen, denen man ihre Ursprünge noch ansehen kann. Möchte man weniger Ähnlichkeit, kann man beispielsweise die Stufe 2 wählen.Die Ergebnisse sehen dann erheblich anders aus (siehe Abbildung 2). Welche Ähnlichkeitsstufe man benötigt hängt sicher vom Anwendungsfall ab. Aber auf jeden Fall macht das Ausprobieren der verschiedenen Möglichkeiten viel Spaß.

Wie funktioniert es?

Das Grundprinzip des Gibberizers besteht darin, die Eingabe in kleinere Bestandteile gleicher Länge, so genannte N-Gramme, zu zerlegen. Die Menge der so gewonnenen N-Gramme wird anschließend wieder nach bestimmten Regeln zusammengesetzt und das Ergebnis als Ausgabe angezeigt.

Bestimmend für diesen Prozess ist die Länge der N-Gramme, und die wird durch die Ähnlichkeitsstufe (Similarity) festgelegt. Eine Einstellung von 3 oder 4 schneidet also schon relativ große Brocken aus einem Wort heraus. Daraus leitet sich dann auch die größere Ähnlichkeit zu den Eingabeworten aus. Reduziert man die Ähnlichkeit auf 2, werden jeweils nur Buchstabenpaare entnommen. Damit hat man eine größere Varationsbreite, und damit auch eine weniger große Ähnlichkeit zu den Ausgangsbegriffen.

Der Autor, Dale Emery, hat den Quellcode des Projekts frei verfügbar gemacht, so dass man sich den Code herunterladen und ansehen kann.Hier ist z.B. die zentrale Methode zur Erzeugung der neu-kombinierten Namen:

public String createGib(NgramBag ngramBag) {
  Ngram ngram = selectRandomStarter(ngramBag);
  String gib = ngram.getPrefix();
  while (!ngramBag.isEnder(ngram)) {
    gib += ngram.getLastCharacter();
    ngram = selectRandomSuccessor(ngram, ngramBag);
  }
  return gib + ngram.getLastCharacter();
}

NgramJoiner::createGib sucht sich ein zufälliges N-Gramm zum Starten aus (2), und wählt dann ein passendes N-Gramm aus (6), um dies dann an das erste anzuhängen. Mit passend ist hier eine Übereinstimmung zwischen dem Ende des ersten und dem Anfang des zweiten N-Gramms gemeint. Dieser Prozess wird solange wiederholt, bis ein N-Gramm gefunden wird, dass die Bedingung isEnder erfüllt (4). Das ist bei allen N-Grammen der Fall, die in der Eingabe ein Wort beendet haben.

Natürlich kann man den Code so auch anpassen, an die eigenen Bedürfnisse.