Seite 1 von 1

Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 01:08
von Andreas22
Ich habe vor, einen Python-Chatbot sämtliche in Deutschland vorkommende Namen als solche erkennen zu lassen, auch die seltenen wie "Aadat" zum Beispiel. Ich möchte sie erst einmal als Familiennamen kennzeichnen und das klappt auch, wenn die Liste eher klein bleibt, ohne Probleme. Da ich aber sämtliche in Deutschland vorkommenden Namen "einfangen" möchte, sind das 848000. Nun experimentiere ich schon den ganze Tag mit Groß- und Kleinschreibung, json etc. herum, aber nichts will funktionieren. Hat vielleicht von euch noch jemand eine Idee, was ich da machen könnte? Hier die noch funktionierende Liste, die noch direkt im Code steht. Davon muss ich weg, das ist schon mal klar. Aber welche Richtung schlage ich ein?

Code: Alles auswählen

lastname_words = ["Aaaken", "Aaanaskovic", "Aaarassi", "Aab", "Aabadi", "Aabam", "Aabaslama", "Aabbadi", "Aabbaz", "Aabdaoui", "Aabe", "Aabenhus", "Aabenraa", "Aaberg", "Aabjoe", "Aabo", "Aabol", "Aaboun", "Aach", "Aachbad", "Aachi", "Aachmann", "Aachtal", "Aachte", "Aacken", "Aackermann", "Aaclan", "Aad", "Aadama", "Aadat", "Aadda", "Aadel", "Aadil", "Aae", "Aaen", "Aaes", "Aafes", "Aaffane", "Aafkir", "Aagaard", "Aagard", "Aagardt", "Aagedal", "Aagesen", "Aagh", "Aagil", "Aagten", "Aahgui", "Aahi", "Aahlander", "Aahmady", "Aajaard", "Aajouch", "Aajour", "Aakcha", "Aakef", "Aakel", "Aaken", "Aakerlund", "Aakgöz", "Aakil", "Aakilde", "Aakmann", "Aakolk", "Aakrich", "Aakroti", "Aal", "Aalachi", "Aalai", "Aalali", "Aalam", "Aalami", "Aalaoui", "Aalbers", "Aalberts", "Aalbregtse", "Aalbrink", "Aalburg", "Aalden", "Aalderen", "Aaldering", "Aalderink", "Aalderks", "Aaldern", "Aalders", "Aaldijk", "Aalem", "Aalen", "Aalenburg", "Aalener", "Aaler", "Aalfeld", "Aalhof", "Aalhoul", "Aali", "Aalibrahim", "Aalili", "Aalimi", "Aaliu", "Aalkate", "Aalken", "Aall", "Aallachi", "Aalladui", "Aallali", "Aalmans", "Aalmink", "Aalpol", "Aalrep", "Aalrust", "Aalst", "Aalstede", "Aalten", "Aalto", "Aaltonen", "Aaltuiker", "Aalund", "Aalversuper", "Aalvlies", "Aamer", "Aami", "Aamir", "Aammari", "Aamold", "Aamot", "Aamouchi", "Aamran", "Aamraoui", "Aanam", "Aanau", "Aanbori", "Aandahl", "Aandekerk", "Aanderud", "Aanen", "Aanensen", "Aangaoui", "Aanhold", "Aanholt", "Aanouz", "Aans", "Aanstoot", "Aant", "Aaouali", "Aap", "Aapi", "Aar", "Aara", "Aarab", "Aarabi"]

text = input("Bitte geben Sie etwas ein, das ich auf deutsche Nachnamen untersuchen kann: ")

words = text.split()

for i, word in enumerate(words):
    stripped_word = word.rstrip(".,!?")
    if stripped_word in lastname_words:
        words[i] = "lastname(" + stripped_word + ")"

new_text = " ".join(words)
print(new_text)

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 05:03
von snafu
Was genau funktioniert denn nicht? Der Aufbau der Liste aus unbekannten Daten oder die späteren Abfragen? Das mit der Kleinschreibung ist schon richtig. Du kannst alle Elemente der Liste klein machen und dann bei den Abfragen auch den gesuchten Namen vorher klein machen. Wenn die Listen groß werden, sollte man übrigens über den Aufbau mittels set() nachdenken. Ein Set ist optimiert auf schnelle Abfragen via ``name in mein_set``.

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 08:16
von Sirius3
Was hast Du denn schon in Richtung "Groß- und Kleinschreibung, json etc." versucht? Was funktioniert daran konkret nicht?
Listen verändert man in Python nicht, sondern erzeugt neue Listen, mit dem geänderten Inhalt. Strings stückelt man nicht mit + zusammen, sondern nutzt f-Strings.
Für die Nachnamen bietet sich ein Set an. Ist es Absicht, dass im Ergebnis die Satzzeichen bei Nachnamen verschwinden?

Code: Alles auswählen

words = text.split()
lastnames = set(word.lower() for word in lastname_words)
new_words = []
for word in words:
    stripped_word = word.rstrip(".,!?")
	new_words.append(f"lastname({stripped_word})" if stripped_word.lower() in lastnames else word)

