Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Thorsten1867
Beiträge: 1360 Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:
Beitrag
von Thorsten1867 » 03.05.2009 19:10
Little John hat geschrieben: Das selbe Problem z.B. bei
Holz - ti - sch
Aber komisch ist -- zumindest für mich, der ich mich mit dem zu Grunde liegenden Algorithmus nicht beschäftigt habe -- dass
Tisch
richtigerweise nicht getrennt wird.
Die Pattern stammen nicht von mir, sondern gehören zum Algorithmus.
Zusammengesetzte Wörter sollen teilweise Schwierigkeiten machen. Man muss dafür wohl eine Ausnahmeliste erstellen.
[Edit]Problem gefunden! Wortende wurde nicht als solches erkannt.[/Edit]
Download of PureBasic - Module
Download of PureBasic - Programmes
[Windows 11 x64] [PB V6]
Thorsten1867
Beiträge: 1360 Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:
Beitrag
von Thorsten1867 » 04.05.2009 18:23
Optimierter und fehlerbereinigter Code:
Code: Alles auswählen
;/ Silbentrennung
;/ Algorithmus von Frankling Mark Liang (1983)
;/ basierend "hyphenator für HTML" (Mathias Nater, Zürich)
;/ Mai 2009 Thorsten Hoeppner (Thorsten1867)
Structure HyphenStructure
chars.s
pattern.s
EndStructure
Global NewList HyphPattern.HyphenStructure()
Procedure LoadPattern(PatternFile.s)
ClearList(HyphPattern())
If ReadFile(0, PatternFile.s)
While Eof(0) = 0
pattern$ = Trim(ReadString(0,#PB_UTF8))
AddElement(HyphPattern())
HyphPattern()\chars = StringField(pattern$,1,":")
HyphPattern()\pattern = StringField(pattern$,2,":")
Wend
CloseFile(0)
Else
MessageRequester("Lade Trennungsmuster", "Datei konnte nicht eingelesen werden.", 0)
EndIf
EndProcedure
Procedure.s InsertString(string.s, idx.b, chars.s)
If idx > 1
result.s = Left(string, idx-1)+chars+Mid(string, idx)
ElseIf idx >= Len(string)
result.s = string + chars
Else
result.s = chars + string
EndIf
ProcedureReturn result
EndProcedure
Procedure.s HyphenateWord(wort.s)
Define.b WLen, WIdx
Define.s Char, LWort
wort = "_"+wort+"_"
LWort = LCase(wort)
WLen = Len(wort)
Dim Hypos.s(WLen)
ForEach HyphPattern() ; Pattern auswerten
WortIdx = FindString(LWort, HyphPattern()\chars, 1)
If WortIdx
digits = 1
For i=1 To Len(HyphPattern()\pattern)
Char.s = Mid(HyphPattern()\pattern, i, 1)
If Asc(Char) >= 48 And Asc(Char) <= 57 ; Ist Zahl (0-9)
If i = 1
z = WortIdx
Else
z = WortIdx + i - digits
EndIf
If Not Hypos(z) Or Hypos(z) < Char ; kleinere Zahl überschreiben
Hypos(z) = Char
EndIf
digits + 1
EndIf
Next
Debug "Pattern: "+HyphPattern()\pattern+" ("+Str(WortIdx)+")"
EndIf
Next
inserted.b = 0 ; Trennmuster erzeugen
For i = 3 To WLen-2
If Val(Hypos(i))
wort = InsertString(wort, i + inserted, Hypos(i))
inserted + 1
EndIf
Next ;}
wort.s = RemoveString(wort, "_") ; Wortanfang/-ende entfernen
Debug "Trennmuster: "+wort
For i = 1 To 9 ; Trennstellen ermitteln (ungerade Zahlen)
If (i % 2) ; Trennstelle
wort = ReplaceString(wort, Str(i), "|")
Else ; keine Trennstelle
wort = RemoveString(wort, Str(i))
EndIf
Next
ProcedureReturn wort
EndProcedure
LoadPattern("HyphenPattern.de")
wort$ = InputRequester("Silbentrennung", "Wort eingeben:", "")
result$ = HyphenateWord(wort$)
MessageRequester("Silbentrennung", ReplaceString(result$, "|", " - "), #MB_OK)
Sourecode + Hyphenation Patterns
Zuletzt geändert von
Thorsten1867 am 05.05.2009 22:15, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes
[Windows 11 x64] [PB V6]
Kiffi
Beiträge: 10711 Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
Beitrag
von Kiffi » 04.05.2009 20:05
Thorsten1867 hat geschrieben: Optimierter und fehlerbereinigter Code:
Super, vielen Dank!
Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2671 Registriert: 15.06.2008 18:22
Wohnort: Dresden
Beitrag
von Andesdaf » 05.05.2009 16:29
ich schließe mich Kiffi an
Win11 x64 | PB 6.20
Bagalut
Beiträge: 9 Registriert: 29.04.2009 17:42
Beitrag
von Bagalut » 05.05.2009 17:39
Andesdaf hat geschrieben: ich schließe mich Kiffi an
Ich auch! Danke!
Little John
Beitrag
von Little John » 05.05.2009 17:41
Ich schließe mich Andesdaf an.
Beeindruckend!
Gruß, Little John
c4s
Beiträge: 1235 Registriert: 19.09.2007 22:18
Beitrag
von c4s » 05.05.2009 19:47
Danke!
Aber was ist z.B. hiermit:
fußballspieltorwart -> fuß - ball - spieltor - wart
"Spiel" und "Tor" müssten doch ebenfalls getrennt werden?!
"
Menschenskinder, das Niveau dieses Forums singt schon wieder! " —
GronkhLP ||| "
ich hogffe ihr könnt den fehle endecken " —
Marvin133 ||| "
Ideoten gibts ... " —
computerfreak ||| "
Jup, danke. Gruss " —
funkheld
Little John
Beitrag
von Little John » 05.05.2009 20:36
c4s hat geschrieben: Danke!
Aber was ist z.B. hiermit:
fußballspieltorwart -> fuß - ball - spieltor - wart
"Spiel" und "Tor" müssten doch ebenfalls getrennt werden?!
Das Wort
fußballspieltorwart
habe ich weder je gehört noch im Duden gefunden. Erwartest Du, dass das Programm jedes ausgedachte Wort trennen kann?
Die Wörter
Fußballspiel
Fußballspieler
Fußballspielerin
Fußballtor
Fußballtorwart
werden jedenfalls alle korrekt getrennt.
Gruß, Little John
c4s
Beiträge: 1235 Registriert: 19.09.2007 22:18
Beitrag
von c4s » 05.05.2009 21:21
So ganz zufrieden bin ich dennoch nicht:
Heizöl -> Hei - zöl
Schifffahrt -> Schif - f- fahrt
Aber hast ja recht
"
Menschenskinder, das Niveau dieses Forums singt schon wieder! " —
GronkhLP ||| "
ich hogffe ihr könnt den fehle endecken " —
Marvin133 ||| "
Ideoten gibts ... " —
computerfreak ||| "
Jup, danke. Gruss " —
funkheld
Thorsten1867
Beiträge: 1360 Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:
Beitrag
von Thorsten1867 » 05.05.2009 21:47
Zusammengesetzte Namenwörter können evtl. Probleme machen, da es sich um einen Algorithmus und nicht um eine Wörterliste handelt.
Für solche Fälle muss eine Ausnahmeliste angelegt werden.
Ich empfehle zu dem Thema Trennproblematik die Artikeln zur Silbentrennung (siehe Beitrag weiter oben) zu lesen.
Der "Schifffahrt" und der "Balletttänzerin" kann man abhelfen. Füge folgende Pattern in die Pattern-Datei ein:
fff:f6f9f
ttt:t6t9t
[Edit]In der neuen Patterndatei schon enthalten.[/Edit]
Zuletzt geändert von
Thorsten1867 am 06.05.2009 15:45, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes
[Windows 11 x64] [PB V6]