Python und die Mammut-Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

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)
Benutzeravatar
snafu
User
Beiträge: 6753
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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``.
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

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)

Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

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)
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Was steht denn in der Text-Datei drin? Wie sieht lastnames aus?
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Alle Namen, die in Deutschland vorkommen. Von "aaken", "aaskovic", "aarassi", über ""müllenstedt", "müller", "müllera" bis "zyzulewski", "zyzuri", "zzejroski", "zzinga".
Benutzeravatar
sparrow
User
Beiträge: 4244
Registriert: Freitag 17. April 2009, 10:28

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.
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn dem so wäre, dann würdest Du auch Müller finden.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann passt der Code zum einlesen nicht zu dem Format. Und das Format ist schlecht. Die Namen sollten einzeln auf einer Zeile stehen.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

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!
Benutzeravatar
snafu
User
Beiträge: 6753
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ü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/.
Andreas22
User
Beiträge: 31
Registriert: Donnerstag 5. Januar 2023, 16:51

Merci :) Ist schon runtergeladen. LG A
Antworten