Seite 1 von 1

Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 19:13
von YAPD
Guten Abend Zusammen,

ich würde gerne wissen, was die beste Methode ist, um Sonderzeichen herauszufiltern.
Ich habe folgende Funktion geschrieben, die genau das macht, was es soll. Ich würde
nur gerne wissen, ob es eine bessere Variante gibt.

Hier der Code :

Code: Alles auswählen

def remove_umlauts(string):

    specialcharacters_store = {"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}

    for specialcharacter in specialcharacters_store.keys():
        string = string.replace(specialcharacter, specialcharacters_store[specialcharacter])

    return string

print(remove_umlauts("Der Fluß ist der Übergang zur Stadt für die Bevölkerung der Ägypter !"))

Output : Der Fluss ist der Uebergang zur Stadt fuer die Bevoelkerung der Aegypter !
Ich habe auch bereits mit unidecode herumprobiert, allerdings ersetzt er hier z. B. das Ö durch
ein "O" anstatt ein "Oe".

Code: Alles auswählen

import unidecode
unaccented_string = unidecode.unidecode(SC_Vars )
print( "Results :" , unaccented_string )
Ich bin dankbar für Vorschläge.

VG
YAPD

Re: Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 19:49
von rogerb
Ich bin mir ehrlich gesagt, nicht sicher ob das die beste Methode ist, aber ich würds so machen:

Code: Alles auswählen

def remove_umlauts(string):

    specialcharacters_store = {"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}

    return "".join(specialcharacters_store.get(letter, letter) for letter in string)

print(remove_umlauts("Der Fluß ist der Übergang zur Stadt für die Bevölkerung der Ägypter !"))
Bei "replace" wird sicherlich intern jedesmal der gesamte Text abgesucht. Hier geht man nur einmal über den Text. Ist der Buchstabe ein Umlaut also im Dictionary, wird er ersetzt, wenn nicht kommt einfach der Buchstabe selbst an die entsprechende Stelle.

Re: Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 20:20
von sparrow
Wenn es darum geht bestimmte Zeichen nach einem bestimmten Schema zu ersetzen, würde ich einen Blick auf str.translate() werfen.

Re: Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 21:07
von YAPD
sparrow hat geschrieben: Freitag 13. August 2021, 20:20 Wenn es darum geht bestimmte Zeichen nach einem bestimmten Schema zu ersetzen, würde ich einen Blick auf str.translate() werfen.
Danke für deine Antwort. Leider bekomme ich es so nicht hin, da die auszutauschenden Zeichen die gleiche Länge
haben müssen, ich will aber Ä mit Ae , Ö mit Oe usw. ersetzen. Daher bekomme ich immer die Meldung :

Code: Alles auswählen

ValueError: the first two maketrans arguments must have equal length
VG
YAPD

Re: Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 21:25
von YAPD
rogerb hat geschrieben: Freitag 13. August 2021, 19:49 Ich bin mir ehrlich gesagt, nicht sicher ob das die beste Methode ist, aber ich würds so machen:

Code: Alles auswählen

def remove_umlauts(string):

    specialcharacters_store = {"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"}

    return "".join(specialcharacters_store.get(letter, letter) for letter in string)

print(remove_umlauts("Der Fluß ist der Übergang zur Stadt für die Bevölkerung der Ägypter !"))
Bei "replace" wird sicherlich intern jedesmal der gesamte Text abgesucht. Hier geht man nur einmal über den Text. Ist der Buchstabe ein Umlaut also im Dictionary, wird er ersetzt, wenn nicht kommt einfach der Buchstabe selbst an die entsprechende Stelle.
Danke für deinen Beitrag und auch für die Erklärung. :) So ist es natürlich
besser, weil es einfach Zeit spart, nur einmal über den String drüber zu gehen.

VG
YAPD

Re: Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 21:56
von Sirius3
@YAPD: genau, es ist sogar um den Faktor 0.04 mal so schnell.
Selbst translate ist noch um den Faktor 10 langsamer als Deine Variante.

Code: Alles auswählen

UMLAUT_MAPPING = str.maketrans({"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"})                                                                             

def remove_umlauts(string):
    return string.translate(UMLAUT_MAPPING)
Trotzdem würde ich diese Variante bevorzugen, weil sie am lesbarsten ist.

Re: Codierung von Zeichen

Verfasst: Freitag 13. August 2021, 22:09
von nezzcarth
Ich verwende dafür oft PyICU:

Code: Alles auswählen

In [1]: import icu

In [2]: transliterator = icu.Transliterator.createInstance('de-ascii')

In [3]: transliterator.transliterate('Ä Ö Ü ä ö ü ß')
Out[3]: 'AE OE UE ae oe ue ss'

Re: Codierung von Zeichen

Verfasst: Samstag 14. August 2021, 18:47
von YAPD
Sirius3 hat geschrieben: Freitag 13. August 2021, 21:56 @YAPD: genau, es ist sogar um den Faktor 0.04 mal so schnell.
Selbst translate ist noch um den Faktor 10 langsamer als Deine Variante.

Code: Alles auswählen

UMLAUT_MAPPING = str.maketrans({"Ä": "Ae", "Ö": "Oe", "Ü": "Ue", "ä": "ae", "ö": "oe", "ü": "ue", "ß": "ss"})                                                                             

def remove_umlauts(string):
    return string.translate(UMLAUT_MAPPING)
Trotzdem würde ich diese Variante bevorzugen, weil sie am lesbarsten ist.
Das heißt, du würdest sie bevorzugen, obwohl sie defacto langsamer ist ?
Ist das nicht nachteilig, wenn z.B. in einer sehr großen Textdatei alle Zeichen
ersetzt werden sollen, oder täusche ich mich da und die Unterschiede sind
gering ?
nezzcarth hat geschrieben: Freitag 13. August 2021, 22:09 Ich verwende dafür oft PyICU:

Code: Alles auswählen

In [1]: import icu

In [2]: transliterator = icu.Transliterator.createInstance('de-ascii')

In [3]: transliterator.transliterate('Ä Ö Ü ä ö ü ß')
Out[3]: 'AE OE UE ae oe ue ss'
Danke für den Hinweis, ich muss mir das Modul auf jeden Fall anschauen ;)

VG
YPAD

Re: Codierung von Zeichen

Verfasst: Samstag 14. August 2021, 22:27
von __blackjack__
@YAPD: Wie gross muss der Text denn werden, dass man das überhaupt merkt. Es ist halt ein sehr offensichtlicher und an sich nicht ineffizienter Weg das so zu machen. Es wird eine Methode für das benutzt wofür sie gedacht ist.