"Я пытаюсь найти надежный метод для сопоставления дубликата человека
записей в базе данных. "
Увы, такого нет. Максимум, на что вы можете надеяться - это система с разумным элементом сомнения.
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 является то, что он токенизирует строку. Это означает, что он дает вам что-то , которое можно проиндексировать : это невероятно ценно, когда дело касается больших объемов данных. С другой стороны, он старый и грубый. Вокруг появились новые алгоритмы, такие как Metaphone и Double Metaphone. Вы должны быть в состоянии найти их реализации PL / SQL через Google.
Преимущество оценки состоит в том, что они допускают некоторую степень размытости; так что вы можете найти все строки where name_score >= 90%
. Огромный недостаток в том, что оценки являются относительными, и поэтому вы не можете их индексировать. Такое сравнение убивает вас большими объемами.
Что это значит:
- Вам нужно сочетание стратегий. Ни один алгоритм не решит вашу проблему.
- Очистка данных полезна. Сравните оценки для MARX против MRX и M4RX: удаление чисел из имен улучшает рейтинг попаданий.
- Вы не можете набирать большие объемы имен на лету. Используйте токенизацию и предварительную оценку, если можете. Используйте кэширование, если у вас мало оттока. Используйте разделение, если можете себе это позволить.
- Используйте текст Oracle (или аналогичный) для создания тезауруса псевдонимов и вариантов.
- В Oracle 11g появилась специальная функция поиска имен в Oracle Text. Узнайте больше.
- Создайте таблицу канонических имен для оценки и свяжите с ней фактические записи данных.
- Используйте другие значения данных, особенно индексируемые, такие как дата рождения, для предварительной фильтрации больших объемов имен или для повышения уверенности в предлагаемых совпадениях.
- Имейте в виду, что другие значения данных связаны с их собственными проблемами: кто-то родился 31.01.11 в одиннадцать месяцев или в восемьдесят лет?
- Помните, что имена являются хитрыми, особенно когда вы должны учитывать имена, которые были латинизированы: существует более четырехсот различных способов написания Моаммара Хадаффи (в римском алфавите) - и даже Google не может договориться о том, какой вариант является самый канонический.
По моему опыту, объединение токенов (имя, фамилия) является смешанным благословением. Это решает определенные проблемы (например, появляется ли название дороги в адресной строке 1 или адресной строке 2), но вызывает другие проблемы: рассмотрите возможность оценки GRAHAM OLIVER против OLIVER GRAHAM против оценки OLIVER против OLIVER, GRAHAM против GRAHAM, OLIVER против GRAHAM и GRAHAM против OLIVER ,
Что бы вы ни делали, вы все равно будете получать ложные срабатывания и пропущенные попадания. Ни один алгоритм не является доказательством против опечаток (хотя Jaro Winkler хорошо справился с MARX против AMRX).