Ungefährer String-Matching

8

Ich weiß, dass diese Frage sehr oft gestellt wurde. Ich möchte einen Vorschlag, welcher Algorithmus für eine ungefähre String-Übereinstimmung geeignet ist.

Die Anwendung ist speziell für den Firmennamen und nur für nichts anderes geeignet.

Die größte Herausforderung ist wahrscheinlich der Namensbestandteil des Unternehmens und der kurze benannte Teil Beispiel: 1. companyA pty ltd gegen companyA pty. GmbH. vs UnternehmenA 2. WES Engineering gegen W. E. S. Engineering (extrem seltenes Auftreten)

Glauben Sie, Levenshtein Edit Distance ist angemessen?

Ich benutze C #

Grüße, Max

    
Max 18.11.2010, 07:45
quelle

4 Antworten

14

Sie können verschiedene Zeichenfolgenabstandsmesswerte verwenden.

Ich würde Jaro-Winkler empfehlen. Im Gegensatz zur Bearbeitungsdistanz, bei der das Ergebnis eines Vergleichs in einzelnen Bearbeitungseinheiten liegt, gibt Ihnen JW einen Wert von 0-1. Es ist besonders für Eigennamen geeignet. Siehe auch dieses nette Tutorial und diese SO Frage.

Ich habe nicht mit C # gearbeitet, aber hier sind einige Implementierungen von JW, die ich online gefunden habe:

Impl 1 (Sie haben auch eine DOT NET-Version, wenn Sie sich die Dateiliste anschauen )

Impl 2

Wenn Sie etwas ausgeklügelteres Matching durchführen möchten, können Sie versuchen, eine gewisse Normalisierung von Wortformen durchzuführen, die häufig in Firmennamen vorkommen, wie zB ltd/limited, inc/incorporated, corp/corporation , um Groß- und Kleinschreibung, Abkürzungen usw. zu berücksichtigen / p>

  

distance (normalize("foo corp."), normalize("FOO CORPORATION") )

Sie sollten das Ergebnis als 0 anstatt als 14 erhalten (was Sie bekommen würden, wenn Sie die Levenshtein-Bearbeitungsdistanz berechnen würden).

    
hashable 18.11.2010, 08:14
quelle
1

Ja, die Levenshtein-Entfernung ist dafür geeignet. Es funktioniert für alle diejenigen, die Sie mindestens aufgelistet haben.

Sie könnten möglicherweise auch Soundex verwenden, aber ich glaube nicht, dass Sie es brauchen werden.

    
Peter Alexander 18.11.2010 07:50
quelle
1

In diesen einfachen Beispielen erhalten Sie nur dann eine Übereinstimmung, wenn Sie alle nicht alphanumerischen Zeichen entfernen. Dies ist am einfachsten, da Sie die Daten auf jeder Seite vorberechnen können. Führen Sie dann eine gerade Übereinstimmung durch, bei der es sich um a handelt viel schneller als Kreuz Multiplikation und Berechnung der Bearbeitungsstrecke.

    
cjk 18.11.2010 08:23
quelle
0

Ich habe meine Antwort schon in einer anderen Frage gegeben.

Ссылка

Ich habe an wirklich großem System gearbeitet mit ähnlichen Namensabgleichanforderungen, über die Sie gesprochen haben. Die Namensübereinstimmung ist nicht sehr einfach und die Reihenfolge der Vor- und Nachnamen kann unterschiedlich sein. Einfache Fuzzy-Namensvergleichsalgorithmen scheitern in solchen Szenarien kläglich.

Wenn wir nur über die Approximate String Matching-Algorithmen sprechen wollen, dann gibt es viele. Wenige von ihnen sind: Jaro-Winkler, Edit Entfernung (Levenshtein), Jaccard Ähnlichkeit, Soundex / Phonetik basierte Algorithmen etc. Ein einfaches googeln würde uns alle Details geben. Sie können alle in C #

implementieren

Ironie ist, sie arbeiten, während Sie versuchen, zwei gegebene Eingabezeichenfolgen zu finden. Okay, theoretisch und um die Art und Weise zu demonstrieren funktioniert fuzzy oder approximative String-Matching.

Aber grob untertriebener Punkt ist, wie verwenden wir das gleiche in Produktionseinstellungen. Nicht alle, die ich kenne, die nach einem ungefähren String-Matching-Algorithmus suchten, wussten, wie sie dasselbe in der Produktionsumgebung lösen konnten.

Ich könnte gerade über Lucene gesprochen haben, das spezifisch für Java ist, aber es gibt auch Lucene für .Net.

Ссылка

    
Dayanand Gowda 08.05.2015 09:26
quelle

Tags und Links