Umlaute auf "ähnliche" ASCII-Zeichen abbilden, z.B. ä->a (unicodedata?)
Hi, vor einigen Wochen gab es ja eine ganz spannende Diskussion über NFD/NFC usw auf dieser Liste. Nachdem ich mich ganz oberflächlich zu diesem Thema belesen haben, interessiert mich jetzt folgendes: Ist es mit dem Python-Module bzw. der dahinterliegenden Datenbank möglich, Umlaute auf "ähnliche" ASCII-Zeichen abzubilden? Also z.B. ä->a, ü->u? Hintergrund ist, dass ich einen Suchindex befüllen möchte und die Suche gegenüber Umlauten tolerant sein soll (also auch "Straße" findet, wenn der User nach 'Strasse' sucht). In der Unicode-Datenbank gibt es ja die Information teilweise. Wenn ich z.B. unicodedata.decomposition(u'é') verwende, bekomme ich '0065 0301', mithin also u'\u0065' ("e"). Nun ist meine Frage, ob das ein halbwegs sicherer Ansatz ist oder ob ich mich gerade ganz arg in die Nesseln setze. Hier noch meine Randbedingungen: - Es muss eigentlich nur für die deutsche Sprache funktionieren, alles andere ist nur "nettes Extra". Auf gar keinen Fall asiatische Sprachen. - Alternativ habe ich bislang diese Mappings immer per Hand deklariert für etwa 10-20 Zeichen. Wenn mir unicodedata also "out of the box" mehr mitbringt, ist das schon ein großer Bonus. Vielen Dank, Felix
Am 04.01.2013 11:38, schrieb Felix Schwarz:
Hi,
vor einigen Wochen gab es ja eine ganz spannende Diskussion über NFD/NFC usw auf dieser Liste. Nachdem ich mich ganz oberflächlich zu diesem Thema belesen haben, interessiert mich jetzt folgendes: Ist es mit dem Python-Module bzw. der dahinterliegenden Datenbank möglich, Umlaute auf "ähnliche" ASCII-Zeichen abzubilden? Also z.B. ä->a, ü->u?
http://pypi.python.org/pypi/Unidecode/ Christian
Am 04.01.2013 um 12:32 schrieb Christian Heimes:
Gar nicht schlecht. Nur macht es leider (natürlich) keine sprach- spezifische phonetische Transkription [1] von Umlauten oder nur unsystematisch:
unidecode(u"œvre") 'oevre' unidecode(u"straße") 'strasse' unidecode(u"Frau Holle") 'Frau Holle' unidecode(u"Frau Hölle") 'Frau Holle' # statt 'Frau Hoelle'
Ach ja, und hier taucht auch das mysteriöse große SZ [2] auf:
print unidecode(u"föo-ß-ẞ") foo-ss-Ss
Und manchmal tut es vielleicht sogar auch eine Art "slugify":
from django.template.defaultfilters import slugify slugify(u"föobär") u'foobar'
Oder auch nicht:
slugify(u"föobärß") u'foobar'
Gruß, Dinu [1] http://de.wikipedia.org/wiki/Phonetische_Suche [2] http://de.wikipedia.org/wiki/Großes_ß
Hallo, Am 04.01.2013 11:38, schrieb Felix Schwarz:
- Es muss eigentlich nur für die deutsche Sprache funktionieren, alles andere ist nur "nettes Extra". Auf gar keinen Fall asiatische Sprachen. Ich verwende dafür diese paar Zeilen:
def _strip_accents(s): return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')) -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Goebel Consult http://www.goebel-consult.de Monatliche Kolumne: http://www.cissp-gefluester.de/2012-02-bring-your-own-life-glosse Blog: http://www.goebel-consult.de/blog/20060215 Goebel Consult ist Mitglied bei http://www.7-it.de/
participants (4)
-
Christian Heimes -
Dinu Gherman -
Felix Schwarz -
Hartmut Goebel