new_text = " ".join(new_words)
print(new_text)

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 21:22
von Andreas22
Lieber Sirius 3, lieber Snafu,
ganz herzlichen Dank für die raschen Antworten und euren Rat. In Json habe ich die txt-Datei gewandelt, weil ich hoffte, so leichter hinter die Fehler zu kommen, die ich in der Liste vermutete. Etwas in der Richtung 2 Kommas hintereinander oder so. Hat leider nicht geklappt. Faszinierenderweise hat mit meinem ersten Programm-Entwurf sowohl der Aufbau der Liste wie das Auslesen funktioniert. Da hatte ich allerdings nur eine pro-forma-Kurz Liste zu Testzwecken eingeführt. Als ich dann die ganze riesige Liste einfüllte, "erbleichte" die Liste in VSC sofort vor Schreck und ich brauchte eine Zeit, um mal nachzusehen, ob ich durch Löschung erst größerer, dann immer kleinerer Teile der Liste auf den Fehler kommen kann. Faszinierenderweise hat die Liste ihre gesunde Gesichtsfarbe mitten in einem Wort wiederbekommen, sodass ich annahm, das müsse das Maximum an Wörtern sein, das (zumindest auf meiner Kiste) Python zuzumuten ist. Danach fing die Experimentiererei an, die allerdings ohne Erfolg geblieben ist.
Das die Satzzeichen bei der Ausgabe verschwunden sind, ist in Ordnung.
Nun habe ich mal die Anregungen und meine eigenen Überlegungen zu fusionieren versucht und bin hierauf gekommen, was leider Gottes immer noch nicht funktioniert:

Code: Alles auswählen

lastname_words = ["aaken", "aaskovic", "aarassi", ...]

text = input("Bitte geben Sie etwas ein, das ich auf deutsche Nachnamen untersuchen kann: ")

words = text.split()
lastnames = set(word.lower() for word in lastname_words)

new_words = []
for word in words:
    stripped_word = word.rstrip(".,!?")
    new_words.append(f"lastname({stripped_word})" if stripped_word.lower() in lastnames else word)


Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 21:33
von Sirius3
Dass Editoren Probleme bekommen, wenn sie Zeilen mit mehreren Millionen Zeichen editieren sollen, ist jetzt nicht so ungewöhnlich. Wie hast Du die überhaupt eingegeben?
Will sagen, Du hast eine Datenquelle, die Du direkt anzapfen kannst, ohne den Umweg gehen zu müssen, das erst in Python-Code zu konvertieren.

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 22:02
von Andreas22
Stimmt schon :)
Aber wenn ich es mit sowas wie dem nachstehenden Programm probiere, gibt es zu "Hans Müller hat Gold gewonnen." nur wieder aus: "Hans Müller hat Gold gewonnen." anstatt "Hans lastname(Müller) hat Gold gewonnen.", obwohl in lastnames.txt steht: ""müllenstedt", "müller", "müllera",..."

Code: Alles auswählen

text = input("Bitte geben Sie etwas ein, das ich auf deutsche Nachnamen untersuchen kann: ")

lastnames = set()
with open("C://Users//User//Desktop//MALDIX K.I//GPT//lastnames.txt", "r", encoding="UTF-8") as f:
    for line in f:
        lastname = line.strip().lower()
        lastnames.add(lastname)

new_words = []
for word in text.split():
    stripped_word = word.rstrip(".,!?")
    new_words.append(f"lastname({stripped_word})" if stripped_word.lower() in lastnames else word)

new_text = " ".join(new_words)
print(new_text)

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 22:33
von Sirius3
Was steht denn in der Text-Datei drin? Wie sieht lastnames aus?

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 22:40
von Andreas22
Alle Namen, die in Deutschland vorkommen. Von "aaken", "aaskovic", "aarassi", über ""müllenstedt", "müller", "müllera" bis "zyzulewski", "zyzuri", "zzejroski", "zzinga".

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 22:45
von sparrow
Das ist, was du denkst, was darin steht.
Bitte poste die erste 4 Zeilen, so wie sie in der Datei stehen. Keine Prosa.

Alternative: ein print(repr(line)) an entsprechender Stelle und dann die ersten Zeilen der Ausgabe hier posten.

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 22:51
von Sirius3
Wenn dem so wäre, dann würdest Du auch Müller finden.

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 23:00
von Andreas22
Da es nur eine "Zeile" gibt, haut der Print-Befehl vom ersten bis zum letzten Namen alles raus. Wäre das nicht zu spammig, wenn ich das hier posten würde?

Re: Python und die Mammut-Liste

Verfasst: Dienstag 14. Februar 2023, 23:04
von __deets__
Dann passt der Code zum einlesen nicht zu dem Format. Und das Format ist schlecht. Die Namen sollten einzeln auf einer Zeile stehen.

Re: Python und die Mammut-Liste

Verfasst: Mittwoch 15. Februar 2023, 00:30
von Andreas22
1000 Dank für euer aller Unterstützung und vor allem für deinen entscheidenden Tipp deets. Wenn die Namen einzeln untereinander stehen, matcht das Programm alle Namen der Liste richtig. Hatte sogar darüber nachgedacht, dass das eigentlich nötig wäre, war mir aber sicher: "Dann wird die ganze Sache ja noch mehr aufgebläht." Ganz herzlichen Dank!

Re: Python und die Mammut-Liste

Verfasst: Mittwoch 15. Februar 2023, 03:48
von snafu
Übrigens: So ganz generell geht Python bei größeren Datenbeständen nicht so schnell in die Knie, außer du hast echt wenig Arbeitsspeicher auf dem Rechner. Nur eine Ausgabe im Terminal oder in der IDE ist irgendwann halt nicht mehr so sinnvoll. Zum Angucken würde ich unter Windows den notepad++ benutzen. Der kommt auch mit ziemlich großen Dateien gut klar, mittlerweile auch mit Dateien >= 2GB, siehe https://www.ghacks.net/2022/03/01/notep ... rformance/.

Re: Python und die Mammut-Liste

Verfasst: Mittwoch 15. Februar 2023, 09:04
von Andreas22
Merci :) Ist schon runtergeladen. LG A