Home > Artikel > Ausgabe 5/2015 > Reimen leicht gemacht

Reimen leicht gemacht

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Kennen Sie das? Zur Feier des 70. Geburtstags Ihrer Mutter soll mit einigen Darbietungen aufgewartet werden, und Ihnen fällt das Los zu, ein würdigendes heiteres Gedicht zu verfassen. Ohne Reime darf dieses natürlich nicht auskommen, und so ringen Sie eines Tages mit Ihrer Kreativität und dem deutschen Wortbestand, um etwas Sinnvolles zu Papier zu bringen. Aber lassen Sie sich dabei doch einfach von Access und einer Reim-Hilfe-Datenbank unterstützen...

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1505_Reimer.accdb

Computer-Reimen

Nicht jeder ist ein Sprachgenie, und das Auffinden von gleichklingenden Ausdrücken in den neuronalen Untiefen des Sprachzentrums macht wohl Allen einige Mühe. Der Vorgang ist aber nicht so kompliziert, dass man ihn nicht auch an eine Software-Anwendung delegieren könnte.

Der Kern dieser wäre eine Liste aller deutschen Worte, deren Endungen dann nur noch verglichen werden müssten. Dafür eignet sich natürlich eine Datenbankanwendung am besten. Tatsächlich ist die Beispieldatenbank des Autors zu diesem Beitrag aus ähnlichen Motiven entstanden, wie im Intro erwähnt.

Wortliste

Auf der Suche nach Dateien, die alle deutschen Begriffe in allen Formen, wie Flexionen, et cetera, enthalten, stößt man im Netz auf verschiedene Quellen. Diese sind leider allesamt weder komplett, noch fehlerfrei.

Die einzige Tabelle tblWorte der Demo-Datenbank ist daher aus verschiedenen Dateien erstellt und nachbearbeitet worden.

Meist liegen diese Wortdateien in Textform vor und haben einen CSV-ähnlichen Aufbau. So war eine Quelle etwa der OpenThesaurus, welcher auch von Open-Office eingesetzt wird, oder die Ergebnisse des Sprachwunders Morphy, das auch der Syntaxanalyse der Begriffe mächtig ist. Diese Textdateien wurden in Tabellen importiert und über Anfügeabfragen zusammengeführt. Dann erfolgte noch eine Nachbearbeitung über VBA-Routinen, die die Begriffe eindeutig filterten und die Groß- und Kleinschreibung anpassten. Schließlich wurde die Tabelle auch noch für das Reimen vorbereitet und erweitert, indem eine automatische Silbentrennung aller Begriffe erfolgte.

Ergebnis ist eine Tabelle mit etwa 470.000 Begriffen, die aber dennoch keinen Anspruch auf Vollständigkeit erhebt. Viele umgangssprachliche Ausdrücke oder Modeworte fehlen, und die Groß- und Kleinschreibung lässt stellenweise zu wünschen übrig. Vor allem aber ist die Silbentrennung ganz und gar nicht perfekt, denn diese entstand aus Performancegründen über einen Algorithmus, der phonetische Gesichtspunkte außer Acht ließ und Konsonanten- und Vokalgruppen nur rudimentär untersuchte. Dennoch ist sie für den angepeilten Einsatz brauchbar. Damit die Tabelle schnell durchsucht werden kann, sind einige Felder indiziert, was dazu führt, dass die Datenbank mit 48 MB recht groß geraten ist.

Einen Ausschnitt der Wortliste der tblWorte finden Sie in Bild 1. Die Spalte Wort verzeichnet die Begriffe, welche in der gebräuchlichen Schreibweise gespeichert sind. Natürlich kann das Verb duschen auch im Nominativ daherkommen und schriebe sich dann korrekt Duschen. Im Feld Silben finden Sie dann jeweils den Begriff mit dem Trennzeichen - für die Silbentrennung. Für Abfragen, die etwa den Rhythmus eines Ausdrucks berücksichtigen wollen, ist zur schnelleren Bearbeitung noch das berechnete Feld Silbenzahl eingefügt, dessen Werte sich aus der Zahl der Trennstriche plus eins ergeben. Mit LetzteSilbe und Reim folgen nun die für uns besonders interessanten Werte. Sie wurden über eine VBA-Routine aus dem Wort gebildet, wobei die Endsilbe und voranstehende Vokale untersucht wurden. Dass dies nicht fehlerfrei funktionierte, sehen Sie etwa am Begriff Duschbad, der aus unerfindlichem Grund ohne Silben angegeben ist. Das letzte Feld lautet LenReim und gibt die String-Länge des Ausdrucks in Reim wieder. Auch dieses berechnete Feld soll zur beschleunigten Weiterverarbeitung bei der Reimsuche helfen.

Der Screenshot verdeutlicht den Feldaufbau der Tabelle tblWorte, die (fast) alle deutschen Begriffe enthält

Bild 1: Der Screenshot verdeutlicht den Feldaufbau der Tabelle tblWorte, die (fast) alle deutschen Begriffe enthält

Die VBA-Routinen, die zu dieser Tabelle führten, sind in der Beispieldatenbank nicht enthalten. Ihre Erläuterung hätte angesichts der Komplexität sicher den Rahmen des Beitrags gesprengt.

