Wie kann ich Fuzzy-Match-Strings aus zwei Datensätzen abgleichen?

8

Ich habe an einer Möglichkeit gearbeitet, zwei Datasets basierend auf einer unvollständigen Zeichenfolge wie einem Unternehmensnamen zu verknüpfen. In der Vergangenheit musste ich zwei sehr schmutzige Listen zusammenbringen, eine Liste hatte Namen und finanzielle Informationen, eine andere Liste hatte Namen und Adresse. Beide hatten keine eindeutigen IDs, auf die sie passen würden! ÜBERNEHMEN, DASS DIE REINIGUNG BEREITS ANGEWANDT WURDE UND ETWAS TYPOS UND INSERTIONEN.

Bisher ist AGREP das nächste Werkzeug, das ich gefunden habe, das funktionieren könnte. Ich kann im AGREP-Paket Levenshtein-Abstände verwenden, die die Anzahl der Löschungen, Einfügungen und Ersetzungen zwischen zwei Strings messen. AGREP gibt die Zeichenfolge mit der kleinsten Entfernung (die ähnlichste) zurück.

Ich hatte jedoch Probleme, diesen Befehl von einem einzigen Wert zu übernehmen, um ihn auf einen ganzen Datenrahmen anzuwenden. Ich habe grob eine for-Schleife verwendet, um die AGREP-Funktion zu wiederholen, aber es muss einen einfacheren Weg geben.

Siehe den folgenden Code:

%Vor%     
A L 16.10.2014, 13:37
quelle

6 Antworten

5

Die Lösung hängt von der gewünschten Kardinalität Ihres übereinstimmenden a bis b ab. Wenn es eins zu eins ist, werden Sie die drei nächsten Übereinstimmungen oben erhalten. Wenn es um eins zu eins geht, bekommst du sechs.

Eins-zu-Eins-Fall (erfordert Zuweisungsalgorithmus):

Wenn ich dies tun musste, behandle ich es als ein Zuweisungsproblem mit einer Abstandsmatrix und einer Zuweisungsheuristik (gierige Zuweisung, die unten verwendet wird). Wenn Sie eine "optimale" Lösung wünschen, sind Sie mit optim besser dran.

Nicht mit AGREP vertraut, aber hier ist ein Beispiel mit stringdist für Ihre Distanzmatrix.

%Vor%

Erzeugt die Zuweisung:

%Vor%

Ich bin sicher, dass es eine viel elegantere Möglichkeit gibt, die gierige Zuordnungsheuristik durchzuführen, aber das obige funktioniert für mich.

Viele-zu-eins-Fall (kein Zuordnungsproblem):

%Vor%

Erzeugt das Ergebnis:

%Vor%

Bearbeiten: Verwenden Sie method="jw" , um die gewünschten Ergebnisse zu erzielen. Siehe help("stringdist-package")

    
C8H10N4O2 16.10.2014, 15:44
quelle
2

Ich bin mir nicht sicher, ob das eine nützliche Richtung für Sie ist, John Andrews, aber es gibt Ihnen ein anderes Werkzeug (aus dem RecordLinkage -Paket) und könnte helfen.

%Vor%     
lawyeR 16.10.2014 20:36
quelle
1

Vereinbar mit der obigen Antwort " Nicht mit AGREP vertraut, aber hier ist ein Beispiel mit stringdist für Ihre Distanzmatrix. " aber fügen Sie die Signaturfunktion wie folgt von Das Zusammenführen von Datensätzen basierend auf teilweise übereinstimmenden Datenelementen wird mehr sein genau, da die Berechnung von LV auf Position / Hinzufügung / Löschung

basiert %Vor%     
YummyLin Yang 12.11.2015 12:01
quelle
1

Ich verwende lapply für diese Umstände:

%Vor%

um es dann als csv zu schreiben, ist es nicht so einfach:

%Vor%     
user3909910 25.04.2017 17:45
quelle
0

Hier ist eine Lösung, die das Paket fuzzyjoin verwendet. Es verwendet dplyr -like Syntax und stringdist als eine der möglichen Arten von Fuzzy-Matching.

Als vorgeschlagen von C8H10N4O2 erstellt das stringdist method="jw" die besten Übereinstimmungen für Ihr Beispiel.

Als vorgeschlagen von dgrtwo, dem Entwickler von fuzzyjoin, benutzte ich eine große max_dist und verwendete dann dplyr::group_by und dplyr::top_n , um nur die beste Übereinstimmung mit dem Mindestabstand zu erhalten.

%Vor%     
Arthur Yip 06.06.2017 04:01
quelle
-1

Hier ist, was ich verwendet habe, um herauszufinden, wie oft ein Unternehmen in einer Liste erscheint, obwohl die Firmennamen ungenau sind,

step.1 Install phonics Paket

step.2 Erstellen Sie eine neue Spalte namens "soundexcodes" in "mylistofcompanynames"

step.3 Verwenden Sie die Soundex-Funktion, um Soundex-Codes der Firmennamen in "soundexcodes"

zurückzugeben

step.4 Kopieren Sie die Firmennamen UND entsprechenden Soundex-Code in eine neue Datei (2 Spalten namens "Firmennamen" und "soundexcode") namens "companysoundexcodestrainingfile"

step.5 Entfernen Sie doppelte Soundexcodes in "companysoundexcodestrainingfile"

Schritt 6 Gehen Sie durch die Liste der verbleibenden Firmennamen und ändern Sie die Namen so, wie sie in Ihrer ursprünglichen Firma angezeigt werden sollen

Beispiel: Amazon Inc A625 kann Amazon A625 sein Accenture Limited A455 kann Accenture A455 sein

step.6 Führen Sie einen Linksbündel oder (einfach vlookup) zwischen companysoundexcodestrainingfile $ soundexcodes und mylistofcompanynames $ soundexcodes durch "soundexcodes"

aus

step.7 Das Ergebnis sollte die ursprüngliche Liste mit einer neuen Spalte namens "co.y" haben, die den Namen der Firma trägt, wie Sie ihn in der Trainingsdatei hinterlassen haben.

>

step.8 Sortieren Sie "co.y" und prüfen Sie, ob die meisten Firmennamen korrekt übereinstimmen. Wenn ja, ersetzen Sie die alten Firmennamen durch die neuen, die vlookup im soundex-Code angibt.

    
Nikhil Muthukrishnan 24.01.2018 08:50
quelle