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% 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.
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")
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% Ich verwende lapply
für diese Umstände:
um es dann als csv zu schreiben, ist es nicht so einfach:
%Vor% 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.
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ückzugebenstep.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"
ausstep.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.
Tags und Links r fuzzy-search string-matching fuzzy-comparison