2008-11-27 12 views
7

Ich habe eine Datenbank von Unternehmen. Meine Anwendung empfängt Daten, die auf eine Firma anhand des Namens verweisen, aber der Name stimmt möglicherweise nicht genau mit dem Wert in der Datenbank überein. Ich muss die eingehenden Daten an die Firma anpassen, auf die sie sich bezieht.Passende ungenaue Firmennamen in Java

Zum Beispiel könnte meine Datenbank eine Firma mit dem Namen "A. B. Widgets & Co Ltd." während meine eingehenden Daten möglicherweise auf "AB Widgets Limited", "A.B. Widgets and Co" oder "A B Widgets" verweisen.

Einige Wörter im Firmennamen (A B Widgets) sind wichtiger für die Zuordnung als andere (Co, Ltd, Inc, etc). Es ist wichtig, falsche Übereinstimmungen zu vermeiden.

Die Anzahl der Unternehmen ist klein genug, dass ich eine Karte ihrer Namen in Erinnerung behalten kann, dh. Ich habe die Möglichkeit, Java statt SQL zu verwenden, um den richtigen Namen zu finden.

Wie würden Sie das in Java tun?

Antwort

0

Ihre Datenbank die Verwendung von regulären Ausdrücken (regex) kann suport - siehe unten für einige Tutorials in Java - hier ist der Link zu der Dokumentation MySQL (als Beispiel):

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

Sie würden wahrscheinlich Sie möchten in der Datenbank eine ziemlich komplexe reguläre Express-Anweisung für jedes Unternehmen speichern, die die Abweichungen enthält, die Sie erwarten könnten - oder die Unterelemente des Firmennamens, die Sie als signifikant gewichten möchten.

Sie können auch die regex-Bibliothek in Java verwenden

JDK 1.4.2
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

JDK 1.5.0
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html

Reguläre Ausdrücke in Java
http://www.regular-expressions.info/java.html

Die Java Regex-API wurde erläutert
http://www.sitepoint.com/article/java-regex-api-explained/

Vielleicht wollen Sie auch sehen, ob Ihre Datenbank Soundex-Funktionen unterstützt (siehe zum Beispiel den folgenden Link zu MySQL)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

2

Sie können einen LCS Algorithmus verwenden sie zu punkten.

Ich mache dies in meinem photo album, um es einfach zu machen, in Fotos per E-Mail zu senden und sie in Sicherheitskategorien richtig fallen zu lassen.

0

Sie Lucene Ihre Datenbank Index verwenden könnte, dann die Lucene-Index abfragen. Es gibt eine Reihe von Suchmaschinen, die auf Lucene aufgebaut sind, einschließlich Solr.

+0

Dies ist keine Antwort auf die Frage liefern. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. –

+0

Danke für das Feedback, ich habe meine Antwort eher wie eine Antwort gemacht. –

1

Werfen Sie einen Blick auf Lucene.Es ist eine Open-Source-Volltextsuch-Java-Bibliothek mit "fast Match" -Fähigkeiten.

3

Sie können die Formate so viel wie möglich in Ihrer DB/Karte & Eingang (das heißt Umwandlung in Groß-/Kleinschreibung) standardisieren, dann verwenden Sie die Levenshtein (edit) distance metric von dynamischer Programmierung der Eingabe gegen alle bekannten Namen zu punkten.

Sie könnten dann den Benutzer die Übereinstimmung bestätigen &, wenn sie es nicht mögen, geben Sie ihnen die Möglichkeit, diesen Wert in Ihre Liste bekannter Namen einzugeben (auf den zweiten Gedanken - das könnte zu viel Kraft zu geben ein Benutzer ...)

+1

Ich habe erst vor ungefähr 6 Monaten über diesen Algorithmus erfahren, aber es hat mir seitdem unglaublich gut gedient! Auch macht es mich schlau wenn ich sage "oh, benutze einfach eine Levenshtein Distance ':-) – Aidos

2

Ich würde LCS Leerzeichen, Interpunktion, Fall und Variationen auf "Co", "llc", "ltd" usw. ignorieren.

0

vote up 1 vote down

können Sie einen LCS-Algorithmus verwenden, um sie zu zählen.

Ich mache dies in meinem Fotoalbum, um es einfach zu machen, um Fotos per E-Mail zu versenden und sie in Sicherheitskategorien richtig fallen zu lassen.

* LCS code 
* Example usage (guessing a category based on what people entered) 

um genauer zu sein, besser als kleinste gemeinsame Subsequence, kleinstes gemeinsames Substring genauer sein sollte als die Reihenfolge der Zeichen wichtig ist.

3

Obwohl dieses Thema ist ein bisschen alt, ich habe vor kurzem eine Untersuchung über die Effizienz der Zeichenfolge Abstandsmetriken für Namensabgleich und kam in dieser Bibliothek:

https://code.google.com/p/java-similarities/

Wenn Sie nicht wollen, verbringen Ich bin der Meinung, dass es schon sehr lange dauert, Algorithmen für String-Distanzen zu implementieren, ich empfehle, es als ersten Schritt zu versuchen, es gibt ~ 20 verschiedene Algorithmen (einschließlich Levenshtein, Jaro-Winkler, Monge-Elkan-Algorithmen usw.) und der Code ist gut genug strukturiert dass Sie die ganze Logik nicht gründlich verstehen müssen, aber Sie können es in wenigen Minuten benutzen.

(BTW, ich bin nicht der Autor der Bibliothek, so ein dickes Lob für seine Schöpfer.)