"Snažím se najít spolehlivou metodu pro párování duplicitních záznamů osob v databázi."
Bohužel nic takového neexistuje. Nejvíce můžete doufat v systém s rozumným prvkem pochybností.
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>
Velkou výhodou SOUNDEX je, že tokenizuje řetězec. To znamená, že vám poskytuje něco, co lze indexovat :to je neuvěřitelně cenné, pokud jde o velké množství dat. Na druhou stranu je to staré a hrubé. Existují novější algoritmy, jako je Metaphone a Double Metaphone. Přes Google byste měli být schopni najít jejich implementace PL/SQL.
Výhodou bodování je, že umožňují určitý stupeň neostrosti; takže můžete najít všechny řádky where name_score >= 90%
. Drtivou nevýhodou je, že skóre jsou relativní, takže je nemůžete indexovat. Tento druh srovnání vás zabije při velkých objemech.
To znamená:
- Potřebujete kombinaci strategií. Žádný jediný algoritmus váš problém nevyřeší.
- Čištění dat je užitečné. Porovnejte skóre pro MARX vs. MRX a M4RX:odstranění čísel ze jmen zvyšuje míru návštěvnosti.
- Nemůžete získat velké množství jmen za běhu. Pokud můžete, použijte tokenizaci a předběžné hodnocení. Pokud nemáte hodně churn, použijte ukládání do mezipaměti. Pokud si to můžete dovolit, použijte dělení.
- Použijte Oracle Text (nebo podobný) k vytvoření tezauru přezdívek a variant.
- Oracle 11g zavedl do Oracle Text specifickou funkci vyhledávání jmen. Zjistěte více.
- Sestavte tabulku kanonických názvů pro hodnocení a propojte s ní skutečné datové záznamy.
- Použijte jiné hodnoty dat, zejména indexovatelné, jako je datum narození, k předběžnému filtrování velkého množství jmen nebo ke zvýšení spolehlivosti navrhovaných shod.
- Uvědomte si, že jiné hodnoty dat přicházejí s vlastními problémy:je někdo narozený 31. 1. 11 ve věku jedenácti měsíců nebo osmdesáti let?
- Pamatujte si, že jména jsou ošidná, zvláště když musíte vzít v úvahu jména, která byla přepsána do romanizace:existuje více než čtyři sta různých způsobů hláskování Moammara Khadaffiho (v římské abecedě) – a ani Google se nemůže shodnout na tom, která varianta je nejkanoničtější.
Podle mých zkušeností je zřetězení tokenů (křestní jméno, příjmení) smíšeným požehnáním. Řeší určité problémy (např. zda se název silnice objeví v adresním řádku 1 nebo v adresním řádku 2), ale způsobuje jiné problémy:zvažte bodování GRAHAM OLIVER vs OLIVER GRAHAM proti skórování OLIVER vs. OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM a GRAHAM vs OLIVER .
Ať uděláte cokoli, stejně skončíte s falešně pozitivními výsledky a zmeškanými zásahy. Žádný algoritmus není odolný proti překlepům (ačkoli Jaro Winkler si poradil s MARX vs AMRX docela dobře).