home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 07 / silben.txt < prev    next >
Encoding:
Text File  |  1989-03-07  |  28.6 KB  |  624 lines

  1.  
  2. Abbildung 1: Aufrufstruktur im Silbentrennungsprogramm
  3.  
  4. Abbildung 2: Konstanten, Typen und Variablen der Silbentrennung
  5.  
  6. Abbildung 3: Struktogramm "Silbentrennung"
  7.  
  8. Abbildung 4: Struktogramm "Wortbeginn"
  9.  
  10. Abbildung 5: Struktogramm "InListe"
  11.  
  12. Abbildung 6: Struktogramm "Vor_Test"
  13.  
  14. Abbildung 7: Struktogramm "Silben_Start"
  15.  
  16. Abbildung 8: Struktogramm "Registriere"
  17.  
  18. Abbildung 9: Struktogramm "Vokal_Vokal"
  19.  
  20. Abbildung 10:Struktogramm "Konsonant_Vokal"
  21.  
  22.  
  23.  
  24. Wie der böse Hau-Stier zum zahmen Haus-Tier wurde:
  25.  
  26.  
  27. Turbo Pascal lernt Silbentrennung
  28.  
  29.                                von Matthias Uphoff
  30.  
  31. Immer, wenn es darum geht, Text in eine bestimmte Form zu
  32. bringen, macht es sich äußerst unangenehm bemerkbar, wenn ein
  33. Programm keine Silbentrennung beherrscht. Besonders bei schmaler
  34. Textbreite (Mehrspaltensatz) und langen Wörtern entstehen
  35. häßliche Lücken im Schriftbild. Der Programmierer, der seinem
  36. Text- oder Formatierprogramm in dieser Hinsicht gute Manieren
  37. beibringen will, kommt jedoch alsbald in Teufels Küche: Die
  38. Struktur der deutschen Sprache ist weit entfernt von jeder DIN-
  39. genormten und computergerechten Regelmäßigkeit. Wie sich
  40. trotzdem mit vertretbarem Aufwand ein sehr treffsicherer
  41. Trennalgorithmus programmieren läßt, soll dieser Beitrag zeigen.
  42.  
  43. Betrachten wir zunächst in historischer Reihenfolge die
  44. verschiedenen Formen der Unterstützung, die Textprogramme bei
  45. der Silbentrennung üblicherweise bieten:
  46.  
  47. 1) Weiche Trennstriche: Der Anwender gibt bereits bei der
  48.    Texteingabe Trennstellen vor. Diese Methode ist sehr
  49.    umständlich und wird wegen dem Klopapier-Effekt (es reißt
  50.    überall, nur nicht an der Perforation) heutzutage kaum noch
  51.    angewendet: Hat man ein Wort vorsorglich mit Trennfugen
  52.    versehen, so findet dort garantiert nie ein Zeilenumbruch
  53.    statt.
  54.  
  55. 2) Provisorische Trennhilfe: Das Programm stellt fest, ob eine
  56.    Silbentrennung den Randausgleich verbessert und hält an,
  57.    damit der Benutzer die Trennstelle per Cursortasten festlegen
  58.    kann. Alternativ ist ein Joystick zu empfehlen; ein Druck auf
  59.    den Feuerknopf läßt dann das Wort mit einem lauten Knall in
  60.    zwei Teile zerbersten.
  61.  
  62. 3) Trennvorschläge: Das Programm setzt den Cursor auf eine
  63.    Position, an der sich seiner Meinung nach eine Trennstelle
  64.    befinden könnte. Der Anwender darf mit RETURN bestätigen oder
  65.    eine Korrektur vornehmen (s.o.). Doch selbst bei hoher
  66.    Treffgenauigkeit bleibt die traurige Tatsache, daß der
  67.    Benutzer wie bei vielen semi-intelligenten Programmen unseres
  68.    Zeitalters zum RETURN-Drücker degradiert wird.
  69.  
  70. 4) Vollautomatische Silbentrennung: Diese Methode beruht auf
  71.    zwei unabdingbaren Voraussetzungen:
  72.  
  73.    - Einem Trennalgorithmus mit nahezu hundertprozentiger
  74.      Treffsicherheit.
  75.  
  76.    - Einem unerschütterlichen Glauben des Anwenders an die
  77.      Unfehlbarkeit der Software.
  78.  
  79. Ein Blick in eine beliebige Tageszeitung oder Illustrierte
  80. zeigt, wie es in der Realität aussieht. Wer gerade an einer
  81. selbstgebastelten Trennroutine verzweifelt, kann sich hier
  82. trösten lassen: Auch professionelle Satzmaschinen machen
  83. haarsträubende Fehler.
  84.  
  85. Eine brutale Lösung der gesamten Problematik besteht darin, das
  86. Textprogramm mit einer Dateiverwaltung zu verkuppeln, die auf
  87. den gesamten deutschen Wortschatz inklusive Silbentrennungen
  88. zugreift. Als Zugabe erhält man die Möglichkeit einer
  89. Rechtschreib-Korrektur; allerdings steigen auch die
  90. Anforderungen an die Hardware beträchtlich. Ohne Festplatte und
  91. mehrere hundert KByte freien Hauptspeicher ist hier nichts zu
  92. wollen. Und für den Heimanwender, der sich ein Formatierprogramm
  93. schreibt, um seine alten Wordstar-Texte auf dem neuen 24-Nadel-
  94. Drucker in Desktop-Qualität zu Papier zu bringen (siehe auch
  95. Umbruch & Druck, Pascal 11/87), ist diese Lösung ohnehin nicht
  96. praktikabel. Wer hat schon Lust, den gesamten Duden abzutippen?
  97. Umsonst wird Langenscheidt die Dateien garantiert nicht
  98. rausrücken...
  99.  
  100.  
  101. Der algorithmische Weg
  102.  
  103.  
  104. Also bleibt die Frage, ob sich eine akzeptable Silbentrennung
  105. nicht auch mit einer Ansammlung einfacher Regeln und Algorithmen
  106. realisieren läßt. Geht man dem nach, so sieht es zunächst
  107. schlecht aus: Alle im Duden angegebenen Trennregeln beruhen auf
  108. einem Wortverständnis in Verbindung mit rhythmischem
  109. Sprachgefühl, und das ist bekanntermaßen nicht die stärkste
  110. Seite unserer Silizium-Knechte. Auch goldene Schülerregeln wie
  111. 'Trenne nie st, denn das tut ihm weh' (in Atari-Kreisen bekannt
  112. als 'Trenne dich nie von deinem ST...') sind sehr fragwürdig,
  113. wie das "Hau-stier" beweist.
  114.  
  115. Wenden wir uns deshalb zunächst ein paar trivialen Grundlagen
  116. zu. Eine provisorische Trennhilfe zählt einfach die Buchstaben
  117. eines Wortes ab, die sich diesseits und jenseits des rechten
  118. Textrandes befinden. Um zu entscheiden, ob eine Trennung
  119. vorgeschlagen wird, sollte der Routine zumindest Folgendes
  120. bekannt sein:
  121.  
  122. - Wörter bestehen aus Buchstaben und sind durch Nicht-Buchstaben
  123.   voneinander abgegrenzt.
  124.  
  125. - Eine Silbe besteht aus mindestens zwei Buchstaben.
  126.  
  127. - Eine Silbe enthält mindestens einen Vokal (A, E, I usw.).
  128.  
  129. ...woraus folgt, daß ein Wort überhaupt erst ab 4 Buchstaben und
  130. 2 Vokalen für eine Silbentrennung in Betracht kommt. Die
  131. Beachtung dieser Regeln vermeidet unnötige Abfragen (z.B. bei
  132. Wörtern wie 'Strumpf' oder mathematischen Ausdrücken). Zum
  133. Repertoire einer Trenn-Routine gehört also neben dem
  134. Zeichenzählen die Fähigkeit, Buchstaben von Nicht-Buchstaben und
  135. Vokale von Konsonanten zu unterscheiden. Wenn die Routine dem
  136. Anwender mit ihren Trennvorschlägen möglichst viele Cursor-
  137. Manöver abnehmen soll, ist allerdings eine Menge zusätzliches
  138. Wissen erforderlich. Recht exakte Trennregeln lassen sich für
  139. den Fall angeben, daß mehrere Vokale aufeinandertreffen:
  140.  
  141. - Folgt auf einen Diphthong (AU, EI, EU...) ein weiterer Vokal,
  142.   so wird vor diesem getrennt (Bau-er, Trau-ung).
  143.  
  144. - Zwischen bestimmten Vokalkombinationen wie etwa AE, EÄ, II, UE
  145.   wird fast (!) immer getrennt (ge-ändert, vari-ieren, tu-en).
  146.   Bei Vokalkombinationen, die mit U beginnen, muß
  147.   vorsichtshalber getestet werden, ob ein Q vorangeht (qu-er
  148.   wäre fatal).
  149.  
  150. Die zweite Regel ist eigentlich nur eine statistische Aussage,
  151. die jedoch im deutschen Sprachraum provisorisch als 'Wahrheit'
  152. gelten darf. Aber wie dem auch sei - die nächste Anforderung an
  153. eine Trennroutine ist jedenfalls die Identifikation bestimmter
  154. Buchstabenkombinationen (Wortfragmente) anhand vorgegebener
  155. Listen, z.B. einer Liste aller Diphthonge. Allerdings helfen uns
  156. die obigen Regeln nicht viel weiter, da sie nur einen geringen
  157. Anteil der in einem Text anfallenden Silbentrennungen erfassen.
  158. Der Löwenanteil fällt unter die folgende Gesetzmäßigkeit:
  159.  
  160. - Zwischen einem Vokal und dem nächsten Konsonant-Vokal-Übergang
  161.   befindet sich immer eine Trennfuge.
  162.  
  163. Der erste Vokal in 'Computer' ist das O, darauf folgen die
  164. Konsonant-Vokal-Übergänge 'pu' und 'te', so daß das Wort mit
  165. Sicherheit zwei Trennstellen enthält. Diese Regel ist in
  166. Verbindung mit den Gesetzen für Vokal-Vokal-Übergänge absolut
  167. ausreichend, um Silben zu zählen. Mit Textanalyse-Programmen
  168. läßt sich auf diese Weise die Verständlichkeit eines Textes
  169. messen, indem man (neben einigen anderen Faktoren) die
  170. durchschnittliche Silbenanzahl pro Wort ermittelt. (Vergl.
  171. hierzu CHIP-Spezial, Sonderheft Turbo Pascal 7, S. 41 ff:
  172. Computer liest Kant, Vogel-Verlag).
  173.  
  174.  
  175. Intervallschachtelungen
  176.  
  177.  
  178. Leider sagt uns die Regel nicht, wo sich die Trennfuge genau
  179. befindet, sondern gibt für die Position nur ein Intervall an. Um
  180. die Angelegenheit gleich computergerecht zu formulieren, führen
  181. wir zwei Integer-Variablen ein, die auf bestimmte Stellen in
  182. einem Wort 'zeigen' und deshalb hier kurzerhand als 'Zeiger'
  183. bezeichnet werden, obwohl sie nichts mit dem Variablentyp
  184. 'Pointer' zu tun haben. Weiterhin soll folgende Vereinbarung
  185. gelten: Wenn wir davon sprechen, daß ein Zeiger auf eine
  186. Trennstelle zeigt, so gibt er die Position des nachfolgenden
  187. Buchstaben an.
  188.  
  189. Beginnen wir also mit einer Routine, die mit den Zeigern LinksP
  190. und RechtsP die Position der Trennstelle eingrenzt:
  191. ,,l
  192. Suche den ersten Vokal
  193. Solange nicht Wortende wiederhole
  194.    Suche nächsten Konsonanten
  195.    Setze LinksP auf den Konsonanten
  196.    Suche nächsten Vokal
  197.    Setze RechtsP auf den Vokal
  198.    Ermittle Trennstelle
  199.  
  200. Nach dem ersten Schleifendurchlauf zeigt LinksP auf das M und
  201. RechtsP auf das U von 'Computer', womit folgende
  202. Trennmöglichkeiten zur Auswahl stehen:
  203.  
  204.              Co-mputer
  205.              Com-puter
  206.              Comp-uter
  207.  
  208. Die Aufgabe der Prozedur 'Ermittle Trennstelle' ist es, die
  209. endgültige Entscheidung zu treffen. Doch wie soll sie vorgehen?
  210. Hier hilft folgende Erkenntnis:
  211.  
  212. - Es gibt nur eine begrenzte Auswahl von Konsonantkombinationen,
  213.   die am Anfang oder Ende einer Silbe stehen können.
  214.  
  215. Es gibt keine Silben, die mit 'mp' beginnen, und auch als Endung
  216. ist diese Kombination zumindest sehr unwahrscheinlich (wer das
  217. Beispiel jetzt mit einem Hinweis auf 'Lump' sabotiert, ist ein
  218. solcher!). Damit bleibt nur die zweite Trennmöglichkeit, und mit
  219. Hilfe zweier zusätzlicher Fragmentlisten (plausible
  220. Konsonantkombinationen am Silbenanfang/-ende) findet der
  221. Computer das auch heraus:
  222.  
  223. - Setze LinksP nach rechts, bis die Konsonanten ab LinksP einen
  224.   plausiblen Silbenanfang ergeben.
  225.  
  226. - Setze RechtsP nach links, bis die Konsonanten vor RechtsP ein
  227.   plausibles Silbenende ergeben.
  228.  
  229. Die Zeiger werden also aufeinander zubewegt. LinksP zeigt danach
  230. auf das P von 'Computer' (ein einzelner Konsonant ist immer ein
  231. plausibler Silbenanfang), und RechtsP weist auf die gleiche
  232. Stelle! Damit ist die Trennfuge eindeutig bestimmt, und es wäre
  233. wunderschön, wenn das immer so gut funktionieren würde. Doch
  234. leider ist das nicht der Fall.
  235.  
  236.  
  237. Sie konnten zusammen nicht kommen...
  238.  
  239.  
  240. Erinnern wir uns an das fatale Haustier: 'st' ist sowohl am
  241. Anfang als auch am Ende einer Silbe akzeptabel, so daß sich die
  242. Zeiger mit dem obigen Verfahren kein Stück näher kommen. Was
  243. nun? Folgende Regel hat sich bewährt, da sie häufiger das
  244. Richtige trifft als die anderen Möglichkeiten:
  245.  
  246. - Wenn die zusätzliche Eingrenzung keine eindeutige Entscheidung
  247.   herbeiführt (d.h. weiterhin LinksP < RechtsP gilt), trenne bei
  248.   LinksP.
  249.  
  250. ...und damit hätten wir den Hau-Stier am Hals. Trotzdem kann man
  251. mit dieser Notlösung leben, da sie wie gesagt die mei-sten Fäl-
  252. le rich-tig be-han-delt (bitte nachprüfen!). Für Trennvorschläge
  253. mit Nachfrage ist das schon ausreichend, für eine
  254. vollautomatische Silbentrennung jedoch noch lange nicht. Deshalb
  255. geht die Suche weiter: Gibt es zusätzliche Maßnahmen, die die
  256. Lücke zwischen LinksP und RechtsP schließen? Es gibt sie in der
  257. Tat, doch der eifrige Leser sei gewarnt. Bislang war noch alles
  258. einigermaßen klar und logisch, aber nun begeben wir uns
  259. endgültig auf die verschlungenen Pfade des germanischen
  260. Sprachdschungels, mit Ausnahmen und Ausnahmen von Ausnahmen...
  261. oder mit anderen Worten: Ab jetzt wird es tierisch empirisch!
  262.  
  263. 1. Maßnahme: Analyse des Wortanfangs.
  264. Es gibt eine ganze Reihe Vorsilben, die mitsamt der
  265. dazugehörigen Trennstelle anhand von Listen identifiziert werden
  266. können. Das ist besonders dann nützlich, wenn auf die Vorsilbe
  267. ein Vokal folgt, da unser bisheriger Algorithmus LinksP auf den
  268. Konsonanten davor setzt und sich deshalb gründlich irrt.
  269. Manchmal folgen sogar mehrere Vorsilben auf-ein-ander, und damit
  270. das Programm diesen Fall richtig behandelt, muß es sowohl 'auf-'
  271. als auch 'ein-' als Silbe erkennen.
  272.  
  273. Doch das Verfahren ist nicht ohne Tücke. Die häufige Vorsilbe
  274. 'ab-' wird z.B. irrtümlich bei 'aber' erkannt, und die Vorsilbe
  275. 'be-' darf in 'Bein' nicht abgetrennt werden, aber sehr wohl
  276. dagegen in 'be-inhalten'! Es gibt leider eine Vielzahl solcher
  277. Fälle, und deshalb muß die Vorsilben-Identifikation gebremst
  278. werden:
  279.  
  280. - Es wird eine Liste mit Wörtern bzw. Wortanfängen geführt, die
  281.   vor der Vorsilben-Routine geschützt werden müssen (Hier kann
  282.   z.B. 'aber' auftauchen).
  283.  
  284. - Es muß getestet werden, was auf Vorsilben wie z.B. 'ein-' oder
  285.   'er-' folgt, damit nicht Wörter wie 'einst' oder 'Ernte'
  286.   auseinandergenommen werden. Das entscheidende Kriterium ist
  287.   hierbei, ob nach der Vorsilbe noch ein weiterer Vokal
  288.   auftaucht, und wenn ja, ob die Konsonanten bis zu diesem Vokal
  289.   einen plausiblen Silbenanfang ergeben.
  290.  
  291. - Spezialisierte Listen enthalten Wortanfänge, die nach einer
  292.   bestimmten Buchstabenanzahl getrennt werden. Hier kann man
  293.   Vorsilben durch einige weitere Buchstaben ergänzen, die eine
  294.   bessere Identifizierung ermöglichen. Z.B. ist es nicht ratsam,
  295.   dem sehr ausnahmefreudigen Wortanfang 'be-' einen
  296.   uneingeschränkten Vorsilben-Status einzuräumen. In eine Liste
  297.   zweibuchstabiger Vorsilben werden nur Fälle eingetragen, die
  298.   unsere bisherigen Regeln übersehen, also Fragmente wie 'beinh'
  299.   oder 'been', damit 'be-inhalten' oder 'be-enden' erkannt wird.
  300.  
  301. - Häufig kann man beobachten, daß ein typischer Wortanfang nur
  302.   dann mit Sicherheit eine Silbe darstellt, wenn kein 'e' folgt.
  303.   Das gilt z.B. für die Vorsilbe 'ein-' oder das Wort 'Haus-'
  304.   (Haus-angestellte, aber: zu Hau-se). Also wird eine
  305.   entsprechende Liste angelegt, mit der sich auch endlich der
  306.   Hau-Stier zähmen läßt!
  307.  
  308. Doch selbst eine gründliche Vorsilbenanalyse wird zahlreiche
  309. Fälle übriglassen, in denen uns weiterhin die Lücke zwischen
  310. LinksP und RechtsP angähnt. Die Positionen innerhalb des
  311. Intervalls können mit den folgenden 3 Maßnahmen genauer
  312. untersucht werden:
  313.  
  314. 2. Maßnahme: Typisches Silbenende unter Einbeziehung von
  315. Vokalen.
  316.  
  317. Eine Liste mit Konsonantkombinationen, die am Silbenende stehen
  318. können, hatten wir schon. Noch schärfer wird das
  319. Unterscheidungsvermögen, wenn das Programm ein paar besonders
  320. häufig auftretende Silbenendungen wie '-ions-', '-ungs-' oder
  321. '-eits-' anhand der Vokale identifiziert. Kritische
  322. zusammengesetzte Wörter wie 'Zeitungs-ente' oder 'Sicherheits-
  323. prüfung' (plausibler Silbenanfang spr!) werden dann richtig
  324. behandelt. Auch hier kann es Probleme mit Überschneidungen
  325. geben, was sich durch Trennungen wie 'Leits-atz' oder 'Zeits-
  326. chrift' bemerkbar macht. Bewährt hat sich in diesem Zusammenhang
  327. die Zusatzklausel, daß die Spezialendungen erst berücksichtigt
  328. werden, wenn in dem Wort schon vorher eine Trennung registriert
  329. wurde.
  330.  
  331. 3. Maßnahme: Typischer Silbenanfang unter Einbeziehung von
  332. Vokalen.
  333.  
  334. Das Gleiche andersherum: Da Konsonantkombinationen wie 'kr',
  335. 'fl', 'str' usw. als Silbenanfang akzeptiert werden, kommt es zu
  336. Fehlleistungen wie 'wir-klich' oder 'Kau-fladen'. Hier lohnt es
  337. sich, häufig auftretende Nachsilben oder Wörter, die mit einem
  338. kritischen Konsonanten beginnen (z.B. '-lich', '-reich'), in
  339. einer weiteren Liste abfragen zu lassen.
  340.  
  341. 4. Maßnahme: Wörter, die mit einem Vokal beginnen
  342.  
  343. Besonders problematisch wird die Ermittlung der Trennstelle bei
  344. zusammengesetzten Wörten, wenn das zweite Wort mit einem Vokal
  345. beginnt, da LinksP als 'General-Anzeiger' immer auf den
  346. Konsonanten davor zeigt. Deshalb geht sogar 'Tren-nalgorithmus'
  347. daneben, was besonders peinlich ist. Abhilfe kann eine Liste
  348. schaffen, die häufig auftretende mit einem Vokal beginnende
  349. Silbenanfänge enthält. Die Einträge müsssen ausführlich genug
  350. sein, um Verwechslungen vorzubeugen. Für die richtige Behandlung
  351. von 'Trennalgoritmus' würde das Fragment 'alg' reichen (und auch
  352. gleich alle Sorten von Algen sowie sämtliche Himmelsrichtungen
  353. plus -algerien erschlagen), aber dann wird man eventuell durch
  354. Chor-algesang überrascht. Also doch lieber 'algo'?
  355.  
  356. Auch wenn diese Beispiele mühsam an den Haaren herbeigezogen
  357. wurden, so machen sie doch ein Dilemma deutlich, das bei allen
  358. Fragmentlisten eine Rolle spielt. Je allgemeiner (kürzer) die
  359. Wortfragmente sind, um so mehr Fälle können sie erfassen, aber
  360. um so mehr Verwechslungsmöglichkeiten entstehen auch. Die
  361. richtige Bestückung der Listen ergibt sich durch Versuch und
  362. Irrtum: Man läßt den Computer trennen, schaut zu, was er
  363. besonders gerne falsch macht und verändert die Listen
  364. entsprechend. Dabei kommt man häufig vom Hölzchen auf's
  365. Stöckchen. Trennungen wie Finan-zamt machen in einem Brief an
  366. das Finanz-amt keinen besonders guten Eindruck. Also kommt
  367. Maßnahme 4 zum Zuge und '-amt' in die Liste. Danach ist man
  368. insges-amt zufrieden... hoppla, so war das nicht gemeint! Nach
  369. einigem Grübeln findet man das Gegenmittel und schreibt das
  370. zungenbrecherische Fragment 'nsge-' in die Liste der
  371. Silbenendungen mit Vokal. Oder lieber '-samt' in die Liste der
  372. Nachsilben? Das würde dem Straßenverkehr-samt sicher nicht
  373. guttun, aber das wird in Zukunft sowieso nicht mehr gebraucht,
  374. da der Computer inzwischen ein 'Alles-amt' erfunden hat, das
  375. einfach für alles zuständig ist. Na denn Prost, wo ist der Sekt?
  376.  
  377.  
  378. Das Programm
  379.  
  380.  
  381. Der Trennalgorithmus wurde in Turbo Pascal 3.0 realisiert, um
  382. ihn einem möglichst großen Anwenderkreis zugänglich zu machen.
  383. (CP/M-Freaks, wir haben euch nicht vergessen!). Alles bisher
  384. besprochene spielt sich in "SILBEN.PAS" innerhalb der Prozedur
  385. Silbentrennung ab, der ein Wort oder auch ein ganzer Satz in
  386. einem String übergeben wird. Dafür liefert sie die Anzahl der
  387. ermittelten Silbentrennungen und sämtliche Trennpositionen in
  388. einem Integerarray zurück.
  389.  
  390. Etwas Aufmerksamkeit erfordert die Integration der
  391. Fragmentlisten in das Programm. Die erste Idee war natürlich,
  392. sie als typisierte Stringkonstanten zu deklarieren. Die
  393. Beschränkung auf 255 Zeichen wird jedoch schon von den möglichen
  394. Konsonantkombinationen am Silbenende gesprengt, und der Turbo
  395. 3.0-Editor mag sowieso keine Stringkonstanten, die die maximale
  396. Zeilenlänge von 127 Zeichen überschreiten. Also blieben nur
  397. ARRAYs OF CHAR, und hier muß - oh Graus - jeder einzelne
  398. Buchstabe durch Hoch- und Tiefkommata eingerahmt werden, was
  399. besonders auf MS-DOS-Rechnern eine Qual ist.
  400.  
  401. Deshalb wurde folgender Weg beschritten: Die Fragmentlisten
  402. werden zunächst mit dem Turbo-Editor als ganz normale Textdatei
  403. erfaßt. Das Listing FRAGMENT.TXT zeigt, wie das aussieht und was
  404. dabei zu beachten ist. Sobald Sie diese Datei 'im Kasten' haben,
  405. tritt das Dienstprogramm "ARRAY.PAS" in Aktion, das den Namen
  406. der Fragmentdatei anfordert, die Listen in saubere ARRAY OF
  407. CHAR-Deklarationen verwandelt und sie als FRAGMENT.INC auf
  408. Datenträger schreibt. Diese Datei wird dann per Include-
  409. Anweisung in SILBEN.PAS eingebunden. Hier brauchen Sie sich also
  410. um nichts zu kümmern: ARRAY.PAS zählt die Zeichen, setzt alle
  411. erforderlichen Kommas, ergänzt am Zeilenende ein Leerzeichen,
  412. mit dem die Fragmente unterteilt werden, und versieht das
  413. fertige Array noch mit einem chr(255) als Endmarkierung, damit
  414. die Suchroutine in SILBEN.PAS nicht über das Ziel hinausschießt.
  415.  
  416. Leider war es aus Platzgründen nicht möglich, das Programm
  417. "ARRAY.PAS" abzudrucken. Dieses ist aber auf der Diskette
  418. "TOOLBOX Spezial VII" enthalten, bitte beachten Sie
  419. diesbezüglich die Seite 16 dieser Beilage.
  420.  
  421. Das Hauptprogramm von SILBEN.PAS stellt zwei Testmöglichkeiten
  422. zur Verfügung. Nach dem Programmstart wird zunächst nach einem
  423. Dateinamen gefragt. Wenn Sie ohne eine Eingabe RETURN drücken,
  424. erwartet das Programm von Ihnen, daß Sie die zu trennenden
  425. Wörter/Sätze über die Tastatur eingeben. Sie erhalten sie dann
  426. gleich retour auf dem Bildschirm, inklusive Trennstriche und
  427. einer Umwandlung von c-k-Trennungen in k-k.
  428.  
  429. Ansonsten können Sie eine beliebigen ASCII-Textdatei angeben,
  430. die komplett in Silben zerlegt auf dem Drucker ausgegeben wird.
  431. Auf diese Weise läßt sich gut überblicken, wie treffsicher der
  432. Trennalgorithmus ist. Zum Abschluß gibt das Programm die
  433. Gesamtzahl der Silbentrennungen an. Ideal wäre natürlich eine
  434. Meldung wie '2000 Silbentrennungen, davon 20 falsch'. Die
  435. Implementation eines Supervisor-Modus sei jedoch dem begabten
  436. Leser überlassen. (Dazu ein Tip: Versuchen Sie es mit iterativem
  437. Backtracking in kreuzweise diagonalisierten Binärbäumen).
  438.  
  439. Auch hier möchten wir nochmal auf die "TOOLBOX Spezial VII"
  440. verweisen. Auf dieser Diskette ist eine Profiversionsion des
  441. Programmes enthalten, welche neben komfortabler
  442. Benutzeroberfläche auch die Möglichkeit bietet, beliebige
  443. Zeichencodes für die Trennstelle vorzugeben, so daß das Programm
  444. beispielsweise als Trennhilfe für Low-Cost-DTP-Programme
  445. verwendet werden kann.
  446.  
  447.  
  448. Arbeitsteilung
  449.  
  450.  
  451. Die Prozedur Silbentrennung ist so aufgebaut, daß sie das
  452. Verfahren möglichst deutlich widerspiegelt und eine Umsetzung in
  453. andere Programmiersprachen erleichtert. Auf Codelänge- oder
  454. Geschwindigkeitsoptimierung wurde im Interesse einer klaren
  455. Gliederung weitgehend verzichtet. Deshalb enthält die Prozedur
  456. Silbentrennung mehrere lokale Prozeduren und Funktionen, die
  457. signifikante Teilaufgaben übernehmen.
  458.  
  459. Einen Überblick über die Programmaufrufstruktur bietet Abbildung
  460. 1. Die Algorithmen in der Prozedur "Silbentrennung" und den
  461. untergeordneten Prozeduren sind in den Abbildungen 2 bis 10 als
  462. Struktogramme dargestellt.
  463.  
  464. Von zentraler Bedeutung ist die bool'sche Funktion InListe. Sie
  465. durchsucht eine Fragmentliste nach einem Wortfragment, das an
  466. der Position p im String Zeile beginnt, und gibt im Erfolgsfall
  467. 'true' zurück. Die zu durchsuchende Fragmentsammlung wird als
  468. untypisierter VAR-Parameter übergeben, da die Listen ja alle
  469. eine verschiedene Länge haben. Eine Überlagerung mit einer
  470. Absolute-Deklaration sorgt dann für ein 'ordentliches' ARRAY OF
  471. CHAR als Ansprechpartner. Da die Suchroutine keine Informationen
  472. über die Länge des zu findenden Wortfragments besitzt,
  473. orientiert sie sich an den Blanks, die als Separatoren zwischen
  474. den Listeneinträgen stehen. Weiterhin geht sie davon aus
  475. (wichtig!), daß die Liste nach den Anfangsbuchstaben
  476. alphabetisch sortiert ist und gibt deshalb auf, sobald der erste
  477. Buchstabe eines Wortfragments (genauer gesagt die ASCII-Nummer
  478. des Buchstabens) 'größer' als der Buchstabe an der Startposition
  479. p in Zeile ist. Auf diese Weise wird Rechenzeit gespart, und die
  480. Array-Endmarkierung chr(255) beendet die Suche ohne Extra-
  481. Abfrage auf jeden Fall!
  482.  
  483. Die Prozedur 'Registriere' wird von verschiedenen Stellen aus
  484. aufgerufen und ist für die Buchführung zuständig. Sie zählt die
  485. erkannten Trennstellen und trägt die Positionen in ein Integer-
  486. Array ein. Sie weiß übrigens als einzige, daß es keine
  487. einbuchstabigen Silben geben darf, und unterschlägt sie einfach,
  488. damit z.B. 'Atomenergie' nicht zur Katastrophe wird. Die
  489. aufrufenden Programmteile merken davon nichts!
  490.  
  491. Eine wichtige Testhilfe stellt die bool'sche Funktion
  492. Silben_Start dar. Sie untersucht, ob an der Zeilenposition p ein
  493. plausibler Silbenanfang vorliegt und gibt 'true' zurück, wenn
  494. dort
  495.  
  496. - ein Vokal steht
  497.  
  498. - auf einen Konsonanten direkt ein Vokal folgt
  499.  
  500. - die Konsonanten bis zum nächsten Vokal einen plausiblen
  501.   Silbenanfang darstellen.
  502.  
  503. Die nächsten drei lokalen Prozeduren kümmern sich um die
  504. Ermittlung von Trennstellen und machen dabei regen Gebrauch von
  505. der Suchfunktion InListe. Die Arbeitsteilung sieht wie folgt
  506. aus:
  507.  
  508. - Wortanfang an der Position p analysieren. Hier kommt Maßnahme
  509.   1 zum Zuge. (Procedure Wortbeginn)
  510.  
  511. - Eventuelle Trennstelle zwischen Vokalen in einem Intervall
  512.   LinksP...RechtsP ermitteln. (Procedure Vokal_Vokal)
  513.  
  514. - Bei einem Konsonant-Vokal-Übergang das Intervall
  515.   LinksP...RechtsP durch plausible Silbenenden bzw. -anfänge
  516.   eingrenzen. Fällt hierbei keine eindeutige Entscheidung, wird
  517.   das verbleibende Intervall mit den Maßnahmen 2 bis 4 einer
  518.   genaueren Analyse unterzogen. (Procedure Konsonant_Vokal)
  519.  
  520. Für den Hauptteil der Prozedur Silbentrennung bleibt nur noch
  521. der organisatorische Rahmen. Zunächst werden einige
  522. Vorbereitungen getroffen: Der Aufruf von Uppercase konvertiert
  523. die zu trennende Zeile in Großbuchstaben (unter Berücksichtigung
  524. der Umlaute!), und dann kommt noch ein chr(0) als neutrale
  525. Endmarkierung hinten dran. Die folgende REPEAT...UNTIL-Schleife
  526. filtert successive alle Wörter aus der Zeile heraus, indem sie
  527. die Positionszeiger StartP und EndP auf den ersten und hinter
  528. den letzten Buchstaben des jeweils nächsten Wortes setzt. Hier
  529. wird also klar zwischen Buchstaben und Nicht-Buchstaben
  530. unterschieden, und deshalb ist die gesamte Prozedur sehr
  531. tolerant: Man kann ihr alles zu fressen geben, einschließlich
  532. Assemblerlistings und Blockgrafiken, ohne daß sie sich beirren
  533. läßt. Immerhin enthalten ja auch normale Texte massenweise
  534. Nicht-Buchstaben wie Satzzeichen, Klammern, Bindestriche usw.!
  535.  
  536. Nach dem Herausfiltern eines Wortes geht es dann zur Sache: Ist
  537. es länger als 3 Buchstaben, so werden nach der Analyse des
  538. Wortanfangs in einer WHILE-Schleife die Intervalle abgesteckt,
  539. in denen sich die Prozeduren Vokal_Vokal und Konsonant_Vokal
  540. nach einer Trennstelle umschauen dürfen.
  541.  
  542.  
  543. Ausblicke
  544.  
  545.  
  546. So, und nun wollen Sie vermutlich noch wissen, wie gut der
  547. Algorithmus in der Praxis funktioniert. Einige Testläufe fördern
  548. Erstaunliches zu Tage: Trotz der Probleme mit dem Finanzamt (wer
  549. hat die nicht?) und einiger anderer Unsicherheiten erhält man
  550. eine durchschnittliche Trefferquote von über 99%; das Resultat
  551. für diesen Artikel lautet 20 Fehler bei 3500 Trennungen. Da beim
  552. Formatieren eines Textes vielleicht nur alle drei Zeilen eine
  553. Silbentrennung anfällt, lohnt es sich also schon, ohne Nachfrage
  554. zu arbeiten.
  555.  
  556. Die Trennroutine im Textverarbeitungsprogramm ConText PC 2.0
  557. arbeitet übrigens nach dem gleichen Prinzip wie SILBEN.PAS. Sie
  558. wurde jedoch komplett in Assembler codiert und enthält neben
  559. etwas umfangreicheren Fragmentlisten noch ein paar zusätzliche
  560. Feinheiten. Wer gerne auf Maschinenebene herumturnt, sollte die
  561. Umsetzung in Assembler probieren, es lohnt sich! Inklusive
  562. Listen erhält man weniger als 2000 Bytes Code, und die ganze
  563. Angelegenheit wird kompakt und schnell genug, um sie problemlos
  564. in andere Programme integrieren zu können.
  565.  
  566. Die Pascal-Version ist leider nicht besonders hurtig, was im
  567. wesentlichen an der Suchfunktion InListe und den zeitraubenden
  568. Mengenabfragen liegt. Weiterhin macht sich bemerkbar, daß die
  569. strengen Pascal-Strukturen einem derart chaotischen Problem
  570. nicht unbedingt entgegenkommen. Die Umstände mit den typisierten
  571. Konstanten (die ohnehin schon über den Pascal-Standard
  572. hinausgehen) und die lästigen Fesseln der WHILE- und REPEAT-
  573. Schleifen entfallen in Assembler: Hier bringt man die Listen mit
  574. DB-Anweisungen unter und verläßt ohne moralische Bedenken bei
  575. der nächstbesten Abbruchbedingung eine Schleife per JUMP.
  576. Dadurch lassen sich mit zwei bis drei zusätzlichen Befehlen
  577. weitere Regeln einbauen, die in Pascal sehr umständliche
  578. Konstruktionen zur Folge hätten. Problematisch werden in
  579. Assembler nur die Mengenabfragen. Hier hilft eine 256 Bytes
  580. lange Tabelle, in der bestimmte Attribut-Bits für jedes Zeichen
  581. anzeigen, zu welchem Typ es gehört (Vokal, Konsonant, Nicht-
  582. Buchstabe usw.). Diese Methode erlaubt einen sehr schnellen
  583. Zugriff.
  584.  
  585. Man kann jedoch auch in eine andere Richtung ausweichen. Die
  586. Verarbeitung von Listen in Verbindung mit einem komplexen
  587. Regelwerk lädt dazu ein, es in einer KI-Sprache wie Lisp oder
  588. Prolog zu versuchen. Im Prinzip stellt ein Trennprogramm ja
  589. nichts anderes als eine Art Expertensystem dar! Besonders schön
  590. wäre natürlich ein lernfähiges System, das seine Listen und
  591. Regeln gemäß den Benutzerkorrekturen selbst ergänzt.
  592. Problematisch dürfte jedoch die Einbindung in andere Programme
  593. werden: Hat man das Trennprogramm in Lisp geschrieben, wird man
  594. sich für die Textverarbeitung drumherum vielleicht doch eine
  595. andere Sprache wünschen.
  596.  
  597. Also zurück zu Pascal: Wer die Trennroutine noch verbessern
  598. will, wird vermutlich zuerst bei den Listen ansetzen. Nach
  599. einigem Probieren bekommt man ein Gefühl dafür, was man wie und
  600. wo eintragen muß, um bestimmte Fehler zu unterbinden. Aber auch
  601. im Programm sind Verbesserungen denkbar. So ist z.B. die
  602. Erkennung von Silben/Wörten, die mit einem Vokal beginnen, noch
  603. nicht besonders effektiv organisiert. Falls Ihnen zum Thema
  604. Silbentrennung etwas Konstruktives einfällt, so schreiben Sie -
  605. wer eine Möglichkeit findet, die Treffsicherheit deutlich zu
  606. verbessern, ohne daß sich der Aufwand drastisch erhöht, hat die
  607. Chance, eine Spezialversion des Programms ConText PC 2.0 zu
  608. gewinnen, in der sein Vorschlag eingebaut wurde. Die Beurteilung
  609. erfolgt durch die Toolbox-Redaktion und den Autor; der Rechtsweg
  610. ist selbstverständlich ausgeschlossen.
  611.  
  612. Zum Abschluß jedoch eine Warnung (und hier spricht der Autor aus
  613. Erfahrung): Eine zu intensive Beschäftigung mit Silbentrennung
  614. führt leicht in einen bedenklichen Geisteszustand. Hat man das
  615. Programm endlich dazu gebracht, irgendeinen komplizierten Fall
  616. richtig zu trennen, so haut es dafür garantiert in 10 anderen
  617. Fällen wieder daneben, und spätestens nach einem Monat rastlosem
  618. Prototyping irrt der perfektionsbesessene Programmierer mit
  619. katatonischem Kichern durch die Gegend und zer-legt zwang-haft
  620. al-les, was ihm zu Oh-ren und vor Au-gen kommt, in Sprech-sil-
  621. ben....
  622.  
  623.                            (Mat-thi-as Up-hoff/ms)
  624.