home *** CD-ROM | disk | FTP | other *** search
-
- Abbildung 1: Aufrufstruktur im Silbentrennungsprogramm
-
- Abbildung 2: Konstanten, Typen und Variablen der Silbentrennung
-
- Abbildung 3: Struktogramm "Silbentrennung"
-
- Abbildung 4: Struktogramm "Wortbeginn"
-
- Abbildung 5: Struktogramm "InListe"
-
- Abbildung 6: Struktogramm "Vor_Test"
-
- Abbildung 7: Struktogramm "Silben_Start"
-
- Abbildung 8: Struktogramm "Registriere"
-
- Abbildung 9: Struktogramm "Vokal_Vokal"
-
- Abbildung 10:Struktogramm "Konsonant_Vokal"
-
-
-
- Wie der böse Hau-Stier zum zahmen Haus-Tier wurde:
-
-
- Turbo Pascal lernt Silbentrennung
-
- von Matthias Uphoff
-
- Immer, wenn es darum geht, Text in eine bestimmte Form zu
- bringen, macht es sich äußerst unangenehm bemerkbar, wenn ein
- Programm keine Silbentrennung beherrscht. Besonders bei schmaler
- Textbreite (Mehrspaltensatz) und langen Wörtern entstehen
- häßliche Lücken im Schriftbild. Der Programmierer, der seinem
- Text- oder Formatierprogramm in dieser Hinsicht gute Manieren
- beibringen will, kommt jedoch alsbald in Teufels Küche: Die
- Struktur der deutschen Sprache ist weit entfernt von jeder DIN-
- genormten und computergerechten Regelmäßigkeit. Wie sich
- trotzdem mit vertretbarem Aufwand ein sehr treffsicherer
- Trennalgorithmus programmieren läßt, soll dieser Beitrag zeigen.
-
- Betrachten wir zunächst in historischer Reihenfolge die
- verschiedenen Formen der Unterstützung, die Textprogramme bei
- der Silbentrennung üblicherweise bieten:
-
- 1) Weiche Trennstriche: Der Anwender gibt bereits bei der
- Texteingabe Trennstellen vor. Diese Methode ist sehr
- umständlich und wird wegen dem Klopapier-Effekt (es reißt
- überall, nur nicht an der Perforation) heutzutage kaum noch
- angewendet: Hat man ein Wort vorsorglich mit Trennfugen
- versehen, so findet dort garantiert nie ein Zeilenumbruch
- statt.
-
- 2) Provisorische Trennhilfe: Das Programm stellt fest, ob eine
- Silbentrennung den Randausgleich verbessert und hält an,
- damit der Benutzer die Trennstelle per Cursortasten festlegen
- kann. Alternativ ist ein Joystick zu empfehlen; ein Druck auf
- den Feuerknopf läßt dann das Wort mit einem lauten Knall in
- zwei Teile zerbersten.
-
- 3) Trennvorschläge: Das Programm setzt den Cursor auf eine
- Position, an der sich seiner Meinung nach eine Trennstelle
- befinden könnte. Der Anwender darf mit RETURN bestätigen oder
- eine Korrektur vornehmen (s.o.). Doch selbst bei hoher
- Treffgenauigkeit bleibt die traurige Tatsache, daß der
- Benutzer wie bei vielen semi-intelligenten Programmen unseres
- Zeitalters zum RETURN-Drücker degradiert wird.
-
- 4) Vollautomatische Silbentrennung: Diese Methode beruht auf
- zwei unabdingbaren Voraussetzungen:
-
- - Einem Trennalgorithmus mit nahezu hundertprozentiger
- Treffsicherheit.
-
- - Einem unerschütterlichen Glauben des Anwenders an die
- Unfehlbarkeit der Software.
-
- Ein Blick in eine beliebige Tageszeitung oder Illustrierte
- zeigt, wie es in der Realität aussieht. Wer gerade an einer
- selbstgebastelten Trennroutine verzweifelt, kann sich hier
- trösten lassen: Auch professionelle Satzmaschinen machen
- haarsträubende Fehler.
-
- Eine brutale Lösung der gesamten Problematik besteht darin, das
- Textprogramm mit einer Dateiverwaltung zu verkuppeln, die auf
- den gesamten deutschen Wortschatz inklusive Silbentrennungen
- zugreift. Als Zugabe erhält man die Möglichkeit einer
- Rechtschreib-Korrektur; allerdings steigen auch die
- Anforderungen an die Hardware beträchtlich. Ohne Festplatte und
- mehrere hundert KByte freien Hauptspeicher ist hier nichts zu
- wollen. Und für den Heimanwender, der sich ein Formatierprogramm
- schreibt, um seine alten Wordstar-Texte auf dem neuen 24-Nadel-
- Drucker in Desktop-Qualität zu Papier zu bringen (siehe auch
- Umbruch & Druck, Pascal 11/87), ist diese Lösung ohnehin nicht
- praktikabel. Wer hat schon Lust, den gesamten Duden abzutippen?
- Umsonst wird Langenscheidt die Dateien garantiert nicht
- rausrücken...
-
-
- Der algorithmische Weg
-
-
- Also bleibt die Frage, ob sich eine akzeptable Silbentrennung
- nicht auch mit einer Ansammlung einfacher Regeln und Algorithmen
- realisieren läßt. Geht man dem nach, so sieht es zunächst
- schlecht aus: Alle im Duden angegebenen Trennregeln beruhen auf
- einem Wortverständnis in Verbindung mit rhythmischem
- Sprachgefühl, und das ist bekanntermaßen nicht die stärkste
- Seite unserer Silizium-Knechte. Auch goldene Schülerregeln wie
- 'Trenne nie st, denn das tut ihm weh' (in Atari-Kreisen bekannt
- als 'Trenne dich nie von deinem ST...') sind sehr fragwürdig,
- wie das "Hau-stier" beweist.
-
- Wenden wir uns deshalb zunächst ein paar trivialen Grundlagen
- zu. Eine provisorische Trennhilfe zählt einfach die Buchstaben
- eines Wortes ab, die sich diesseits und jenseits des rechten
- Textrandes befinden. Um zu entscheiden, ob eine Trennung
- vorgeschlagen wird, sollte der Routine zumindest Folgendes
- bekannt sein:
-
- - Wörter bestehen aus Buchstaben und sind durch Nicht-Buchstaben
- voneinander abgegrenzt.
-
- - Eine Silbe besteht aus mindestens zwei Buchstaben.
-
- - Eine Silbe enthält mindestens einen Vokal (A, E, I usw.).
-
- ...woraus folgt, daß ein Wort überhaupt erst ab 4 Buchstaben und
- 2 Vokalen für eine Silbentrennung in Betracht kommt. Die
- Beachtung dieser Regeln vermeidet unnötige Abfragen (z.B. bei
- Wörtern wie 'Strumpf' oder mathematischen Ausdrücken). Zum
- Repertoire einer Trenn-Routine gehört also neben dem
- Zeichenzählen die Fähigkeit, Buchstaben von Nicht-Buchstaben und
- Vokale von Konsonanten zu unterscheiden. Wenn die Routine dem
- Anwender mit ihren Trennvorschlägen möglichst viele Cursor-
- Manöver abnehmen soll, ist allerdings eine Menge zusätzliches
- Wissen erforderlich. Recht exakte Trennregeln lassen sich für
- den Fall angeben, daß mehrere Vokale aufeinandertreffen:
-
- - Folgt auf einen Diphthong (AU, EI, EU...) ein weiterer Vokal,
- so wird vor diesem getrennt (Bau-er, Trau-ung).
-
- - Zwischen bestimmten Vokalkombinationen wie etwa AE, EÄ, II, UE
- wird fast (!) immer getrennt (ge-ändert, vari-ieren, tu-en).
- Bei Vokalkombinationen, die mit U beginnen, muß
- vorsichtshalber getestet werden, ob ein Q vorangeht (qu-er
- wäre fatal).
-
- Die zweite Regel ist eigentlich nur eine statistische Aussage,
- die jedoch im deutschen Sprachraum provisorisch als 'Wahrheit'
- gelten darf. Aber wie dem auch sei - die nächste Anforderung an
- eine Trennroutine ist jedenfalls die Identifikation bestimmter
- Buchstabenkombinationen (Wortfragmente) anhand vorgegebener
- Listen, z.B. einer Liste aller Diphthonge. Allerdings helfen uns
- die obigen Regeln nicht viel weiter, da sie nur einen geringen
- Anteil der in einem Text anfallenden Silbentrennungen erfassen.
- Der Löwenanteil fällt unter die folgende Gesetzmäßigkeit:
-
- - Zwischen einem Vokal und dem nächsten Konsonant-Vokal-Übergang
- befindet sich immer eine Trennfuge.
-
- Der erste Vokal in 'Computer' ist das O, darauf folgen die
- Konsonant-Vokal-Übergänge 'pu' und 'te', so daß das Wort mit
- Sicherheit zwei Trennstellen enthält. Diese Regel ist in
- Verbindung mit den Gesetzen für Vokal-Vokal-Übergänge absolut
- ausreichend, um Silben zu zählen. Mit Textanalyse-Programmen
- läßt sich auf diese Weise die Verständlichkeit eines Textes
- messen, indem man (neben einigen anderen Faktoren) die
- durchschnittliche Silbenanzahl pro Wort ermittelt. (Vergl.
- hierzu CHIP-Spezial, Sonderheft Turbo Pascal 7, S. 41 ff:
- Computer liest Kant, Vogel-Verlag).
-
-
- Intervallschachtelungen
-
-
- Leider sagt uns die Regel nicht, wo sich die Trennfuge genau
- befindet, sondern gibt für die Position nur ein Intervall an. Um
- die Angelegenheit gleich computergerecht zu formulieren, führen
- wir zwei Integer-Variablen ein, die auf bestimmte Stellen in
- einem Wort 'zeigen' und deshalb hier kurzerhand als 'Zeiger'
- bezeichnet werden, obwohl sie nichts mit dem Variablentyp
- 'Pointer' zu tun haben. Weiterhin soll folgende Vereinbarung
- gelten: Wenn wir davon sprechen, daß ein Zeiger auf eine
- Trennstelle zeigt, so gibt er die Position des nachfolgenden
- Buchstaben an.
-
- Beginnen wir also mit einer Routine, die mit den Zeigern LinksP
- und RechtsP die Position der Trennstelle eingrenzt:
- ,,l
- Suche den ersten Vokal
- Solange nicht Wortende wiederhole
- Suche nächsten Konsonanten
- Setze LinksP auf den Konsonanten
- Suche nächsten Vokal
- Setze RechtsP auf den Vokal
- Ermittle Trennstelle
-
- Nach dem ersten Schleifendurchlauf zeigt LinksP auf das M und
- RechtsP auf das U von 'Computer', womit folgende
- Trennmöglichkeiten zur Auswahl stehen:
-
- Co-mputer
- Com-puter
- Comp-uter
-
- Die Aufgabe der Prozedur 'Ermittle Trennstelle' ist es, die
- endgültige Entscheidung zu treffen. Doch wie soll sie vorgehen?
- Hier hilft folgende Erkenntnis:
-
- - Es gibt nur eine begrenzte Auswahl von Konsonantkombinationen,
- die am Anfang oder Ende einer Silbe stehen können.
-
- Es gibt keine Silben, die mit 'mp' beginnen, und auch als Endung
- ist diese Kombination zumindest sehr unwahrscheinlich (wer das
- Beispiel jetzt mit einem Hinweis auf 'Lump' sabotiert, ist ein
- solcher!). Damit bleibt nur die zweite Trennmöglichkeit, und mit
- Hilfe zweier zusätzlicher Fragmentlisten (plausible
- Konsonantkombinationen am Silbenanfang/-ende) findet der
- Computer das auch heraus:
-
- - Setze LinksP nach rechts, bis die Konsonanten ab LinksP einen
- plausiblen Silbenanfang ergeben.
-
- - Setze RechtsP nach links, bis die Konsonanten vor RechtsP ein
- plausibles Silbenende ergeben.
-
- Die Zeiger werden also aufeinander zubewegt. LinksP zeigt danach
- auf das P von 'Computer' (ein einzelner Konsonant ist immer ein
- plausibler Silbenanfang), und RechtsP weist auf die gleiche
- Stelle! Damit ist die Trennfuge eindeutig bestimmt, und es wäre
- wunderschön, wenn das immer so gut funktionieren würde. Doch
- leider ist das nicht der Fall.
-
-
- Sie konnten zusammen nicht kommen...
-
-
- Erinnern wir uns an das fatale Haustier: 'st' ist sowohl am
- Anfang als auch am Ende einer Silbe akzeptabel, so daß sich die
- Zeiger mit dem obigen Verfahren kein Stück näher kommen. Was
- nun? Folgende Regel hat sich bewährt, da sie häufiger das
- Richtige trifft als die anderen Möglichkeiten:
-
- - Wenn die zusätzliche Eingrenzung keine eindeutige Entscheidung
- herbeiführt (d.h. weiterhin LinksP < RechtsP gilt), trenne bei
- LinksP.
-
- ...und damit hätten wir den Hau-Stier am Hals. Trotzdem kann man
- mit dieser Notlösung leben, da sie wie gesagt die mei-sten Fäl-
- le rich-tig be-han-delt (bitte nachprüfen!). Für Trennvorschläge
- mit Nachfrage ist das schon ausreichend, für eine
- vollautomatische Silbentrennung jedoch noch lange nicht. Deshalb
- geht die Suche weiter: Gibt es zusätzliche Maßnahmen, die die
- Lücke zwischen LinksP und RechtsP schließen? Es gibt sie in der
- Tat, doch der eifrige Leser sei gewarnt. Bislang war noch alles
- einigermaßen klar und logisch, aber nun begeben wir uns
- endgültig auf die verschlungenen Pfade des germanischen
- Sprachdschungels, mit Ausnahmen und Ausnahmen von Ausnahmen...
- oder mit anderen Worten: Ab jetzt wird es tierisch empirisch!
-
- 1. Maßnahme: Analyse des Wortanfangs.
- Es gibt eine ganze Reihe Vorsilben, die mitsamt der
- dazugehörigen Trennstelle anhand von Listen identifiziert werden
- können. Das ist besonders dann nützlich, wenn auf die Vorsilbe
- ein Vokal folgt, da unser bisheriger Algorithmus LinksP auf den
- Konsonanten davor setzt und sich deshalb gründlich irrt.
- Manchmal folgen sogar mehrere Vorsilben auf-ein-ander, und damit
- das Programm diesen Fall richtig behandelt, muß es sowohl 'auf-'
- als auch 'ein-' als Silbe erkennen.
-
- Doch das Verfahren ist nicht ohne Tücke. Die häufige Vorsilbe
- 'ab-' wird z.B. irrtümlich bei 'aber' erkannt, und die Vorsilbe
- 'be-' darf in 'Bein' nicht abgetrennt werden, aber sehr wohl
- dagegen in 'be-inhalten'! Es gibt leider eine Vielzahl solcher
- Fälle, und deshalb muß die Vorsilben-Identifikation gebremst
- werden:
-
- - Es wird eine Liste mit Wörtern bzw. Wortanfängen geführt, die
- vor der Vorsilben-Routine geschützt werden müssen (Hier kann
- z.B. 'aber' auftauchen).
-
- - Es muß getestet werden, was auf Vorsilben wie z.B. 'ein-' oder
- 'er-' folgt, damit nicht Wörter wie 'einst' oder 'Ernte'
- auseinandergenommen werden. Das entscheidende Kriterium ist
- hierbei, ob nach der Vorsilbe noch ein weiterer Vokal
- auftaucht, und wenn ja, ob die Konsonanten bis zu diesem Vokal
- einen plausiblen Silbenanfang ergeben.
-
- - Spezialisierte Listen enthalten Wortanfänge, die nach einer
- bestimmten Buchstabenanzahl getrennt werden. Hier kann man
- Vorsilben durch einige weitere Buchstaben ergänzen, die eine
- bessere Identifizierung ermöglichen. Z.B. ist es nicht ratsam,
- dem sehr ausnahmefreudigen Wortanfang 'be-' einen
- uneingeschränkten Vorsilben-Status einzuräumen. In eine Liste
- zweibuchstabiger Vorsilben werden nur Fälle eingetragen, die
- unsere bisherigen Regeln übersehen, also Fragmente wie 'beinh'
- oder 'been', damit 'be-inhalten' oder 'be-enden' erkannt wird.
-
- - Häufig kann man beobachten, daß ein typischer Wortanfang nur
- dann mit Sicherheit eine Silbe darstellt, wenn kein 'e' folgt.
- Das gilt z.B. für die Vorsilbe 'ein-' oder das Wort 'Haus-'
- (Haus-angestellte, aber: zu Hau-se). Also wird eine
- entsprechende Liste angelegt, mit der sich auch endlich der
- Hau-Stier zähmen läßt!
-
- Doch selbst eine gründliche Vorsilbenanalyse wird zahlreiche
- Fälle übriglassen, in denen uns weiterhin die Lücke zwischen
- LinksP und RechtsP angähnt. Die Positionen innerhalb des
- Intervalls können mit den folgenden 3 Maßnahmen genauer
- untersucht werden:
-
- 2. Maßnahme: Typisches Silbenende unter Einbeziehung von
- Vokalen.
-
- Eine Liste mit Konsonantkombinationen, die am Silbenende stehen
- können, hatten wir schon. Noch schärfer wird das
- Unterscheidungsvermögen, wenn das Programm ein paar besonders
- häufig auftretende Silbenendungen wie '-ions-', '-ungs-' oder
- '-eits-' anhand der Vokale identifiziert. Kritische
- zusammengesetzte Wörter wie 'Zeitungs-ente' oder 'Sicherheits-
- prüfung' (plausibler Silbenanfang spr!) werden dann richtig
- behandelt. Auch hier kann es Probleme mit Überschneidungen
- geben, was sich durch Trennungen wie 'Leits-atz' oder 'Zeits-
- chrift' bemerkbar macht. Bewährt hat sich in diesem Zusammenhang
- die Zusatzklausel, daß die Spezialendungen erst berücksichtigt
- werden, wenn in dem Wort schon vorher eine Trennung registriert
- wurde.
-
- 3. Maßnahme: Typischer Silbenanfang unter Einbeziehung von
- Vokalen.
-
- Das Gleiche andersherum: Da Konsonantkombinationen wie 'kr',
- 'fl', 'str' usw. als Silbenanfang akzeptiert werden, kommt es zu
- Fehlleistungen wie 'wir-klich' oder 'Kau-fladen'. Hier lohnt es
- sich, häufig auftretende Nachsilben oder Wörter, die mit einem
- kritischen Konsonanten beginnen (z.B. '-lich', '-reich'), in
- einer weiteren Liste abfragen zu lassen.
-
- 4. Maßnahme: Wörter, die mit einem Vokal beginnen
-
- Besonders problematisch wird die Ermittlung der Trennstelle bei
- zusammengesetzten Wörten, wenn das zweite Wort mit einem Vokal
- beginnt, da LinksP als 'General-Anzeiger' immer auf den
- Konsonanten davor zeigt. Deshalb geht sogar 'Tren-nalgorithmus'
- daneben, was besonders peinlich ist. Abhilfe kann eine Liste
- schaffen, die häufig auftretende mit einem Vokal beginnende
- Silbenanfänge enthält. Die Einträge müsssen ausführlich genug
- sein, um Verwechslungen vorzubeugen. Für die richtige Behandlung
- von 'Trennalgoritmus' würde das Fragment 'alg' reichen (und auch
- gleich alle Sorten von Algen sowie sämtliche Himmelsrichtungen
- plus -algerien erschlagen), aber dann wird man eventuell durch
- Chor-algesang überrascht. Also doch lieber 'algo'?
-
- Auch wenn diese Beispiele mühsam an den Haaren herbeigezogen
- wurden, so machen sie doch ein Dilemma deutlich, das bei allen
- Fragmentlisten eine Rolle spielt. Je allgemeiner (kürzer) die
- Wortfragmente sind, um so mehr Fälle können sie erfassen, aber
- um so mehr Verwechslungsmöglichkeiten entstehen auch. Die
- richtige Bestückung der Listen ergibt sich durch Versuch und
- Irrtum: Man läßt den Computer trennen, schaut zu, was er
- besonders gerne falsch macht und verändert die Listen
- entsprechend. Dabei kommt man häufig vom Hölzchen auf's
- Stöckchen. Trennungen wie Finan-zamt machen in einem Brief an
- das Finanz-amt keinen besonders guten Eindruck. Also kommt
- Maßnahme 4 zum Zuge und '-amt' in die Liste. Danach ist man
- insges-amt zufrieden... hoppla, so war das nicht gemeint! Nach
- einigem Grübeln findet man das Gegenmittel und schreibt das
- zungenbrecherische Fragment 'nsge-' in die Liste der
- Silbenendungen mit Vokal. Oder lieber '-samt' in die Liste der
- Nachsilben? Das würde dem Straßenverkehr-samt sicher nicht
- guttun, aber das wird in Zukunft sowieso nicht mehr gebraucht,
- da der Computer inzwischen ein 'Alles-amt' erfunden hat, das
- einfach für alles zuständig ist. Na denn Prost, wo ist der Sekt?
-
-
- Das Programm
-
-
- Der Trennalgorithmus wurde in Turbo Pascal 3.0 realisiert, um
- ihn einem möglichst großen Anwenderkreis zugänglich zu machen.
- (CP/M-Freaks, wir haben euch nicht vergessen!). Alles bisher
- besprochene spielt sich in "SILBEN.PAS" innerhalb der Prozedur
- Silbentrennung ab, der ein Wort oder auch ein ganzer Satz in
- einem String übergeben wird. Dafür liefert sie die Anzahl der
- ermittelten Silbentrennungen und sämtliche Trennpositionen in
- einem Integerarray zurück.
-
- Etwas Aufmerksamkeit erfordert die Integration der
- Fragmentlisten in das Programm. Die erste Idee war natürlich,
- sie als typisierte Stringkonstanten zu deklarieren. Die
- Beschränkung auf 255 Zeichen wird jedoch schon von den möglichen
- Konsonantkombinationen am Silbenende gesprengt, und der Turbo
- 3.0-Editor mag sowieso keine Stringkonstanten, die die maximale
- Zeilenlänge von 127 Zeichen überschreiten. Also blieben nur
- ARRAYs OF CHAR, und hier muß - oh Graus - jeder einzelne
- Buchstabe durch Hoch- und Tiefkommata eingerahmt werden, was
- besonders auf MS-DOS-Rechnern eine Qual ist.
-
- Deshalb wurde folgender Weg beschritten: Die Fragmentlisten
- werden zunächst mit dem Turbo-Editor als ganz normale Textdatei
- erfaßt. Das Listing FRAGMENT.TXT zeigt, wie das aussieht und was
- dabei zu beachten ist. Sobald Sie diese Datei 'im Kasten' haben,
- tritt das Dienstprogramm "ARRAY.PAS" in Aktion, das den Namen
- der Fragmentdatei anfordert, die Listen in saubere ARRAY OF
- CHAR-Deklarationen verwandelt und sie als FRAGMENT.INC auf
- Datenträger schreibt. Diese Datei wird dann per Include-
- Anweisung in SILBEN.PAS eingebunden. Hier brauchen Sie sich also
- um nichts zu kümmern: ARRAY.PAS zählt die Zeichen, setzt alle
- erforderlichen Kommas, ergänzt am Zeilenende ein Leerzeichen,
- mit dem die Fragmente unterteilt werden, und versieht das
- fertige Array noch mit einem chr(255) als Endmarkierung, damit
- die Suchroutine in SILBEN.PAS nicht über das Ziel hinausschießt.
-
- Leider war es aus Platzgründen nicht möglich, das Programm
- "ARRAY.PAS" abzudrucken. Dieses ist aber auf der Diskette
- "TOOLBOX Spezial VII" enthalten, bitte beachten Sie
- diesbezüglich die Seite 16 dieser Beilage.
-
- Das Hauptprogramm von SILBEN.PAS stellt zwei Testmöglichkeiten
- zur Verfügung. Nach dem Programmstart wird zunächst nach einem
- Dateinamen gefragt. Wenn Sie ohne eine Eingabe RETURN drücken,
- erwartet das Programm von Ihnen, daß Sie die zu trennenden
- Wörter/Sätze über die Tastatur eingeben. Sie erhalten sie dann
- gleich retour auf dem Bildschirm, inklusive Trennstriche und
- einer Umwandlung von c-k-Trennungen in k-k.
-
- Ansonsten können Sie eine beliebigen ASCII-Textdatei angeben,
- die komplett in Silben zerlegt auf dem Drucker ausgegeben wird.
- Auf diese Weise läßt sich gut überblicken, wie treffsicher der
- Trennalgorithmus ist. Zum Abschluß gibt das Programm die
- Gesamtzahl der Silbentrennungen an. Ideal wäre natürlich eine
- Meldung wie '2000 Silbentrennungen, davon 20 falsch'. Die
- Implementation eines Supervisor-Modus sei jedoch dem begabten
- Leser überlassen. (Dazu ein Tip: Versuchen Sie es mit iterativem
- Backtracking in kreuzweise diagonalisierten Binärbäumen).
-
- Auch hier möchten wir nochmal auf die "TOOLBOX Spezial VII"
- verweisen. Auf dieser Diskette ist eine Profiversionsion des
- Programmes enthalten, welche neben komfortabler
- Benutzeroberfläche auch die Möglichkeit bietet, beliebige
- Zeichencodes für die Trennstelle vorzugeben, so daß das Programm
- beispielsweise als Trennhilfe für Low-Cost-DTP-Programme
- verwendet werden kann.
-
-
- Arbeitsteilung
-
-
- Die Prozedur Silbentrennung ist so aufgebaut, daß sie das
- Verfahren möglichst deutlich widerspiegelt und eine Umsetzung in
- andere Programmiersprachen erleichtert. Auf Codelänge- oder
- Geschwindigkeitsoptimierung wurde im Interesse einer klaren
- Gliederung weitgehend verzichtet. Deshalb enthält die Prozedur
- Silbentrennung mehrere lokale Prozeduren und Funktionen, die
- signifikante Teilaufgaben übernehmen.
-
- Einen Überblick über die Programmaufrufstruktur bietet Abbildung
- 1. Die Algorithmen in der Prozedur "Silbentrennung" und den
- untergeordneten Prozeduren sind in den Abbildungen 2 bis 10 als
- Struktogramme dargestellt.
-
- Von zentraler Bedeutung ist die bool'sche Funktion InListe. Sie
- durchsucht eine Fragmentliste nach einem Wortfragment, das an
- der Position p im String Zeile beginnt, und gibt im Erfolgsfall
- 'true' zurück. Die zu durchsuchende Fragmentsammlung wird als
- untypisierter VAR-Parameter übergeben, da die Listen ja alle
- eine verschiedene Länge haben. Eine Überlagerung mit einer
- Absolute-Deklaration sorgt dann für ein 'ordentliches' ARRAY OF
- CHAR als Ansprechpartner. Da die Suchroutine keine Informationen
- über die Länge des zu findenden Wortfragments besitzt,
- orientiert sie sich an den Blanks, die als Separatoren zwischen
- den Listeneinträgen stehen. Weiterhin geht sie davon aus
- (wichtig!), daß die Liste nach den Anfangsbuchstaben
- alphabetisch sortiert ist und gibt deshalb auf, sobald der erste
- Buchstabe eines Wortfragments (genauer gesagt die ASCII-Nummer
- des Buchstabens) 'größer' als der Buchstabe an der Startposition
- p in Zeile ist. Auf diese Weise wird Rechenzeit gespart, und die
- Array-Endmarkierung chr(255) beendet die Suche ohne Extra-
- Abfrage auf jeden Fall!
-
- Die Prozedur 'Registriere' wird von verschiedenen Stellen aus
- aufgerufen und ist für die Buchführung zuständig. Sie zählt die
- erkannten Trennstellen und trägt die Positionen in ein Integer-
- Array ein. Sie weiß übrigens als einzige, daß es keine
- einbuchstabigen Silben geben darf, und unterschlägt sie einfach,
- damit z.B. 'Atomenergie' nicht zur Katastrophe wird. Die
- aufrufenden Programmteile merken davon nichts!
-
- Eine wichtige Testhilfe stellt die bool'sche Funktion
- Silben_Start dar. Sie untersucht, ob an der Zeilenposition p ein
- plausibler Silbenanfang vorliegt und gibt 'true' zurück, wenn
- dort
-
- - ein Vokal steht
-
- - auf einen Konsonanten direkt ein Vokal folgt
-
- - die Konsonanten bis zum nächsten Vokal einen plausiblen
- Silbenanfang darstellen.
-
- Die nächsten drei lokalen Prozeduren kümmern sich um die
- Ermittlung von Trennstellen und machen dabei regen Gebrauch von
- der Suchfunktion InListe. Die Arbeitsteilung sieht wie folgt
- aus:
-
- - Wortanfang an der Position p analysieren. Hier kommt Maßnahme
- 1 zum Zuge. (Procedure Wortbeginn)
-
- - Eventuelle Trennstelle zwischen Vokalen in einem Intervall
- LinksP...RechtsP ermitteln. (Procedure Vokal_Vokal)
-
- - Bei einem Konsonant-Vokal-Übergang das Intervall
- LinksP...RechtsP durch plausible Silbenenden bzw. -anfänge
- eingrenzen. Fällt hierbei keine eindeutige Entscheidung, wird
- das verbleibende Intervall mit den Maßnahmen 2 bis 4 einer
- genaueren Analyse unterzogen. (Procedure Konsonant_Vokal)
-
- Für den Hauptteil der Prozedur Silbentrennung bleibt nur noch
- der organisatorische Rahmen. Zunächst werden einige
- Vorbereitungen getroffen: Der Aufruf von Uppercase konvertiert
- die zu trennende Zeile in Großbuchstaben (unter Berücksichtigung
- der Umlaute!), und dann kommt noch ein chr(0) als neutrale
- Endmarkierung hinten dran. Die folgende REPEAT...UNTIL-Schleife
- filtert successive alle Wörter aus der Zeile heraus, indem sie
- die Positionszeiger StartP und EndP auf den ersten und hinter
- den letzten Buchstaben des jeweils nächsten Wortes setzt. Hier
- wird also klar zwischen Buchstaben und Nicht-Buchstaben
- unterschieden, und deshalb ist die gesamte Prozedur sehr
- tolerant: Man kann ihr alles zu fressen geben, einschließlich
- Assemblerlistings und Blockgrafiken, ohne daß sie sich beirren
- läßt. Immerhin enthalten ja auch normale Texte massenweise
- Nicht-Buchstaben wie Satzzeichen, Klammern, Bindestriche usw.!
-
- Nach dem Herausfiltern eines Wortes geht es dann zur Sache: Ist
- es länger als 3 Buchstaben, so werden nach der Analyse des
- Wortanfangs in einer WHILE-Schleife die Intervalle abgesteckt,
- in denen sich die Prozeduren Vokal_Vokal und Konsonant_Vokal
- nach einer Trennstelle umschauen dürfen.
-
-
- Ausblicke
-
-
- So, und nun wollen Sie vermutlich noch wissen, wie gut der
- Algorithmus in der Praxis funktioniert. Einige Testläufe fördern
- Erstaunliches zu Tage: Trotz der Probleme mit dem Finanzamt (wer
- hat die nicht?) und einiger anderer Unsicherheiten erhält man
- eine durchschnittliche Trefferquote von über 99%; das Resultat
- für diesen Artikel lautet 20 Fehler bei 3500 Trennungen. Da beim
- Formatieren eines Textes vielleicht nur alle drei Zeilen eine
- Silbentrennung anfällt, lohnt es sich also schon, ohne Nachfrage
- zu arbeiten.
-
- Die Trennroutine im Textverarbeitungsprogramm ConText PC 2.0
- arbeitet übrigens nach dem gleichen Prinzip wie SILBEN.PAS. Sie
- wurde jedoch komplett in Assembler codiert und enthält neben
- etwas umfangreicheren Fragmentlisten noch ein paar zusätzliche
- Feinheiten. Wer gerne auf Maschinenebene herumturnt, sollte die
- Umsetzung in Assembler probieren, es lohnt sich! Inklusive
- Listen erhält man weniger als 2000 Bytes Code, und die ganze
- Angelegenheit wird kompakt und schnell genug, um sie problemlos
- in andere Programme integrieren zu können.
-
- Die Pascal-Version ist leider nicht besonders hurtig, was im
- wesentlichen an der Suchfunktion InListe und den zeitraubenden
- Mengenabfragen liegt. Weiterhin macht sich bemerkbar, daß die
- strengen Pascal-Strukturen einem derart chaotischen Problem
- nicht unbedingt entgegenkommen. Die Umstände mit den typisierten
- Konstanten (die ohnehin schon über den Pascal-Standard
- hinausgehen) und die lästigen Fesseln der WHILE- und REPEAT-
- Schleifen entfallen in Assembler: Hier bringt man die Listen mit
- DB-Anweisungen unter und verläßt ohne moralische Bedenken bei
- der nächstbesten Abbruchbedingung eine Schleife per JUMP.
- Dadurch lassen sich mit zwei bis drei zusätzlichen Befehlen
- weitere Regeln einbauen, die in Pascal sehr umständliche
- Konstruktionen zur Folge hätten. Problematisch werden in
- Assembler nur die Mengenabfragen. Hier hilft eine 256 Bytes
- lange Tabelle, in der bestimmte Attribut-Bits für jedes Zeichen
- anzeigen, zu welchem Typ es gehört (Vokal, Konsonant, Nicht-
- Buchstabe usw.). Diese Methode erlaubt einen sehr schnellen
- Zugriff.
-
- Man kann jedoch auch in eine andere Richtung ausweichen. Die
- Verarbeitung von Listen in Verbindung mit einem komplexen
- Regelwerk lädt dazu ein, es in einer KI-Sprache wie Lisp oder
- Prolog zu versuchen. Im Prinzip stellt ein Trennprogramm ja
- nichts anderes als eine Art Expertensystem dar! Besonders schön
- wäre natürlich ein lernfähiges System, das seine Listen und
- Regeln gemäß den Benutzerkorrekturen selbst ergänzt.
- Problematisch dürfte jedoch die Einbindung in andere Programme
- werden: Hat man das Trennprogramm in Lisp geschrieben, wird man
- sich für die Textverarbeitung drumherum vielleicht doch eine
- andere Sprache wünschen.
-
- Also zurück zu Pascal: Wer die Trennroutine noch verbessern
- will, wird vermutlich zuerst bei den Listen ansetzen. Nach
- einigem Probieren bekommt man ein Gefühl dafür, was man wie und
- wo eintragen muß, um bestimmte Fehler zu unterbinden. Aber auch
- im Programm sind Verbesserungen denkbar. So ist z.B. die
- Erkennung von Silben/Wörten, die mit einem Vokal beginnen, noch
- nicht besonders effektiv organisiert. Falls Ihnen zum Thema
- Silbentrennung etwas Konstruktives einfällt, so schreiben Sie -
- wer eine Möglichkeit findet, die Treffsicherheit deutlich zu
- verbessern, ohne daß sich der Aufwand drastisch erhöht, hat die
- Chance, eine Spezialversion des Programms ConText PC 2.0 zu
- gewinnen, in der sein Vorschlag eingebaut wurde. Die Beurteilung
- erfolgt durch die Toolbox-Redaktion und den Autor; der Rechtsweg
- ist selbstverständlich ausgeschlossen.
-
- Zum Abschluß jedoch eine Warnung (und hier spricht der Autor aus
- Erfahrung): Eine zu intensive Beschäftigung mit Silbentrennung
- führt leicht in einen bedenklichen Geisteszustand. Hat man das
- Programm endlich dazu gebracht, irgendeinen komplizierten Fall
- richtig zu trennen, so haut es dafür garantiert in 10 anderen
- Fällen wieder daneben, und spätestens nach einem Monat rastlosem
- Prototyping irrt der perfektionsbesessene Programmierer mit
- katatonischem Kichern durch die Gegend und zer-legt zwang-haft
- al-les, was ihm zu Oh-ren und vor Au-gen kommt, in Sprech-sil-
- ben....
-
- (Mat-thi-as Up-hoff/ms)