"Saya mencoba menemukan metode yang dapat diandalkan untuk mencocokkan duplikat orang dalam database."
Sayangnya tidak ada yang seperti itu. Yang paling Anda harapkan adalah sistem dengan elemen keraguan yang masuk akal.
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>
Keuntungan besar SOUNDEX adalah bahwa ia memberi token pada string. Ini berarti memberi Anda sesuatu yang dapat diindeks :ini sangat berharga jika menyangkut data dalam jumlah besar. Di sisi lain itu tua dan kasar. Ada algoritma yang lebih baru, seperti Metaphone dan Double Metaphone. Anda seharusnya dapat menemukan implementasi PL/SQL melalui Google.
Keuntungan dari penilaian adalah bahwa mereka memungkinkan tingkat ketidakjelasan; sehingga Anda dapat menemukan semua baris where name_score >= 90%
. Kerugian yang menghancurkan adalah bahwa skornya relatif sehingga Anda tidak dapat mengindeksnya. Perbandingan semacam ini membunuh Anda dengan volume besar.
Artinya:
- Anda membutuhkan kombinasi strategi. Tidak ada algoritme tunggal yang akan menyelesaikan masalah Anda.
- Pembersihan data berguna. Bandingkan skor untuk MARX vs MRX dan M4RX:menghapus nomor dari nama meningkatkan rasio klik.
- Anda tidak dapat mencetak banyak nama dengan cepat. Gunakan tokenizing dan pre-scoring jika Anda bisa. Gunakan caching jika Anda tidak memiliki banyak churn. Gunakan partisi jika Anda mampu membelinya.
- Gunakan Teks Oracle (atau yang serupa) untuk membuat tesaurus nama panggilan dan varian.
- Oracle 11g memperkenalkan fungsionalitas pencarian nama khusus ke Oracle Text. Cari tahu lebih lanjut.
- Buat tabel nama kanonik untuk menilai dan menautkan catatan data aktual ke sana.
- Gunakan nilai data lain, terutama yang dapat diindeks seperti tanggal lahir, untuk memfilter nama dalam jumlah besar sebelumnya atau untuk meningkatkan kepercayaan pada kecocokan yang diusulkan.
- Perhatikan bahwa nilai data lain datang dengan masalahnya sendiri:apakah seseorang yang lahir pada 31/01/11 berusia sebelas bulan atau delapan puluh tahun?
- Ingat bahwa nama itu rumit, terutama ketika Anda harus mempertimbangkan nama yang telah diromanisasi:ada lebih dari empat ratus cara mengeja Moammar Khadaffi (dalam alfabet romawi) - dan bahkan Google tidak dapat menyetujui varian mana yang paling kanonik.
Dalam pengalaman saya, menggabungkan token (nama depan, nama belakang) adalah berkah yang beragam. Ini memecahkan masalah tertentu (seperti apakah nama jalan muncul di baris alamat 1 atau baris alamat 2) tetapi menyebabkan masalah lain:pertimbangkan untuk menilai GRAHAM OLIVER vs OLIVER GRAHAM terhadap penilaian OLIVER vs OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM dan GRAHAM vs OLIVER .
Apa pun yang Anda lakukan, Anda masih akan berakhir dengan positif palsu dan hit yang terlewatkan. Tidak ada algoritme yang dapat membuktikan kesalahan ketik (walaupun Jaro Winkler cukup berhasil dengan MARX vs AMRX).