it-swarm.com.de

Wie mache ich eine unscharfe Übereinstimmung von Firmennamen in MySQL mit PHP für die automatische Vervollständigung?

Meine Benutzer importieren durch Ausschneiden und Einfügen eine große Zeichenfolge, die Firmennamen enthält. 

Ich habe eine bestehende und wachsende MYSQL-Datenbank mit Firmennamen, jede mit einer eindeutigen company_id.

Ich möchte in der Lage sein, die Zeichenfolge zu analysieren und jedem der vom Benutzer eingegebenen Firmennamen eine Fuzzy-Übereinstimmung zuzuweisen.

Im Moment ist es nur langsam, nur ein direktes Streichholz zu spielen. ** Wird die Indexierung von Soundex schneller sein? Wie kann ich dem Benutzer beim Tippen einige Optionen geben? **

Zum Beispiel schreibt jemand:

 Microsoft -> Microsoft 
 Bare Essentials -> Bare Escentuals 
 Polycom, Inc. -> Polycom 

Ich habe die folgenden Threads gefunden, die dieser Frage ähnlich erscheinen, aber das Poster wurde nicht genehmigt, und ich bin nicht sicher, ob der Anwendungsfall zutreffend ist:

So finden Sie die beste Fuzzy-Übereinstimmung für einen String in einer großen String-Datenbank

Übereinstimmende ungenaue Firmennamen in Java

42
AFG

Sie können mit SOUNDEX() beginnen. Dies wird wahrscheinlich das tun, was Sie benötigen (ich stelle mir eine Box mit automatischen Vorschlägen für bereits vorhandene Alternativen vor, die der Benutzer eingibt).

Die Nachteile von SOUNDEX() sind:

  • seine Unfähigkeit, längere Saiten zu unterscheiden. Es werden nur die ersten Zeichen berücksichtigt, längere Zeichenfolgen, die am Ende voneinander abweichen, erzeugen den gleichen SOUNDEX-Wert
  • die Tatsache, dass der erste Buchstabe derselbe sein muss, oder Sie werden keine Übereinstimmung finden. SQL Server verfügt über die Funktion DIFFERENCE (), um Ihnen zu sagen, wie viel zwei SOUNDEX-Werte voneinander entfernt sind, aber ich denke, MySQL hat nichts dergleichen eingebaut.
  • für MySQL ist SOUNDEX, zumindest nach den Dokumenten - für die Unicode-Eingabe defekt

Beispiel:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

Für fortgeschrittenere Anforderungen denke ich, dass Sie den Levenshtein-Abstand (auch als "Abstand bearbeiten" bezeichnet) zweier Strings betrachten und mit einer Schwelle arbeiten müssen. Dies ist die komplexere (= langsamere) Lösung, ermöglicht jedoch eine größere Flexibilität.

Der Hauptnachteil ist, dass Sie beide Strings benötigen, um den Abstand zwischen ihnen zu berechnen. Mit SOUNDEX können Sie eine vorberechnete SOUNDEX in Ihrer Tabelle speichern und diese vergleichen/sortieren/gruppieren/filtern. Mit der Levenshtein-Entfernung können Sie feststellen, dass der Unterschied zwischen "Microsoft" und "Nzcrosoft" nur 2 beträgt, aber es wird viel mehr Zeit dauern, um zu diesem Ergebnis zu kommen. 

In jedem Fall finden Sie eine Beispiel-Levenshtein-Distanzfunktion für MySQL unter codejanitor.com: Levenshtein Distance als MySQL Stored Function (10. Februar 2007) .

44
Tomalak

SOUNDEX ist hierfür ein OK-Algorithmus, aber zu diesem Thema wurden in letzter Zeit Fortschritte gemacht. Ein anderer Algorithmus wurde als Metaphone erstellt und später zu einem Double Metaphone-Algorithmus überarbeitet. Ich habe persönlich die Java-Apache-Commons-Implementierung des Doppelmetaphons verwendet, und es ist anpassbar und genau.

