Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Correspondência de valores de coluna duplicados do Oracle usando Soundex, Jaro Winkler e Edit Distance (UTL_MATCH)


"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 é:
  1. Você precisa de uma combinação de estratégias. Nenhum algoritmo único resolverá seu problema.
  2. 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.
  3. 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.
  4. Use um Oracle Text (ou similar) para construir um dicionário de sinônimos e variantes.
  5. O Oracle 11g introduziu uma funcionalidade específica de pesquisa de nomes no Oracle Text. Saiba mais.
  6. Crie uma tabela de nomes canônicos para pontuação e vincule os registros de dados reais a ela.
  7. 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.
  8. 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?
  9. 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).