Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dopasowywanie wartości zduplikowanych kolumn Oracle za pomocą Soundex, Jaro Winkler i Edit Distance (UTL_MATCH)

„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:

  1. Potrzebujesz kombinacji strategii. Żaden pojedynczy algorytm nie rozwiąże Twojego problemu.
  2. Oczyszczanie danych jest przydatne. Porównaj wyniki dla MARX vs MRX i M4RX:usuwanie liczb z nazw poprawia wskaźnik trafień.
  3. 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ć.
  4. Użyj Oracle Text (lub podobnego), aby zbudować tezaurus pseudonimów i wariantów.
  5. Oracle 11g wprowadził do Oracle Text funkcję wyszukiwania nazw. Dowiedz się więcej.
  6. Zbuduj tabelę nazw kanonicznych do oceny i połącz z nią rzeczywiste rekordy danych.
  7. 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ń.
  8. 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?
  9. 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).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak w moim przypadku mogę napisać SQL w Oracle?

  2. Konwertuj uniksowy znacznik czasu na wartość daty w Oracle

  3. Konwertuj ciąg znaków oddzielonych przecinkami na tablicę w PL/SQL

  4. Znajdź zduplikowane wpisy w kolumnie

  5. Jak korzystać z partycji lub max?