Sie haben auch Implementierungen in vielen anderen Sprachen auf der Wikipedia-Seite. Diese Frage wurde beantwortet, aber wenn Sie eines der festgestellten Probleme mit dem SOUNDEX in Ihrer Anwendung feststellen, ist es gut zu wissen, dass es Optionen gibt. Manchmal kann derselbe Code für zwei wirklich verschiedene Wörter generiert werden. Um dieses Problem zu lösen, wurde ein doppeltes Metaphon entwickelt.

Gestohlen aus Wikipedia: http://en.wikipedia.org/wiki/Soundex

Als Reaktion auf Mängel in der Soundex-Algorithmus, Lawrence Philips entwickelte den Metaphon-Algorithmus für der gleiche Zweck. Philips später entwickelte eine Verbesserung zu Metaphone, welches er Double-Metaphone nannte . Double-Metaphone enthält viel größerer Kodierungsregelsatz als sein Vorgänger, behandelt eine Teilmenge von nicht lateinische Zeichen und gibt eine .__ zurück. Primär- und Sekundärcodierung für unterschiedliche Aussprachen berücksichtigen eines einzelnen Wortes auf Englisch.

Am Ende der Doppelmetaphonseite finden Sie die Implementierungen für alle Arten von Programmiersprachen: http://en.wikipedia.org/wiki/Double-Metaphone

Python- und MySQL-Implementierung: https://github.com/AtomBoy/double-metaphone

22
Cheese Daneish

Erstens möchte ich hinzufügen, dass Sie bei der Verwendung von Phonetik/Fuzzy-Matching-Algorithmen sehr vorsichtig sein sollten, da diese Art von Logik genau das ist, Fuzzy oder, vereinfacht ausgedrückt; möglicherweise ungenau. Dies gilt insbesondere für übereinstimmende Firmennamen.

Ein guter Ansatz ist es, von anderen Daten, wie Adressdaten, Postleitzahlen, Telefonnummern, Geokoordinaten usw., eine Bestätigung zu erhalten. Dies hilft, die Wahrscheinlichkeit einer genauen Übereinstimmung Ihrer Daten zu überprüfen.

Es gibt eine ganze Reihe von Problemen im Zusammenhang mit B2B-Daten. Zu viele, um hier angesprochen zu werden, habe ich in meinem Blog mehr über Company Name Matching geschrieben, aber zusammenfassend sind die wichtigsten Punkte:

  • Ein Blick auf die gesamte Zeichenfolge ist nicht hilfreich, da der wichtigste Teil eines Firmennamens nicht unbedingt am Anfang des Unternehmens steht. d. h. "The Proctor and Gamble Company" oder "United States Federal Reserve"
  • Abkürzungen sind in Firmennamen üblich, d. H. HP, GM, GE, P & G, D & B usw.
  • Einige Unternehmen buchstabieren ihre Namen absichtlich falsch als Teil ihrer Markenzeichen und unterscheiden sich von anderen Unternehmen.

Das Abgleichen von exakten Daten ist einfach, aber das Abgleichen von nicht exakten Daten kann sehr viel zeitaufwändiger sein, und ich würde vorschlagen, dass Sie überlegen, wie Sie die nicht exakten Übereinstimmungen validieren, um sicherzustellen, dass diese von akzeptabler Qualität sind. 

Bevor wir Match2Lists.com bauten, mussten wir unliebsame Zeit damit verbringen, Fuzzy-Matches zu überprüfen. In Match2Lists haben wir ein leistungsfähiges Visualisierungstool integriert, mit dem wir nicht genaue Übereinstimmungen überprüfen können. Dies erwies sich als echter Spielveränderer in Bezug auf die Validierung von Übereinstimmungen, senkte unsere Kosten und ermöglichte es uns, Ergebnisse schneller zu liefern.

Viel Glück!!

8
Derren

Hier ist ein Link zur PHP-Diskussion der Soundex-Funktionen in Mysql und PHP. Ich würde von dort aus anfangen und dann auf Ihre anderen, nicht so gut definierten Anforderungen eingehen.