Formular zur Reimhilfe

Das einzige Formular frmReimer der Datenbank sieht zur Laufzeit aus, wie in Bild 2. Betrachten wir zunächst, welche Elemente es aufweist.

Dieses Formular frmReimer soll Sie beim Reimen unterstützen und verwendet dazu die Tabelle tblWorte

Bild 2: Dieses Formular frmReimer soll Sie beim Reimen unterstützen und verwendet dazu die Tabelle tblWorte

Im Textsteuerelement links kann der Text des Gedichts eingetragen werden. Sobald Sie eine Zeile mit der Return-Taste beendet haben, tritt der Reim-Algorithmus auf den Plan und sucht aus dem Wortschatz alle Begriffe, die sich auf das letzte Wort der Zeile reimen könnten. Sie werden dann in der Listbox rechts aufgeführt, und Sie können sich einen auswählen, der für die nächste Reimzeile infrage kommt. Der Suchvorgang dauert angesichts der fast halben Million von Begriffen je nach Rechnerausstattung einen Moment, was durch die dann laufende Sanduhr angezeigt wird.

Nun werden Sie nicht unbedingt nur Paarreime erfinden wollen, also solche, in denen sich aufeinanderfolgende Zeilen reimen (A-A-B-B). Vielleicht sollen es Kreuzreime sein (A-B-A-B), oder Blockreime (A-B-B-A). Deshalb aktualisiert die Listbox ihren Inhalt nicht nur nach Beenden einer Zeile, sondern auch dann, wenn Sie ein beliebiges Wort mit der Maus im Text doppelklicken. Folglich lässt sich zu jedem Zeitpunkt ein Reimwort auffinden.

Was hat es mit der Combobox rechts oben im Formular mit dem Label Anzahl Buchstaben auf sich? Per Default steht sie auf dem Kürzel A, kann aber auf B oder 2 bis 8 umgestellt werden. Hier handelt es sich um den Typ des Algorithmus, der zum Einsatz kommt. Mit A durchsucht die Datenbank alle Begriffe, die im Feld Reim der Tabelle tblWorte die gleiche Endung aufweisen, wie das zum Reimen markierte Wort. Mit B wird stattdessen das Feld LetzteSilbe herangezogen. Wie die Praxis zeigte, sind beide Methoden jedoch unzureichend, wenn es etwa um kurze Begriffe geht. Deshalb wurde noch eine Methode hinzugefügt, die direkt die letzten Buchstaben der Begriffe (Feld Wort) mit der gleichen Anzahl im Suchbegriff vergleicht. Und hierbei ist wählbar, wie viele Buchstaben berücksichtigt werden. Sie können die Combobox jederzeit umstellen, um eine andere Liste von Reimbegriffen zu erhalten.

Die Reihenfolge der angebotenen Begriffe ist übrigens nicht alphabetisch, sondern aufsteigend nach deren Länge. Damit stehen oben die einfacheren Begriffe, von denen sich längere eventuell ableiten. In Bild 2 wurde der Begriffe allerhand im Text doppelgeklickt. An fünfter Stelle der vorgeschlagenen Reimworte findet sich land – zwar in Kleinschreibung, aber man weiß, was gemeint ist. Scrollte man die Liste weiter nach unten, fände man etwa auch Aufenthaltsland. Bei alphabetischer Sortierung stünde dieser Begriff weiter oben. Es spart jedoch Hirnschmalz und ist ergonomischer, wenn der Grundbegriff weiter oben steht: Das Wort Urlaubsland fällt Ihnen sicher schneller ein, wenn es von Land abgeleitet ist, als bei Aufenthaltsland.

Verankerung

Wenn Ihnen das Formular zu klein ist, so ziehen Sie es mit der Maus einfach größer. Die Steuerelemente sind alle mit dem Verankern-Feature von Access ausgestattet, wodurch sie sich in Größe und Position dem Formular anpassen.

Ein Blick in die Entwurfsansicht des Formulars (Bild 3) verdeutlicht dies, wenn Sie im Ribbon gleichzeitig das Tab Anordnen ausgewählt haben. Aktivieren Sie nun ein Steuerelement und inspizieren die Verankerung über Klick auf den Anker-Button (Bild 4). Der Typ der Verankerung wird durch die gelbe Markierung bestimmt - im Beispiel wurde die Listbox lstWorte zur Anzeige der Reimworte aktiviert, die auf Nach unten und rechts dehnen eingestellt ist. Damit bleibt ihre Position beim Vergrößern des Formulars relativ zur Texteingabe links erhalten, ihre Breite bleibt gleich, verschiebt sich also absolut, die Höhe passt sich jedoch entsprechend an.

Das Formular frmReimer und seine Steuerelemente in der Entwurfsansicht

Bild 3: Das Formular frmReimer und seine Steuerelemente in der Entwurfsansicht

Die Verankerung des Listbox-Steuerelements lstWorte des Formulars

Bild 4: Die Verankerung des Listbox-Steuerelements lstWorte des Formulars

