Techniki znajdowania niemal zduplikowanych rekordów

[7]}próbuję wyczyścić bazę danych, która na przestrzeni lat zdobyła wiele zduplikowanych rekordów, o nieco innych nazwach. Na przykład w tabeli firm znajdują się nazwy takie jak "Some Company Limited" i " SOME COMPANY LTD!".

Mój plan polegał na wyeksportowaniu obraźliwych tabel do R, przekonwertowaniu nazw na małe litery, zastąpieniu popularnych synonimów (takich jak" limited "- > "ltd"), usunięciu niealfabetycznych znaków, a następnie użyciu agrep, aby zobaczyć, co wygląda podobnie.

Mój pierwszy problem polega na tym, że agrep akceptuje tylko jeden wzór do dopasowania, a zapętlanie każdej nazwy firmy, aby dopasować ją do innych, jest powolne. (Niektóre tabele do czyszczenia będą miały dziesiątki, być może setki tysięcy nazw do sprawdzenia.)

Bardzo krótko przyjrzałem się pakietowitm (JSS article ) i wydaje się on bardzo potężny, ale nastawiony na analizę dużych fragmentów tekstu, a nie tylko nazw.

Mam kilka powiązanych pytań:

  1. Jest tm Pakiet odpowiedni do tego rodzaju zadań?

  2. Czy istnieje szybsza alternatywa dla agrep? (Wspomniana funkcja wykorzystuje Levenshtein edytuj odległość, która jest anegdotycznie wolna.)

  3. Czy istnieją inne odpowiednie narzędzia w R, oprócz agrep i tm?

  4. Czy w ogóle powinienem to robić w R, czy tego typu rzeczy powinny być zrobione bezpośrednio w bazie danych? (Jest to baza danych dostępu, więc raczej unikać dotykania go, jeśli to możliwe.)

Author: Richie Cotton, 2011-07-13

4 answers

Jeśli robisz tylko małe partie, które są stosunkowo dobrze uformowane, to compare.linkage() LUB compare.dedup() funkcje w RecordLinkage Pakiet powinien być świetnym punktem wyjścia. Ale jeśli masz duże partie, to może będziesz musiał zrobić więcej majsterkowania.

Używam funkcji jarowinkler(), levenshteinSim(), i soundex() W RecordLinkage aby napisać własną funkcję, która używa mojego własnego schematu ważenia (również, jak to jest, nie można używać {[5] } dla dużych zbiorów danych z RecordLinkage).

Jeśli mam dwie listy nazwisk, które chcesz dopasować ("link rekord"), wtedy zazwyczaj konwertuję oba na małe litery i usuwam wszystkie znaki interpunkcyjne. Aby zająć się "Limited" versus " LTD " zazwyczaj tworzę kolejny wektor pierwszego słowa z każdej listy, co pozwala na dodatkowe ważenie pierwszego słowa. Jeśli myślę, że jedna lista może zawierać akronimy (może ATT lub IBM), to będę akronimem-ize drugą listę. Dla każdej listy kończę z ramką danych ciągów, które chciałbym porównać, które piszę jako oddzielne tabele w MySQL baza danych.

Aby nie skończyć z zbyt wielu kandydatów, I LEFT OUTER JOIN te dwie tabele na coś, co ma , aby dopasować się między dwoma listami (może to pierwsze trzy litery w każdej liście lub pierwsze trzy litery i pierwsze trzy litery w akronimie). Następnie obliczam wyniki meczów za pomocą powyższych funkcji.

Nadal musisz wykonać wiele ręcznych kontroli, ale możesz sortować wynik, aby szybko wykluczyć brak meczów.

 34
Author: Richard Herron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 19:31:42

Może Google refine mogłoby pomóc. Wygląda to może bardziej dopasowane, jeśli masz wiele wyjątków i nie znasz jeszcze wszystkich.

 9
Author: Etienne Racine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-14 03:31:13

To, co robisz, nazywa się rekordowym połączeniem i było to ogromne pole badań już od wielu dziesięcioleci. Na szczęście dla Ciebie, istnieje cała masa narzędzi, które są gotowe do tego rodzaju rzeczy. Zasadniczo możesz skierować je do swojej bazy danych, skonfigurować jakieś środki czyszczące i komparatory (takie jak Levenshtein lub Jaro-Winkler lub ...), a oni zrobią to za Ciebie.

Narzędzia te mają zazwyczaj funkcje do rozwiązywania problemów z wydajnością, dzięki czemu mimo że Levenshtein jest wolny, mogą działać szybko, ponieważ większość par rekordów nigdy nie jest porównywana.

Powyższy link do Wikipedii zawiera linki do wielu narzędzi do linkowania rekordów, których możesz użyć. Osobiście napisałem jedną o nazwie Duke w Javie, którą z powodzeniem wykorzystałem właśnie do tego celu. Jeśli chcesz coś dużego i kosztownego, możesz kupić narzędzie do zarządzania danymi podstawowymi.

 6
Author: larsga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-26 08:37:19

W Twoim przypadku prawdopodobnie sprawdziłoby się coś takiego jak obliczanie odległości edycji, ale jeśli potrzebujesz znaleźć w pobliżu duplikatów w większych dokumentach tekstowych, możesz spróbować http://www.softcorporation.com/products/neardup/

 0
Author: vadim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-07 10:54:13