Autor |
Beitrag |
MisterAHA
      
Beiträge: 16
|
Verfasst: So 04.01.09 13:11
hallo leute,
ich beschäftigte mich seit einiger zeit mit der silbentrennung. dazu habe nun schon seit fast einer woche das web auf den kopf gestellt, bin aber leider zu keinem brauchbarem ergebnis gekommen.
das problem das es zu bewältigen geht, ist recht einfacher natur: um einen zeilenumbruch in datenbanken zu realisieren (rein optisch) muss eine silbentrennung her.
es muss ja nicht unbedingt 100%ig genau sein, aber so um die 90-95%.
hat einer von euch eine idee oder gar einen algorithmus parat?
vielen vielen danke im voraus für eure bemühungen.
mfg andreas
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 04.01.09 13:16
Schau dir doch mal die Algorithmen an, die LaTeX verwendet - die basieren meines Wissens nach auf sprachabhängigen Wahrscheinlichkeiten zur Silbentrennung. Das funktioniert relativ gut
AXMD
|
|
MisterAHA 
      
Beiträge: 16
|
Verfasst: So 04.01.09 13:22
danke erstmal für deine schnelle antwort,
den algorithmus habe ich leider nicht gefunden, sondern eher nur eine *.exe die fast 600MB gross ist. 
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.01.09 13:27
Dass das eben nicht so einfach ist, siehst du auch an diesem Versuch:
blog.defx.de/2006/12/01/silbentrennung
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 04.01.09 13:49
Ich hab vor 25 Jahren oder so mal einen Silbentrenner geschrieben, der für seine Größe (und mein Alter) recht brauchbar war. Er basiert auf Vorsilben, 'aussprechbaren' Silben und Teilwörtern. Daneben habe ich noch ein Wörterbuch für Ausnahmen implementiert. Das Resultat war aber für damalige Verhältnisse recht ordendlich.
Eine Beschreibung des TeX (nicht LaTeX)-Algorithmus ist hier zu finden en.wikipedia.org/wik...yphenation_algorithm Dort sind auch Links zu Implementierungen in Java, Ruby, Perl etc. Delphi ist -wie üblich- nicht dabei.
_________________ Na denn, dann. Bis dann, denn.
|
|
MisterAHA 
      
Beiträge: 16
|
Verfasst: So 04.01.09 13:53
das ist wohl immer unser delphi-nutzer-problem alzaimar,
hast du denn den quelltext denn noch da? vielleicht könnte man ihn ja nutzen?
mfg andreas
|
|
MisterAHA 
      
Beiträge: 16
|
Verfasst: So 04.01.09 14:19
ich habe einen sehr alten quelltext im netz gefunden.
was haltet ihr denn davon?
Die Funktion wird mit
silbentrennung("trennungswort")
aufgerufen und liefert eine Liste aus Positionswerten an denen getrennt werden darf.
Die variable "verbindungen" wird verwendet, um typische Zusammenhängende Laute zu definieren. Dabei wird in kauf genommen, das es viele Ausnahmen gibt, bei denen ein entsprechendes Wort anders getrennt wird.
Zeilen mit "--" sind Kommentare, die Nummerierung in OpenScript beginnt mit 1 anstatt mit 0.
Here we go
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| to get silbentrennung string welchesWort local int zeichenAnzahl, i local logical trennenErlaubt local string z, z0, z1, v local stack trennPositionen zeichenAnzahl = charCount(welchesWort) if zeichenAnzahl > 2 trennenErlaubt = false vokale = "a,e,i,o,u,ä,ü,ö" -- "sch" wie in "A_sche" -- "ch" wie in "Untersu_chen" -- "ph" wie in "Ste_phan" -- "ck" wie in "Zu_cker" -- "pf" wie "A_pfel" -- "br" wie in "Unter_brechung" -- "pl" wie "Finanz_plan" -- "tr" wie in "An_trag" -- "st" wie in "Auf_stehen" -- "gr" wie in "Hinter_grund" verbindungen = "sch,ch,ph,ck,pf,br,pl,tr,st,gr" trennungen = "-,/,\,*,#,;,.,+,=,),(,&,!,?,<,>,:, ,_,~" step i from 2 to (zeichenAnzahl-1) z0 = char i-1 of welchesWort if trennenErlaubt = false and istIn(z0,vokale) trennenErlaubt = true end if if trennenErlaubt z = char i of welchesWort z1 = char i+1 of welchesWort v = z0 & z if v = "ch" and i > 2 and char i-2 of welchesWort = "s" v = "sch" end if if istIn(z1,vokale) and istIn(z,vokale) = false and istIn(z,trennungen) = false and istIn(z0,trennungen) = false if istIn(v,verbindungen) push (i-charCount(v)+1) onto trennPositionen else push i onto trennPositionen end if end if end if end step end if return trennPositionen end silbentrennung |
den code habe ch genauso im netz, ohne einrückung gefunden. also bissl schwieriger zu lesen, aber immerhin
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 04.01.09 14:28
Bitte korrekte Quellnangabe nachliefern! "Im Netz" ist dies nämlich nicht 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.01.09 14:32
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 04.01.09 14:34
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
MisterAHA 
      