Ihre Referenz bezieht sich auf die Levenshtein-Methodik für den Abgleich. Zwei Probleme. 1. Es ist besser geeignet, um den Unterschied zwischen zwei bekannten Wörtern zu messen, nicht für die Suche. 2. Es wird eine Lösung erörtert, die eher dazu dient, Dinge wie Korrekturfehler (mit "Levenshtien" für "Levenshtein") zu erkennen, als Rechtschreibfehler (bei denen der Benutzer nicht buchstabiert, sagen Sie "Levenshtein") und geben "Levinstein" ein. Normalerweise verbinde ich es mit der Suche nach einem Satz in einem Buch und nicht mit einem Schlüsselwert in einer Datenbank.

BEARBEITEN: Als Antwort auf Kommentar--

  1. Können Sie die Benutzer zumindest dazu bringen, die Firmennamen in mehrere Textfelder einzufügen; 2. oder verwenden Sie einen eindeutigen Namenstrenner (z. B. Backslash). 3. Artikel ("The") und generische Abkürzungen weglassen (oder Sie können nach diesen filtern); 4. Squoosh die Leerzeichen heraus und passen auch dafür an (also Micro Soft => Microsoft, Bare Essentials => Bareessentials); 5. Interpunktion herausfiltern; 6. "ODER" sucht nach Wörtern ("nacktes" OR "Wesentliches") - Menschen werden unweigerlich das eine oder andere auslassen.

Testen Sie wie verrückt und nutzen Sie die Feedback-Schleife der Benutzer.

4
dkretz

die beste Funktion für das Fuzzy-Matching ist Levenshtein. Es wird traditionell von Rechtschreibprüfungen verwendet, so dass dies der Weg sein könnte. Hier gibt es eine UDF: http://joshdrew.com/

der Nachteil bei der Verwendung von Levenshtein ist, dass es nicht gut skalierbar ist. Eine bessere Idee wäre es, die gesamte Tabelle in eine benutzerdefinierte Wörterbuchdatei für die Rechtschreibprüfung zu kopieren und den Vorschlag von Ihrer Anwendungsebene statt von der Datenbankebene auszuführen.

1
longneck

Diese Antwort führt zu einer indizierten Suche von fast allen Entitäten, die 2 oder 3 Zeichen oder mehr eingeben.

Erstellen Sie grundsätzlich eine neue Tabelle mit 2 Spalten, Word und Schlüssel. Führen Sie einen Prozess für die Originaltabelle aus, die die Spalte enthält, für die die Fuzzy-Suche durchgeführt werden soll. Bei diesem Vorgang wird jedes einzelne Wort aus der ursprünglichen Spalte extrahiert und diese Wörter zusammen mit dem ursprünglichen Schlüssel in die Word-Tabelle geschrieben. Während dieses Vorgangs sollten häufig vorkommende Wörter wie "the", "and" usw. verworfen werden. 

Wir erstellen dann mehrere Indizes in der Word-Tabelle wie folgt:.

  • Ein normaler Index in Kleinbuchstaben für Word + -Schlüssel 
  • Ein Index für das 2. bis 5. Zeichen + Taste
  • Ein Index für das 3. bis 6. Zeichen + Schlüssel

    Erstellen Sie alternativ einen SOUNDEX () - Index für die Word-Spalte.

Sobald dies geschehen ist, nehmen wir jede Benutzereingabe und suchen mit normaler Word = Eingabe oder LIKE-Eingabe%. Wir geben niemals eine LIKE% -Eingabe, da wir immer nach einem Treffer für die ersten 3 Zeichen suchen, die alle indiziert sind. 

Wenn Ihre Originaltabelle massiv ist, können Sie die Word-Tabelle nach Abschnitten des Alphabets partitionieren, um sicherzustellen, dass die Eingaben des Benutzers sofort auf Kandidatenzeilen eingegrenzt werden. 

0