Oracle
 sql >> база данни >  >> RDS >> Oracle

Съвпадение на стойностите на дублирани колони на Oracle с помощта на Soundex, Jaro Winkler и Edit Distance (UTL_MATCH)

„Опитвам се да намеря надежден метод за съпоставяне на дублирани лични записи в базата данни.“

Уви няма такова нещо. Най-много, на което можете да се надявате, е система с разумен елемент на съмнение.

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> 

Голямото предимство на SOUNDEX е, че токенизира низа. Това означава, че ви дава нещо, което може да бъде индексирано :това е невероятно ценно, когато става въпрос за големи количества данни. От друга страна е стара и груба. Наоколо има по-нови алгоритми, като метафон и двоен метафон. Трябва да можете да намерите PL/SQL имплементации чрез Google.

Предимството на точкуването е, че те позволяват известна степен на размита; така че можете да намерите всички редове where name_score >= 90% . Смазващият недостатък е, че резултатите са относителни и затова не можете да ги индексирате. Този вид сравнение ви убива с големи обеми.

Това означава:

  1. Имате нужда от комбинация от стратегии. Никой един алгоритъм няма да реши проблема ви.
  2. Почистването на данни е полезно. Сравнете резултатите за MARX спрямо MRX и M4RX:премахването на числа от имена подобрява процента на попадане.
  3. Не можете да спечелите големи обеми от имена в движение. Използвайте токенизиране и предварително оценяване, ако можете. Използвайте кеширане, ако нямате много churn. Използвайте разделяне, ако можете да си го позволите.
  4. Използвайте Oracle Text (или подобен), за да създадете речник от прякори и варианти.
  5. Oracle 11g въведе специфична функционалност за търсене на имена в Oracle Text. Научете повече.
  6. Създайте таблица с канонични имена за оценяване и свържете действителните записи с данни с това.
  7. Използвайте други стойности на данни, особено индексируеми, като дата на раждане, за предварително филтриране на големи обеми от имена или за повишаване на увереността в предложените съвпадения.
  8. Имайте предвид, че други стойности на данни идват със свои собствени проблеми:някой роден на 31/01/11 е на единадесет месеца или на осемдесет години?
  9. Не забравяйте, че имената са трудни, особено когато трябва да имате предвид имена, които са били романизирани:има над четиристотин различни начина за изписване на Моамар Кадафи (в латинската азбука) – и дори Google не може да се съгласи кой вариант е най-канонични.

Според моя опит свързването на токените (собствено име, фамилия) е смесена благословия. Той решава определени проблеми (като например дали името на пътя се появява в адресен ред 1 или адресен ред 2), но причинява други проблеми:помислете за оценка на GRAHAM OLIVER срещу OLIVER GRAHAM срещу оценка OLIVER срещу OLIVER, GRAHAM срещу GRAHAM, OLIVER срещу GRAHAM и GRAHAM срещу OLIVER .

Каквото и да правите, все пак ще завършите с фалшиви положителни резултати и пропуснати попадения. Никой алгоритъм не е доказателство срещу печатни грешки (въпреки че Jaro Winkler се справи доста добре с MARX срещу 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. тригери за кръстосано издание напред в R12.2

  2. Само архивиране на SQL схема?

  3. Какво е името на ограничението по подразбиране в Oracle?

  4. Пример за съхранена процедура в Oracle с параметър IN OUT

  5. Как мога да комбинирам няколко реда в списък, разделен със запетая в Oracle?