2 Zeichenketten vergleichen (.NET Framework)

kuscheltier

Grünschnabel
Hey und Hallo,

Vorwort:
vielleicht hat ja jemand von euch eine Idee wie ich das folgende Problem lösen kann/ könnte. Mein Arbeitgeber entwickelt eine Handelssoftware, wo in der Datenbank auch die Adressen der Kunden (Name, Strasse, PLZ, ... ) gespeichert werden.

Die EU gibt in regelmäßigen Abständen eine Sanktionsliste im XML Format raus, die Adressdaten enhält. Diese in der XML enthaltenen Daten spiegeln Personen/ Unternehmungen nieder, mit denen man lieber keinen Handel betreiben sollte (z.B. Saddam Hussein, Bin Laden, ...) Jetzt soll ich ein Programm entwickeln mit den ich die Adressdaten aus der XML Datei gegen die Adressdaten unserer Software vergleichen muss, was soweit bis auf die eigentliche Prüfung nun auch fertig ist.


Problembeschreibung:
Mein Problem ist einfach jenes, dass die Daten in der XML Datei als auch die aus unserer Software ja seltens von den Anwendern genauso gepflegt werden.
z.B.: Firmenname Ltd, Firmenname Ltd., Firmenname Limited für Firmenbezeichnungen oder Berlinerstrasse 1, Berliner Strasse 1, Berliner Str. 1 für Strassennamen

Kennt jemand eine Methode/ Algorithmus wie ich zwei Zeichenketten miteinander auf Ähnlichkeit vergleichen kann. Diese Methode/ Algorithmus mir evtl. einen Zahlenwert zurückgeben zu wieviel Prozent die beiden Zeichenketten übereinstimmen.

Oder überhaupt eine Anregung wie ich diesen Notwendigen Vergleich realisieren könnte bzw.wie ich da vorgehen könnte ?!

MFG, Maik
 

Nico Graichen

Erfahrenes Mitglied
Hi,

In den Einzelnen Felder hast du ja Stichworte "Ltd", "Firmenname",... diese Einzelnen Worte könntest du in den von euch gespeicherten Daten suchen.
Dafür könntest du die IndexOf()-Methode der String-KLasse nutzen. Wenn dir diese -1 zurück gibt, ist das Wort in dem zu durchsuchenden String nicht enthalten.
 

kuscheltier

Grünschnabel
Das funktioniert theoretisch schon, aber praktisch ist es leider nicht. Problem ist ja nunmal das ich keine Möglichkeiten habe die Zeichenketten anhand eines festen "Trenners" zu spliten. Mal ist es ein . (Punkt), denn ein Freizeichen, denn ein - (Minus) ,...

Aus der XML bekomme ich aktuell fast 6000 Sätze, einige Kunden von uns haben über 100.000 Adresseb. Wenn ich das nach deiner Idee umsetzen würde, würde das Programm Ewigkeiten laufen da ich das ganze eh nur iterieren kann mit allen Möglichen Varianten die es gibt...
 

Christian Fein

Erfahrenes Mitglied
Soundex könnte helfen.

Das ist ein Algorythmus der ähnlich klingende Wörter findet. Also auch ähnliche Zeichenketten.
http://de.wikipedia.org/wiki/Soundex

Du musst die bekommene Adresse in jeweils kleine Teile zerlegen. Diese Teile mit den Teilen der gespeicherten Adresse und den besten Soundex wert übernehmen.
Wenn jedes Teil mit dem anderen Teil verglichen wurde errechne einen Durschnitts Soundex wert. Wenn der höher ist als von dir angegeben dann sollte der Kontakt gleich sein.

Frag mich nicht nach der .net Soundex Implementierung. Ich weiss nur das es eine geben wird ;)
 

kuscheltier

Grünschnabel
Danke schonmal für die Informationen aber habe da noch eine paar Verständnissfragen...

Also mein Objekt besitzt die folgenden Eigenschaften PLZ, Ort, Land, Strasse, Name1, Name2, Name3. Das Objekt der XML Datei die Eigenschaften Zipcode, Country, City, Firstname, Lastname, MIddlename, Wholename. Daraus ist sicherlich erkennbar welche Werte ich miteinander vergleichen muss...

Du musst die bekommene Adresse in jeweils kleine Teile zerlegen. Diese Teile mit den Teilen der gespeicherten Adresse und den besten Soundex wert übernehmen.
Wenn jedes Teil mit dem anderen Teil verglichen wurde errechne einen Durschnitts Soundex wert. Wenn der höher ist als von dir angegeben dann sollte der Kontakt gleich sein.
habe ich mal eine Verständnissfrage...

DIesen zitierten Teil verstehe ich gerade nicht, könntest du mir dies evtl. nocheinmal anders (vielleicht mit den Eigenschaften Oben) ausschnittsweise erläutern wie du das meinst ?!


MFG, Maik
 

kuscheltier

Grünschnabel
Christian Fein hat gesagt.:
Wieso sollte ich?

Wäre Java oder Python das Thema gewesen hätte ich auch ein Link spendiert und nicht nur ein Begriff. Aber .net'ler dürfen nicht zu viel liebe von mir erwarten :)

Magst mir vielleicht auch meine Frage noch beantworten oder erläutern? Sofern du ein entsprechendes Java (oder auch C++) Tutorial hättest, könntest mir einen Link gerne mitteilen. Ich bin da nicht so und Java kann ich auch lesen/ programmieren. Nur das oben genannte Problem muss ich leider diesmal in C# realisieren...
 

Christian Fein

Erfahrenes Mitglied
Nun ich meine wenn du eine Adresse / Namen hast:

Gates Bill, Redmond, USA-Virginia

dann teile deine Adresse mit einem gezielten

Nur mal schemenhaft mit Python. Für Java / C# habe ich nach einem Fussball abend mit 2 Flachen Bier keinen Sinn mehr :)

Code:
adress = "Gates Bill, Redmond, Virginia, USA
parts = adress.split(',| |;')
results = []
for p in parts:
     presults = []
     for s in soundexparts:
        presults.add(getSoundexResult(p,s))
     results.add(max(presults))
end = sum(results) / len(results)

so in etwa.