PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Silben trennen mit PHP

Wisst ihr, warum ich diesen Blog liebe? Es ist eine hervorragende Sache, dazuzulernen. Ich schaue mich immer genau um. In den Kommentaren, in der Webstatistik, sogar auf die interne Blogsuche habe ich immer ein Auge. Wenn Leser die interne Blogsuche bemühen, ist das in der Regel ein Zeichen, das etwas nicht stimmt… Oder sie suchen eben etwas aussergewöhnliches.

Diese Woche hat jemand nach Silbentrennung gesucht. Ein echt schwieriges Thema. Vor ein paar Jahren hat mich genau dieses Thema nicht losgelassen und ich habe mich richtig reingekniet, einen guten Silbentrenner zu bauen. Der Code, der dabei rausgekommen ist, war leider nicht der übersichtlichste (keine Kommentare, keine Erläuterungen, dafür aber viele Schleifen und Bedingungen und viiiiiel zu kurze Variablennamen.

Jetzt habe ich mich nochmal hingesetzt, Duden, Wikipedia und Deutsch-Howtos gelesen und einen kompletten Rewrite des Silbentrenners begonnen. Ich möchte Euch mein Zwischenergebnis hier vorstellen - es ist sicherlich nicht komplett und hat einige Macken, aber prinzipiell funktionierts (dazu mehr weiter unten).

Wie gesagt, Silbentrennen hört sich einfach an. Wer halbwegs früher in der Schule aufgepasst hat, schaut sich ein Wort kurz an und kann so ziemlich sofort die Silben bestimmen. Damit ist der Mensch einem Automatismus weit voraus… So, und los gehts:

Wenn man sich entscheidet, solch einen Automatismus zu bauen, braucht man erst einmal einen Schlachtplan. Nach der Lektüre folgender Werke:

Harter Stoff. Danach stellt sich erst einmal heraus: Deutsche Sprache, schwere Sprache. Und: Die neue Rechtschreibung kommt gerade Computerprogrammen entgegen ;) Das große Übel bleiben aber trotzdem, die Ausnahmen… Folgende Dinge stehen schon einmal fest:

  1. Ein Vokal bildet in der Regel den Kern einer Silbe. Dabei gibt es auch Doppelvokale wie “au” und “eu”. Ausserdem werden die Umlaute als Vokal mitgezählt (nicht als Doppelvokal!)
  2. Es gibt bestimmte Buchstabengruppen die nur sehr sehr selten getrennt werden wie “sch” oder “pf”.
  3. Problematisch wirds bei “verschluckten” Buchstaben wie dem “h” (wird nicht immer mitgesprochen und getrennt).
  4. Ganz Problematisch wirds bei zusammengesetzten Worten. (Siehe die berühmten Blumento-Pferde ;)
  5. Einzel-Konsonanten oder -Vokale stehen niemals als Einzelsilbe am Ende.

Für die Umsetzung habe ich mich für folgende Strategie entschieden:

  1. Da die Vokale das Zentrum bilden, werden erst einmal alle Konsonanten gesammelt, bis ein Vokal auftaucht.
  2. Dann wird bestimmt, was mit den Konsonanten passiert. Ob ein Teil an eine bereits bestehende Silbe angehängt wird, oder ob eine neue Silbe generiert wird.
  3. Bei der Aufteilung der Konsonanten wird geprüft, ob die Buchstaben zu einer nicht trennbaren Buchstabengruppe gehören und wenn ja zusammengelassen.

Klingt eigentlich ganz einfach, gell? Bevor ich den Link zum PHP Script preisgebe, möchte ich zunächst um allgemeine Vergebung bitten. Es ist einfach auf die Schnelle in 2 Stunden runtergekloppt und nicht objektorientiert oder gar UTF-8 fähig:

http://www.phpblogger.net/download/silben_trennen.phps

Schauen wir uns mal ein paar Beispiele an:

Array ( [0] => Schla [1] => ger )

Array ( [0] => Scho [1] => ko [2] => la [3] => de )

Array ( [0] => Gren [1] => ze )

Array ( [0] => Apfel )

Array ( [0] => Blau )

Array ( [0] => Sa [1] => la [2] => man [3] => der )

Array ( [0] => Teu [1] => fel )

Array ( [0] => Ta [1] => fel [2] => run [3] => de )

Array ( [0] => Wich [1] => tig [2] => tuer )

Ich bin immer noch total begeistert. Uuuuuuuunglaublich. Naja, aber ob das wirklich so gut funktioniert? Schauen wir mal weiter:

Array ( [0] => Sil [1] => bent [2] => ren [3] => nung )

Aha. Ein Zusammengesetztes Wort. Und wie siehts einzeln aus?

