Python :: Aufgabe #104

1 Lösung Lösung öffentlich

Zeichensatz zu Umlauten

Fortgeschrittener - Python von J_U_B - 16.03.2016 um 10:03 Uhr
Es soll ein Programm geschrieben werden, welches Zeichensätze aus einem String - wie zum Beispiel "AE", "OE", "UE" oder "SS" - in die Entsprechenden Umlaute umwandelt - "AE" zu "Ä", "OE" zu "Ö" u.s.w.

Hierbei sollte auf die Korrekte Umsetzung der Wörter geachtet werden, hierfür einige Beispiele:

STOSSDAEMPFER = STOßDÄMPFER
STEUERKETTE = STEUERKETTE
KASSE = KASSE
HUELSE = HÜLSE

u.s.w.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 22.03.2016 um 12:08 Uhr
Die Lösung verwendet das PyEnchant-Modul für einen Wörterbuchabgleich.
Die Funktion "umlaut_variants" generiert alle möglichen - auch unsinnigen - Varianten eines Wortes durch Ersetzen der Umlaute.
Die so erzeugte Variantenliste wird gegen das Wörterbuch abgeglichen (Funktion "replace_umlauts"), der erste Treffer gewinnt.
Beispiele:

Konsolenausgabe:

Geben Sie einen Satz oder ein Wort ein: Stossdaempfer
Stoßdämpfer
Geben Sie einen Satz oder ein Wort ein: Steuerduese
Steuerdüse
Geben Sie einen Satz oder ein Wort ein: Kasse
Kasse
Geben Sie einen Satz oder ein Wort ein: Huelse
Hülse
Geben Sie einen Satz oder ein Wort ein: Guenther schoepft Gemuesebruehe mit dem Schoepfloeffel.
Günther schöpft Gemüsebrühe mit dem Schöpflöffel.
Geben Sie einen Satz oder ein Wort ein: Der Hoehlenbaer liebt die Fruehlingsbluemchen.
Der Höhlenbär liebt die Frühlingsblümchen.

Nicht immer findet sich ein passender Begriff im Wörterbuch:

Konsolenausgabe:

Geben Sie einen Satz oder ein Wort ein: Fruehblueher
Fruehblueher
Geben Sie einen Satz oder ein Wort ein: Schoepfgefaess
Schoepfgefaess


Quellcode ausblenden Python-Code
#!/usr/bin/python3
#
import enchant

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


def next_umlaut(word):
	findres = [ (word.find(uml), uml) for uml in umlauts.keys() ]
	umlpos = [ (p, u) for (p, u) in findres if p >= 0 ]
	if len(umlpos) > 0:
		return min(umlpos)
	else:
		return (-1, '')	
		

def umlaut_variants(word, wlist):
	wlen = len(wlist)

	(pos, uml) = next_umlaut(word)
	if pos >= 0:
		wslice = word[:pos+len(uml)]
		rslice = wslice.replace(uml, umlauts[uml], 1)
		if wlen == 0:
			wlist.append(wslice)
			wlist.append(rslice)
		else:
			for i in range(0, wlen):
				wlist.append(wlist[i] + rslice)
				wlist[i] += wslice
		umlaut_variants(word[pos+len(uml):], wlist)

	else:
		if wlen == 0:
			wlist.append(word)
		else:
			for i in range(0, wlen):
				wlist[i] += word


def replace_umlauts(word, dictionary):
	word_list = []
	umlaut_variants(word, word_list)
	for variant in word_list:
		if dictionary.check(variant) == True:
			return variant
	return word		


#main
if enchant.dict_exists("de_DE"):
	dict_ger = enchant.Dict("de_DE")
	while True:
		instring = input("Geben Sie einen Satz oder ein Wort ein: ")
		if instring == "":
			break
		for word in instring.split():
			new_word = replace_umlauts(word, dict_ger)
			print(new_word, end=" ")
		print("")
else:
	print("Deutsches Wörterbuch nicht verfügbar!")