Namen aus einem String in Vor- und Nachname zerlegen

Gast #841104
Lesenswert?

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.
#841116
Lesenswert?

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
Gast #841141
Lesenswert?

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.
#841282
Lesenswert?

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.
Gast #841289
Lesenswert?

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.
Gast #841294
Lesenswert?

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.
Gast #841374
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren