[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