Hallo! Ich habe folgendes Problem: Ich habe in einer Datenbank Namen im Format "Joe User". Diesen String möchte ich in zwei Strings mit Vornamen und Nachnamen zerlegen. Das ist auch in 90% der Fälle ganz einfach. Aber was mache ich mit Namen >= 3 Wörtern? Manche haben mehrere Vornamen, von oder zu im Nachnamen. Doppennamen sind miestens mit '-' getrennt. Aber immer? Dann gibt es ausländische Namen mit Ausnahmen wie z.B. arabische Namen usw. Ziel ist es, einen Algorithmus zu finden, der dieses Problem in den meisten Fällen löst. Vielleicht hat sich jemand darüber schonmal Gedanken gemacht und ich muss nicht gleich bei Null anfangen.
Bei der Aufgabenstellung ist zu befürchten, daß für die nicht trivialen Fälle kein Algorithmus existiert (?). Wenn man alle international existierenden Schreibweisen hinzunimmt, hilft möglicherweise nur ein gigantisches Wörterbuch... Wenn amn sich auf deutsche Schreibweisen beschränkt, hier einige Ideen: - Aufteilung in Token, Trennzeichen = Leerzeichen - Bei einer Folge aus großgeschriebenen Bestandteilen: der letzte ist Nachname, die vorangehenden sind Vornamen - Wenn kleingeschriebene Bestandteile dazwischenstehen, sind das Namenszusätze - Durch Bindestrich verbundene sind Nachname Damit das funktioniert, muß die DB aber korrekt gefüllt sein. Namenszusätze wie "von" oder "zu" sind oft großgeschrieben gespeichert (was falsch ist). Das z.B. würde o.g. Algo durcheinanderbringen... Gruß Martin
Die Datenbank scheint ja schon recht groß zu sein, wenn Du es nicht von Hand machen möchtest :) Ich würde erstmal so vorgehen: Erstmal alle eindeutigen Namen abfertigen, danach die weiteren Namen machen: Such in deiner neu angelegten Namen-Datenbank (wo Vorname, Nachname getrennt sind) nach den Namensteilen und ordne sie dahin zu, wo du mehr Treffer findest. Die Einträge, bei denen Du keine oder ähnlich viele Übereinstimmungen findest, musst du vielleicht echt von Hand sortieren. Wenn du dann 100- 500 von Hand gemacht hast (keine 30 Minuten arbeit) kannst Du nochmal den Algorithmus von oben abarbeiten.
> - Durch Bindestrich verbundene sind Nachname
Nö, das muss nicht.
"Jens-Uwe Müller", "Horst-Kevin Schulze"
Wird verwendet, wenn beide Vornamen als gemeinsamer Rufname verwendet
werden.
Ich schätze, daß das Problem schon deshalb nicht algorithmisch lösbar ist, weil eine ganze Reihe von deutschen Namen sowohl Vor- als auch Familiennamen sein können und die Reihenfolge, in der Vor- und Familiennamen genannt werden, auch nicht fest definiert ist. Zieht man dann noch in Betracht, daß bei ausländischen Namen nur zu oft auch unsere deutsche Intuition versagt, dann kann man das Problem eigentlich nur als (fast) ausschließlich vom Namensträger gelöst werden kann - indem man Vor- und Familiennamen in getrennten Feldern abfragt.
Vielleicht muss man das Problem nicht in seiner vollen Allgemeinheit lösen. Für was sollen denn die gewonnenen Vor-/Nachnamen verwendet werden? Für ein "Sehr geehrter Herr <Nachname>" wird das Problem evtl. einfacher. Beginnen würde ich damit, eine Grammatik (z.B: in erweiterter Backus-Naur-Form) zu definieren. Damit kann man dann einen Parser automatisch generieren lassen. (z.B. mit YACC, ANTLR, ...) Aber auch für's "von Hand programmieren" ist eine etwas formalere Beschreibung sinnvoll, da sie zum einen der Ausgangspunkt für die weitere Arbeit ist, zum anderen leichter zu verstehen und anpassbar ist als der Quellcode.
Evtl. könnte man noch einen Score einführen der angibt, wie wahrscheinlich der Name richtig erkannt wurde. Ein Bindestrich im Namen gibt z.B. 1 Punkt, mehr als ein Leerzeichen gibt weitere Punkte... Ab einer einstellbaren Schwelle muss der Anwender die getrennten Namen abnicken oder korrigieren. Unterhalb des Schwelle geht's automatisch.
Wenn man den string von hinten nach vorn durchsucht, ist das erste gefundene Leezeichen die Trennung zwischen Vor- und Nachname. I. a. werden Doppelnamen zusammen geschrieben. z.B. Karl-Friedrich Müller-Lüdenscheid mfg. Dietmar
Auch nicht: Otto Graf Lambsdorff Ulla Kock am Brinck
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.