[Trennmuster] Parser fuer Wortliste

Guenter Milde milde at users.sf.net
Do Feb 16 13:48:30 CET 2012


On 13.02.12, Werner LEMBERG wrote:

> > Die Interoperabilität ließe sich vermutlich dadurch sicherstellen,
> > dass wir lokale- und kodierungsabhängige Aufgaben nicht auf
> > Shell-Ebene, sondern innerhalb von "richtigen" Skriptsprachen
> > erledigen.

> Entschuldige, aber das ist nur ein Verschieben des Problems.  Wenn wir
> uns auf eine Shell einigen, z.B. bash, die ja genauso unter Windows
> verfügbar ist, egalisiert sich dieses Argument.

Im Endeffekt is bash auch nur eine Skriptsprache, da können wir auch eine
mächtigere Sprache, die auf nicht-Unix Systemen weiter verbreitet ist nehmen.

> > Ich gehe davon aus, dass in Perl, Python, Lua, Java etc. das
> > Sortieren plattformübergreifend robust funktioniert, mit allen
> > möglichen Kodierungen und unabhängig von den Lokaleeinstellungen des
> > jeweiligen Benutzers.

> Das ist korrekt, wenn man die Lokale am Anfang des Skripts setzt (so
> wie ich das auch in meinen Bash-Skripten tue).

oder einen expliziten Sortierschlüssel erstellt, wie ich es im angehängten
Python-Skript tue.

...

> Wie ich schon erwähnt habe: Die Sortierung ist vorgegeben durch

>   LC_COLLATE=de_DE.ISO8859-1
>   LC_CTYPE=de_DE.ISO8859-1

> wobei ich noch den Parameter »-d« an »sort« übergebe, damit alles
> außer Buchstaben (und Ziffern und Leerzeichen) bei der Sortierung
> ignoriert wird (»Telephonbuchsortierung«).

Allerdings ist das Resultat insofern eine "merkwürdige" Sortierung, weil
dann die Trennmuster direkt an das Wort angehängt und kurze Wörter
zum Teil falsch einsortiert werden. 

Beispiel:

 Diakonat;Dia·ko·nat
 Diakon;Dia·kon
 Diakone;Dia·ko·ne

anstelle von

 Diakon;Dia·kon
 Diakonat;Dia·ko·nat
 Diakone;Dia·ko·ne


(der Sortieralgoritmus sieht "diakondiakon").


Ich habe nun eine Weile mit den verschiedenen Optionen "gespielt".

Mit dem "sort" Programm konnte ich die Sortierung nicht reproduzieren:

* ich habe die de_DE.ISO8859-1 locale (so wie alle anderen nicht
  benötigten) bei mir mit "localepurge" gelöscht.
  Also konvertiere ich die `wortliste` nach UTF-8 und nutze
  de_DE.utf-8.
  
* ich verwende  "sort (GNU coreutils) 8.13"

* Ohne den Schalter -d, werden kurze Wörter (falsch) nach hinten geschoben,
  weil ';' als Zeichen nach den Buchstaben einsortiert wird.
  
* Mit `sort -d wortliste` werden die Umlaute nach "z" sortiert. Anscheinend
  hebt die Option hier die Lokale auf.
  
  
Da die Sortierung mit -d aber sowieso problematisch ist (siehe oben),
habe ich ein Python-Skript zum Sortieren geschrieben.
(Es hängt, gemeinsam mit dem benötigtem Hilfspaket "werkzeug.py" an.)

Der Kern ist folgende Funktion zum Erstellen eines Sortierschlüssels:

# Erstelle einen Sortierschlüssel für die Zeile `line`:
#
# Sortiere nach erstem Feld, alphabetisch, gemäß Duden-Regeln.

def sortkey_duden(line):
    ersetzungen = {
                   ord(u'ä'): u'a',
                   ord(u'é'): u'e',
                   ord(u'ö'): u'o',
                   ord(u'ó'): u'o',
                   ord(u'ü'): u'u',
                   # + weitere Akzente: -> siehe unten
                   ord(u'ß'): u'ss',
                  }
    # Sortieren nach erstem Feld:
    key = line.split(';')[0]
    # Großschreibung ignorieren
    key = key.lower()
    key = key.translate(ersetzungen)
    # Akzente/Umlaute weglassen:
    key = unicodedata.normalize('NFKD', key) # Akzente mit 2-Zeichen-Kombi
    key = key.encode('ascii', 'ignore')     # ignoriere nicht-ASCII Zeichen

    return key

Damit läßt sich die Wortliste in die Duden-Sortierordnung bringen (wobei
ich davon ausgehe, daß die Einträge im ersten Feld der "wortliste" keine
nichtalphabetischen Zeichen enthalten).


viele Grüße

Günter
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : sort.py
Dateityp    : text/x-python
Dateigröße  : 2112 bytes
Beschreibung: nicht verfügbar
URL         : <https://listi.jpberlin.de/pipermail/trennmuster/attachments/20120216/73bf1f98/attachment.py>
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : werkzeug.py
Dateityp    : text/x-python
Dateigröße  : 11598 bytes
Beschreibung: nicht verfügbar
URL         : <https://listi.jpberlin.de/pipermail/trennmuster/attachments/20120216/73bf1f98/attachment-0001.py>


Mehr Informationen über die Mailingliste Trennmuster