"Estou tentando encontrar um método confiável para combinar registros pessoais duplicados no banco de dados."
Infelizmente não existe tal coisa. O máximo que você pode esperar é um sistema com um elemento razoável de dúvida.
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>
A grande vantagem do SOUNDEX é que ele tokeniza a string. Isso significa que fornece algo que pode ser indexado :isso é incrivelmente valioso quando se trata de grandes quantidades de dados. Por outro lado, é velho e bruto. Existem algoritmos mais recentes, como Metaphone e Double Metaphone. Você deve ser capaz de encontrar implementações PL/SQL deles via Google.
A vantagem da pontuação é que ela permite um grau de imprecisão; para que você possa encontrar todas as linhas
where name_score >= 90%
. A desvantagem esmagadora é que as pontuações são relativas e, portanto, você não pode indexá-las. Esse tipo de comparação mata você com grandes volumes. O que isso significa é:
- Você precisa de uma combinação de estratégias. Nenhum algoritmo único resolverá seu problema.
- A limpeza de dados é útil. Compare as pontuações de MARX vs MRX e M4RX:retirar os números dos nomes melhora a taxa de acertos.
- Você não pode marcar grandes volumes de nomes na hora. Use tokenização e pré-pontuação, se puder. Use o cache se você não tiver muita rotatividade. Use particionamento se você puder pagar.
- Use um Oracle Text (ou similar) para construir um dicionário de sinônimos e variantes.
- O Oracle 11g introduziu uma funcionalidade específica de pesquisa de nomes no Oracle Text. Saiba mais.
- Crie uma tabela de nomes canônicos para pontuação e vincule os registros de dados reais a ela.
- Use outros valores de dados, especialmente os indexáveis, como data de nascimento, para pré-filtrar grandes volumes de nomes ou aumentar a confiança nas correspondências propostas.
- Esteja ciente de que outros valores de dados vêm com seus próprios problemas:alguém nascido em 31/01/11 tem onze meses ou oitenta anos?
- Lembre-se de que nomes são complicados, especialmente quando você tem que considerar nomes que foram romanizados:existem mais de quatrocentas maneiras diferentes de soletrar Moammar Khadaffi (no alfabeto romano) - e nem mesmo o Google pode concordar sobre qual variante é a mais canônico.
Na minha experiência, concatenar os tokens (primeiro nome, sobrenome) é uma bênção mista. Ele resolve certos problemas (como se o nome da estrada aparece na linha de endereço 1 ou na linha de endereço 2), mas causa outros problemas:considere pontuar GRAHAM OLIVER vs OLIVER GRAHAM contra a pontuação OLIVER vs OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM e GRAHAM vs OLIVER .
Faça o que fizer, você ainda acabará com falsos positivos e acertos perdidos. Nenhum algoritmo é à prova de erros de digitação (embora Jaro Winkler tenha se saído muito bem com MARX vs AMRX).