Das Textfeld selbst hingegen ist auf Nach unten und quer dehnen gesetzt, wodurch die Position erhalten wird, sich bei Größenänderung aber sowohl Breite, wie Höhe, anpassen. Sämtliche anderen Steuerelemente des Formulars – Labels und die Combobox – stehen auf der Verankerung Oben rechts. Damit verschiebt sich lediglich deren Position, während die Größe unbeeinflusst bleibt.

Die Ausdrücke, welche Microsoft den einzelnen Verankern-Modi verpasst hat, sind nicht unbedingt einleuchtend. Experimentieren Sie bei Ihren eigenen Formularen einfach etwas herum, um dem Verhalten bei Laufzeit auf die Schliche zu kommen.

Wie auch immer, in vergrößertem Zustand präsentiert sich durch die Verankerung das Formular dann wie in Bild 5. Der Raum für die Texteingabe hat sich ausgedehnt, die Listbox vertikal erweitert, und die restlichen Elemente haben sich verschoben.

Nach dem Vergrößern des Formulars zur Laufzeit haben sich die Steuerelemente durch Verankern sinnvoll angepasst

Bild 5: Nach dem Vergrößern des Formulars zur Laufzeit haben sich die Steuerelemente durch Verankern sinnvoll angepasst

Nur ein Verkleinern machen die Steuerelemente nicht mit: Die minimalen Ausmaße werden durch jene bestimmt, die Sie ihnen in der Entwurfsansicht verpassten. Dies gilt dann auch für die voreingestellte X-Y-Position der Elemente.

Reim-Algorithmen

Sehr viel Technik steht nicht hinter dem Formular frmReimer. Der VBA-Code ist überschaubar.

Beim Schreiben des Gedichts in das Textfeld txt wird für jeden Tastendruck die Ereignisprozedur txt_KeyPress ausgelöst (Listing 1). Sie reagiert in einem Bedingungszweig nur auf den Tastencode 13, der bei Betätigung der Return-Taste entsteht.

Private Sub txt_KeyPress(KeyAscii As Integer)

     Dim sText As String

     Dim sWord As String

     

     If KeyAscii = 13 Then

         sText = RemoveNonASCII(Me!txt.Text)

         sWord = LastWord(sText)

         GetRhymeList sWord

     End If

End Sub

Listing 1: Ereignisprozedur Bei Maustaste des Textfelds

In diesem Fall wird der Text zunächst einer Vorbehandlung unterzogen und in der String-Variablen sText gespeichert. RemoveNonASCII ist eine Hilfsroutine des Moduls mdlReimhilfe, die aus einem als Parameter übergebenen Text sämtliche Sonderzeichen entfernt und durch Leerzeichen ersetzt. Sonderzeichen steht hier für alle von A-Z oder a-z abweichenden Zeichen.

Denn diese Zeichen interessieren beim Reimen nicht und brächten den Algorithmus durcheinander. Nachdem der reine Text ermittelt ist, wird das letzte Wort in ihm über die Hilfsfunktion LastWord identifiziert und der Variablen sWord zugewiesen. Der Code zu LastWord steht in Listing 2. Hier wird erst die Länge des in sText übergebenen Strings errechnet. Falls diese kleiner ist, als zwei, so interessiert er nicht und die Routine wird verlassen. Andernfalls wird der Text über die Split-Methode von VBA in ein String-Array arr übersetzt, wobei als Trenner das Leerzeichen dient.

Function LastWord(ByVal sText As String) As String

     Dim n As Long

     Dim arr() As String

     n = Len(sText)

     If n < 2 Then Exit Function

     arr = Split(sText, vbSpace)

     LastWord = arr(UBound(arr))

     

End Function

Listing 2: Prozedur zum Ermitteln des letzten Worts

RemoveNonASCII hatte ja bereits alle Sonderzeichen entfernt und nur die Leerzeichen übrig gelassen. Folglich sollte das letzte Element des Arrays (UBound(arr))eben auch das letzte Wort im String enthalten. Dieses wird als Rückgabe der Funktion angegeben.

Damit ist das zu reimende Wort am Ende des Textes bestimmt und wird der Routine GetRhymeList verabreicht, die den Kern unserer Anwendung enthält und noch erläutert wird.

Beim Doppelklicken eines Begriffs im Gedicht sollte diese Routine aber ja ebenfalls in Aktion treten. Dafür steht die Ereignisprozedur txt_DblClick im Formularcode (Listing 3), die etwas komplexer ausfällt, als die Prozedur txt_KeyPress.

Private Sub txt_DblClick(Cancel As Integer)

     Dim sText As String, sWord As String

     Dim i As Long, n1 As Long, n2 As Long

     

     sText = Me!txt.Text

     sText = Replace(sText, Chr$(13), vbSpace)

     

     i = txt.SelStart

     n1 = InStrRev(sText, vbSpace, i)

     If n1 = 0 Then n1 = 1

     n2 = InStr(i, sText, vbSpace)

     If n2 = 0 Then n2 = 1 + Len(sText)

     sWord = Mid(sText, n1 + 1, n2 - n1 - 1)

     sWord = RemoveNonASCII(sWord)

     GetRhymeList Trim(sWord)

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!