Array ( [0] => Sil [1] => ben )

Array ( [0] => Tren [1] => nung )

Hm. Also wie in diversen Schriftwerken angekündigt, haperts der Erfahrung nach bei zusammengesetzten Worten. Erstaunlicherweise läuft es bei nicht zusammengesetzten Worten recht gut. Was kann man dagegen tun?

Nix. Die einzige Hilfe sind Wörterbücher. Das menschliche Gehirn macht das ganze ähnlich. Wenn etwas auf eine Regel passt, wird nur die Regel gemerkt und abgerufen. Sobald die Regel nicht mehr passt (Quasi in Ausnahmefällen) wird nur die entspreche Ausnahme gemerkt und bei Bedarf abgerufen.

Das Problem ist der Kompromiss:

  1. Entweder man baut eine Applikation, die möglichst viele Wörterbücher einbindet und damit ziemlich gute Ergebnisse liefert. Dann betreibt man aber eine ziemlich langsame Applikation, weil natürlich jede Wörterbuchabfrage Zeit kostet.
  2. Oder man versucht so viel wie möglich mit Regeln abzudecken und nur in Ausnahmefällen das Wörterbuch abzufragen. Die Folge ist eine sehr fehleranfällige Applikation, dafür aber eine ziemlich schnelle.

Das Script bezieht zur Zeit noch kein Wörterbuch mit ein und basiert nur auf Regeln. Die sind natürlich löchrig und Ausnahmen in der deutschen Sprache gibt es weiß Gott genug. Eine große Verbesserung (abgesehen von etwas Regelfeinschliff) wäre natürlich die Erkennung von zusammengesetzten Worten und deren Schnittstellen.

Einen Blick wert ist sicherlich das PEAR-Projekt “TeXHyphen“: Es implementiert den Hyphen-Algorithmus von TeX, hat aber seit 2004 Alpha-Status. Ich weiß es nicht, aber vielleicht einer meiner Leser: Gibt es einen Onlineservice oder ein Open Source Tool, das man abfragen könnte?

Silben trennen mit PHP | PHP-Blog.com meint dazu:

3. Dezember 2008 um 20:52

[...] here to see the original:  Silben trennen mit PHP Related ArticlesBookmarksTags PHP PHP is a computer scripting language. Originally [...]

Michael meint dazu:

4. Dezember 2008 um 09:16

Hallo und guten Morgen,

da hat sich ja mal jemand richtig Arbeit gemacht :-)
Sehr interessantes Projekt. Um Worte richtig trennen zu können, müßte man vermutlich auf die Wortformen zurückgreifen. Ein “einfaches” Wörterbuch wäre nicht ausreichend.
Beispiel: Wissensdatenbank
ergibt:
http://canoo.net/services/Controller?input=wissensdatenbank&service=inflection
ob es dazu Datenbanken zum “anzapfen” gibt, ist mir nicht bekannt. Von der performance her vermute ich, das es zur Laufzeit kaum zu bewältigen ist. Aber dafür könnte man ja den guten alten cronjob in der Nacht bemühren.

Zum Thema Wörterbuch wäre eine lernende Applikation eventuell denkbar. Jedes einmal gefragtes Wort lande in einem eigenen Wörterbuch-Cache mit Kennzeichnung der Trennungsmöglichkeit. “Trenn-ungs-möglich-keit”
Man wundert sich vermutlich, wie wenig unterschiedliche Worte verwendet werden…

Christoph meint dazu:

4. Dezember 2008 um 09:39

Hier gibts das ganze nochmal als Javascript-Ansatz:
http://code.google.com/p/hyphenator/

Bei deiner Lösung ist natürlich wiederum sehr nett, dass man es bei reinen Präsentations-Seiten schön cachen kann und dann kein Flackern (wie bei der JS-Lösung) sieht.

DeBugger meint dazu:

5. Dezember 2008 um 08:08

Ich weiß, Klugscheißer kann keiner leider, aber fehlt in deiner Sammlung nicht auch noch das “ie”?

$nicht_trennbar= array(”ck”, “ch”, “sch”, “en”, “er”, “es”, “ei”, “au”, “eu”, “sp”, “pf”, “ft”, “nt”, “ts”);

Grüße DeBugger

timi meint dazu:

5. Dezember 2008 um 08:42

Danke fürs Feedback ;) Auch an den Debugger, denn das ie muss natürlich auch in die Liste… Ich werde demnächst noch ein wenig am Silbentrenner feilen, dabei werde ich Eure Anregungen und Ideen mit einbeziehen!

Bertram Simon meint dazu:

5. Dezember 2008 um 09:59

