Code für Silbentrennung (deutsch)

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.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

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]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

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]

Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Thorsten1867 hat geschrieben:Optimierter und fehlerbereinigter Code:
Super, vielen Dank! :allright:

Grüße ... Kiffi
a²+b²=mc²
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

ich schließe mich Kiffi an :allright:
Win11 x64 | PB 6.20
Benutzeravatar
Bagalut
Beiträge: 9
Registriert: 29.04.2009 17:42

Danke!

Beitrag von Bagalut »

Andesdaf hat geschrieben:ich schließe mich Kiffi an :allright:
Ich auch! Danke! :allright:
Little John

Beitrag von Little John »

Ich schließe mich Andesdaf an. ;-)
Beeindruckend!

Gruß, Little John
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag von c4s »

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 »

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 »

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
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

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]

Bild
Antworten