Forum: Offtopic Namen aus einem String in Vor- und Nachname zerlegen


von Sascha (Gast)


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.

von Martin L. (melvin_the_moose)


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

von GastABC (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> - 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.

von Uhu U. (uhu)


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.

von Hans (Gast)


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.

von Hans (Gast)


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.

von Dietmar M. (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.