Spannendes Projekt. Ich wollte in der Vergangenheit ein Skipt zur Errechnung der Lesbarkeit von Texten schreiben (Die meisten kennen das ganze unter Flesch-Index). Dabei habe ich auch vor der Schwierigkeit kapituliert, eine halbwegs kompetente Silbentrennung zu programmieren und einen schnellen Hack genommen.

Julian Stier meint dazu:

10. Dezember 2008 um 16:22

Hi,
sehr beeindruckendes Script. Ich habe jetzt noch ziemlich Probleme jeden einzelnen Schritt zu verfolgen.
Ich bin mir nicht sicher, aber vielleicht wäre es möglich zusammengesetzte Wörter an einem speziellen Muster zu erkennen.. allerdings habe ich noch keine konkrete Idee und vielleicht lässt sich das Ganze noch etwas umgehen. Wenn ich etwas finde, melde ich mich ;)

Gruß,
Julian

butzi meint dazu:

16. Dezember 2008 um 13:21

Hallo Timi,

Es ist soweit schon ein sehr brauchbarer Algorithmus. Danke dafür!

Trenne niemals s und t, denn das tut ihm weh. “st” solltest du wohl auch mit aufnehmen, “ts” hast du ja schon.

Als Anregung, solltest du deine Liste vielleicht aufsplitten. Manche Kombination ist mitten im Wort häufiger getrennt und sollte daher vielleicht nicht in der Liste generell stehen (”en”, “er”, “es”, …). Eine Eigene für Wortenden wäre daher denkbar. Dadurch sollten dann auch zusammengesetzte Worte ein wenig besser getrennt werden können.

Der Fehler beim Wort Silbentrennung ist ja genau durch diese Liste hervorgerufen.

Wenn du nix dagegen hast, baue ich den Code gerne mit bei mir auf meiner PHP-Seite (functions-online.com) als “Eigene” Funktion mit Link zu diesem Artikel(?) ein.

Jan Bogutzki meint dazu:

16. Dezember 2008 um 18:19

Silbentrennung…

Angeregt durch einen Beitrag des PHP-Blogger wurde nun die Funktion zur Silbentrennung bereitgestellt. Die Funktion steht in deutsch und englisch zur Verfügung. Allerdings wurde die Funktion nicht für englische Wörter geschrieben, wenn Sie funktioni…

hype.yeebase.com meint dazu:

19. Dezember 2008 um 23:32

Silben trennen mit PHP…

Wie bring man PHP bei, wie man deutsche Worte trennt? Mal ein Artikel, der wirklich in die Tiefe geht!…

Hannes Christiansen meint dazu:

3. Januar 2009 um 16:06

Ein wirklcih interessanter Artikel und ein spannendes Projekt. Wobei ich mich die ganze Zeit frage, wozu? Im Normalfall benötigt man im Web keine Silbentrennung, … oder?

Marius Mühlberger meint dazu:

12. Januar 2009 um 09:40

Ich habe den Algo von Tex in PHP implementiert: Einsatzbereich ist ein Crossmediasystem, das direkt aus dem Web druckfähige Postscript-Daten erzeugt. Hier war für den Preview der Nutzer die Trennung notwendig um saubere Fließtexte zu erzeugen.

Uschi meint dazu:

19. Januar 2009 um 09:22

Also der Beitrag ist wirklich sehr schön zu lesen. Allerdings für mich etwas undurchsichtig. Ich blicke nicht ganz durch, da ich so was im Netz noch nie angewendet habe und auch mir stellt sich die Frage, ob man das denn wirklich auch braucht? Man muss doch nicht im Netz auch noch Silbentrennung machen. Es wird sowieso von vielen alles klein geschrieben und auf Rechtschreibung legt hier eher die Minderheit nur Wert von daher finde ich es schon überflüssig. Wendest du es denn an? Oder war das nur so ein Zeitvertreib für dich?

timi meint dazu:

19. Januar 2009 um 12:27

@Hannes und Uschi: Den Nutzen einer Silbentrennung sehe ich wie Ihr weniger in Webseiten. Vielmehr sind Applikationen die Zielgruppe, und dort gibt es wirklich viele Möglichkeiten für einen Einsatz:
- Vorschau für Printdaten im Web
- Generierung von PDFs
- Vorbereitung für das ­ Trennzeichen
- usw.

timi meint dazu:

19. Januar 2009 um 12:27

PS: Ich hab die Silbentrennug für eine Vorschaufunktion im Einsatz ;)

Tom meint dazu:

24. Januar 2009 um 21:05

Schönes Projekt, aber ich habe eine kleine Anmerkung, weil sich das in deinem Text so anhörte, als sei das richtig so. Die korrekte Silbentrennung von Apfel ist Ap-fel.