Beiträge: 16
|
Verfasst: So 04.01.09 14:36
|
|
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 04.01.09 14:37
|
|
MisterAHA 
      
Beiträge: 16
|
Verfasst: So 04.01.09 15:43
gäbe es denn nun einen verbesserungsvorschlag zu entsprechendem code? ^^
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 04.01.09 15:51
Hast du ihn denn ausprobiert? Sind die Ergebnisse für dich nicht ausreichend? Oder wie meinst du das?
|
|
MisterAHA 
      
Beiträge: 16
|
Verfasst: So 04.01.09 15:57
ich glaube schon, dass es soweit passt.
aber vielleicht hat einer von euch noch eine gute idee dazu, wo der code um die ohren fliegen könnte, verstehtst du?
dann könnte man eine solche behandlung des problems im vorfeld zu einem "non-problem" machen!
mfg andreas
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 04.01.09 15:59
Erstmal übersetzen würd ich vorschlagen
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| function silbentrennung(welchesWort: String): TStack; var zeichenAnzahl, i: Integer; trennenErlaubt: Boolean; z, z0, z1, v: String; trennPositionen: TStack; begin zeichenAnzahl := Length(welchesWort); if zeichenAnzahl > 2 Then Begin trennenErlaubt := false; vokale := 'a,e,i,o,u,ä,ü,ö'; verbindungen := 'sch,ch,ph,ck,pf,br,pl,tr,st,gr'; trennungen := '-,/,\,*,#,;,.,+,=,),(,&,!,?,<,>,:, ,_,~'; for i := 2 to (zeichenAnzahl-1) do Begin z0 := welchesWort[i-1]; if not trennenErlaubt and istIn(z0,vokale) Then Begin trennenErlaubt := true; end; if trennenErlaubt Then Begin z := welchesWort[i]; z1 := welchesWort[i+1]; v := z0 & z; if (v = 'ch') and (i > 2) and (welchesWort[i-2] = 's') Then Begin v := 'sch'; end; if istIn(z1,vokale) and not istIn(z,vokale) and not istIn(z,trennungen) and not istIn(z0,trennungen) then Begin if istIn(v,verbindungen) Then Begin trennPositionen.push(i-charCount(v)+1); end else Begin trennPositionen.push(i); end; end; end; end; end; Result := trennPositionen; end; |
k.A. ob ich das jetzt grad on-the-fly alles korrekt gelesen hab ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ffprogramming
      
Beiträge: 44
Win XP
C# Java C PHP
|
Verfasst: Do 08.01.09 19:56
Titel: schwer
ich hab mich mal an den TeX Algorythmus herangewagt das fand ich ziemlich schwer den zu impledieren.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Do 08.01.09 20:01
Also was meistens einigermaßen Passend erscheint: Zwischen Vokal und Konsonant. Oder zwischen Doppelkonsonanten. Aber beim genauen Arbeiten wirst du wohl um ein Wörterbuch nicht herumkommen, schätze ich mal.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: So 11.01.09 16:04
Vorschlag: Eine kleine Heuristik anlegen, die eine Silbe definiert und daneben eine Liste von Silben ('vor','keit','lich') anlegen, die Ausnahmen beinhaltet. Die wird sicherlich ziemlich lang werden. Dann das Wort in Silben unterteilen. Die Trennung von 'ck' usw. beachten.
Ein erster Ansatz sollte relativ schnell zu implementieren sein. Und immer dran denken: Der Algorithmus soll in erster Linie nur mögliche Trennpositionen finden, jedoch nicht alle! Solanger er keinen Müll produziert, ist das schon die halbe Miete.
Letztendlich würde ich mich jedoch an den TeX-Algo rantasten.
_________________ Na denn, dann. Bis dann, denn.
|
|
|