„Próbuję znaleźć niezawodną metodę dopasowywania zduplikowanych rekordów osób w bazie danych”.
Niestety nie ma czegoś takiego. Jedyne, na co można liczyć, to system z rozsądnym elementem wątpliwości.
SQL> select n1
, n2
, soundex(n1) as sdx_n1
, soundex(n2) as sdx_n2
, utl_match.edit_distance_similarity(n1, n2) as ed
, utl_match.jaro_winkler_similarity(n1, n2) as jw
from t94
order by n1, n2
/
2 3 4 5 6 7 8 9
N1 N2 SDX_ SDX_ ED JW
-------------------- -------------------- ---- ---- ---------- ----------
MARK MARKIE M620 M620 67 93
MARK MARKS M620 M620 80 96
MARK MARKUS M620 M622 67 93
MARKY MARKIE M620 M620 67 89
MARSK MARKS M620 M620 60 95
MARX AMRX M620 A562 50 91
MARX M4RX M620 M620 75 85
MARX MARKS M620 M620 60 84
MARX MARSK M620 M620 60 84
MARX MAX M620 M200 75 93
MARX MRX M620 M620 75 92
11 rows selected.
SQL> SQL> SQL>
Dużą zaletą SOUNDEX jest to, że tokenizuje ciąg. Oznacza to, że daje Ci coś, co można zaindeksować :jest to niezwykle cenne, jeśli chodzi o duże ilości danych. Z drugiej strony jest stary i surowy. Istnieją nowsze algorytmy, takie jak Metaphone i Double Metaphone. Powinieneś być w stanie znaleźć ich implementacje PL/SQL za pośrednictwem Google.
Zaletą punktacji jest to, że pozwalają na pewien stopień rozmycia; dzięki czemu możesz znaleźć wszystkie wiersze where name_score >= 90%
. Miażdżącą wadą jest to, że wyniki są względne i dlatego nie można ich indeksować. Takie porównanie zabija cię dużymi ilościami.
Co to oznacza:
- Potrzebujesz kombinacji strategii. Żaden pojedynczy algorytm nie rozwiąże Twojego problemu.
- Oczyszczanie danych jest przydatne. Porównaj wyniki dla MARX vs MRX i M4RX:usuwanie liczb z nazw poprawia wskaźnik trafień.
- Nie możesz zdobyć dużej liczby nazwisk w locie. Użyj tokenizacji i pre-scoringu, jeśli możesz. Użyj pamięci podręcznej, jeśli nie masz dużo rezygnacji. Użyj partycjonowania, jeśli możesz sobie na to pozwolić.
- Użyj Oracle Text (lub podobnego), aby zbudować tezaurus pseudonimów i wariantów.
- Oracle 11g wprowadził do Oracle Text funkcję wyszukiwania nazw. Dowiedz się więcej.
- Zbuduj tabelę nazw kanonicznych do oceny i połącz z nią rzeczywiste rekordy danych.
- Użyj innych wartości danych, zwłaszcza indeksowalnych, takich jak data urodzenia, do wstępnego filtrowania dużych ilości imion lub do zwiększenia zaufania do proponowanych dopasowań.
- Pamiętaj, że inne wartości danych wiążą się z własnymi problemami:czy ktoś urodził się 31.01.2011 w wieku jedenastu miesięcy czy osiemdziesięciu lat?
- Pamiętaj, że imiona są skomplikowane, zwłaszcza gdy trzeba wziąć pod uwagę nazwy, które zostały zlatynizowane:istnieje ponad czterysta różnych sposobów pisowni Moammar Khadaffi (w alfabecie rzymskim) – i nawet Google nie może się zgodzić, który wariant jest najbardziej kanoniczny.
Z mojego doświadczenia łączenie tokenów (imię, nazwisko) jest mieszanym błogosławieństwem. Rozwiązuje pewne problemy (np. czy nazwa drogi pojawia się w wierszu adresu 1, czy w wierszu adresu 2), ale powoduje inne problemy:rozważ punktację GRAHAM OLIVER vs OLIVER GRAHAM przeciwko punktacji OLIVER vs OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM i GRAHAM vs OLIVER .
Cokolwiek zrobisz, i tak skończysz z fałszywymi trafieniami i nieodebranymi trafieniami. Żaden algorytm nie jest odporny na literówki (chociaż Jaro Winkler poradził sobie całkiem nieźle z MARX vs AMRX).