Martin meint dazu:

30. Januar 2009 um 16:42

Schöner Ansatz! Einige Bemerkungen:

1. Die Liste der “untrennbaren” Buchstabenkombinationen ist leider etwas zu großzügig. So ist “ft” durchaus trennbar, nicht nur in den - immer vorhandenen - Ausnahmen (”Huf-tier”), sondern auch in einstämmigen Wörtern wie “Hüf-te”. Und “ck” ist immer trennbar, aber dann als “k-k” (zumindest nach der “alten” Rechtschreibung, der einzigen, die ich gelernt habe).

2. Eine komplette Lösung des “Silbentrennungsproblems” kann wohl nur mit einem Wörterbuch erreicht werden, kombiniert mit einem Programm, das auch Wortstämme erkennt, und weiß, wie sich die zusammensetzen (oder zusammensetzen könnten). Selbst dann hat man Probleme: “Sil-ben-tren-nung” ist korrekt, aber “Wurzel + Regeln” erlaubt auch “Silb-ent-ren-nung” mit den Wurzeln “Silb-” und “renn-” (wie in “rennen”) und den Vor- und Nachsilben “ent-” und “-ung”. Da kommt dann die Sprachkenntnis zur Hilfe kommen, die sagt: “Ent-rennung” gibt’s nicht, und “Silb-ent-rennung” schon gar nicht!! Und letztendlich gibt’s dann noch zweideutige Wörter, die sich überhaupt nur im Satzzusammenhang korrekt trennen lassen: “Der Grenadier konnte die Wachs-tube zum Stiefelwichsen in der ganzen Wach-stube nicht finden.”

3. Und damit zu meinem eigentlichen Thema: dem Versuch, einen Computertext in Fraktur zu setzen! (siehe auch http://www.ligaturix.de/frakturaufsatz.pdf). Denn die Fraktur (oder besser “Deutsche Druckschrift”) unterscheidet ja in h

Martin meint dazu:

30. Januar 2009 um 17:02

.. und weiter geht’s (mein Versuch, auf einer englischen Tastatur einen Umlaut zu erzeugen führte zum Abschicken des halben Artikels!). –

Die Fraktur unterscheidet ja zwischen einem “Rund-s” oder “Schluß-s” einerseits (seit 1998 ja wohl “Schluss-s”), das am Ende einer Silbe steht, und dem “Lang-s” am Anfang oder in der Mitte. Also einerseits “Wach-ſtube” mit Lang-s (das ist nur korrekt lesbar, wenn Ihr Browser die entsprechende Unicode-Seite versteht und Ihr Zeichensatz auch dafür ein Zeichen hat), andererseits “Wachs-tube” mit Rund-s.

Somit wird die Rechtschreibung selber, unabhängig vom Silbentrennen, von der Silbenstruktur eines Wortes abhängig!

Und weiter: in der Fraktur (und nur dort) gibt es “Zwangsligaturen”: für einen Setzer im Deutschland bis 1941, waren “ck”, “ch”, “sch” und “tz” eigene Buchstaben dann — und nur dann! — wenn sie zum selben Wortstamm gehörten. Ligatur “tz” in “sitzen”, aber getrennt gesetztes “t” und “z” im deutschen Nachnamen “Gut-zeit”. Und dann noch die schöne Regel, daß das “ck” im polnischen Namen “Radecki” keine Ligatur und zu trennen ist, weil der ja Radetz-ky (wie der Marsch von J. Strauß Vater) ausgesprochen wird!

Alles in allem: wenn man korrekt einen in der Antiqua gesetzten oder mit ISO-8859-1 (”Latin-1″) kodierten Text in einer Frakturschrift drucken will, dann muß man entweder ein deutschsprachiges menschliches Hirn, oder aber ein wohl sehr komplexes und bisher wohl nicht existierendes Computersytem bemühen!

Gruß, Martin

Martin meint dazu:

30. Januar 2009 um 17:12

Dritter Schub:

Jetzt muß ich mich noch selber korrigieren: Rund-s steht nicht am Ende jeder Silbe, sondern nur am Ende eines “Wortteils”: also “Was-ser” mit Doppel-Lang-s, aber “Rechts-schutz” mit Rund-s + Lang-s. Die umgekehrte Reihenfolge, Lang-s + Rund-s, gab es im Deutschen nicht: das war *immer* ein ß. Erst in der (fast) unmöglichen Kombination “Fraktur + Neue Rechtschreibung” käme das jetzt vor, z.B. in “dass” (= “daſs”).

So - jetzt warte ich nur auf die eine Seite Perl-Code, die das alles flott macht! :)

Gruß, M.

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung