Erstellen Sie eine eindeutige ID durch Fuzzy-Matching von Namen (über agrep mit R)

8

Unter Verwendung von R versuche ich, die Namen von Personen in einem nach Jahr und Stadt strukturierten Datensatz abzugleichen. Aufgrund einiger Rechtschreibfehler ist eine genaue Übereinstimmung nicht möglich, daher versuche ich, agrep () für Fuzzy-Match-Namen zu verwenden.

Ein Beispielteil des Datasets ist folgendermaßen aufgebaut:

%Vor%

Die saubere Version:

%Vor%

Ich möchte jede Stadt einzeln einchecken, ob es in einigen Jahren Kandidaten gibt. Z.B. Im Beispiel

  

PAULO CEZAR FERREIRA DE ARAUJO

     PAULO CESAR FERREIRA DE ARAUJO

erscheint zweimal (mit einem Schreibfehler). Jedem Kandidaten über den gesamten Datensatz sollte eine eindeutige numerische Kandidaten-ID zugewiesen werden. Der Datensatz ist ziemlich groß (5500 Städte, ca. 100K Einträge), daher wäre eine etwas effizientere Codierung hilfreich. Irgendwelche Vorschläge, wie man das umsetzt?

EDIT: Hier ist mein Versuch (mit Hilfe der bisherigen Kommentare), dass das Erledigen der Aufgabe sehr langsam (ineffizient) ist. Irgendwelche Verbesserungsvorschläge?

%Vor%

EDIT 2: Jetzt läuft mit guter Geschwindigkeit. Das Problem war der Vergleich mit vielen Faktoren bei jedem Schritt (Danke, dass Sie darauf hingewiesen haben, Blue Magister). Wenn der Vergleich auf nur die Kandidaten in einer Gruppe (d. H. Einer Stadt) reduziert wird, wird der Befehl in 5 Sekunden für 80.000 Zeilen ausgeführt - eine Geschwindigkeit, mit der ich leben kann.

%Vor%     
thomasB 21.10.2012, 16:31
quelle

2 Antworten

4

Hier ist meine Einstellung dazu. Es ist wahrscheinlich nicht sehr effizient, aber ich denke, es wird die Arbeit erledigen. Ich nehme an, dass df$candidates vom Klassenfaktor ist.

%Vor%     
Blue Magister 21.10.2012 16:55
quelle
3

Ok, da der Fokus auf der Effizienz liegt, würde ich Folgendes vorschlagen:

Beachten Sie zunächst, dass wir in der Reihenfolge der Effizienz von den ersten Prinzipien aus vorhersagen können, dass die exakte Übereinstimmung viel schneller ist als grep, die schneller ist als fuzzy grep. Also genau passend, dann fuzzy grep für die restlichen Beobachtungen.

Zweitens, vektorisieren und vermeiden Sie Schleifen. Die apply -Befehle sind nicht unbedingt schneller, also bleib bei der nativen Vektorisierung, wenn du kannst. Alle grep -Befehle sind nativ vektorisiert, aber es wird schwer sein, ein *ply oder eine Schleife zu vermeiden, um jedes Element mit dem Vektor anderer zu vergleichen, mit dem es übereinstimmt.

Drittens: Verwenden Sie externe Informationen, um das Problem einzugrenzen. Fuzzy-Matching nur für Namen in jeder Stadt oder Staat, was die Anzahl der Vergleiche, die zum Beispiel gemacht werden müssen, drastisch reduziert.

Sie können das erste und das dritte Prinzip kombinieren: Sie könnten sogar versuchen, das erste Zeichen der einzelnen Strings genau zu suchen, und dann die Fuzzy-Anpassung innerhalb dieser Zeichenfolge.

    
Ari B. Friedman 21.10.2012 17:12
quelle

Tags und Links