Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mencocokkan nilai kolom duplikat Oracle menggunakan Soundex, Jaro Winkler dan Edit Distance (UTL_MATCH)

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

  1. Anda membutuhkan kombinasi strategi. Tidak ada algoritme tunggal yang akan menyelesaikan masalah Anda.
  2. Pembersihan data berguna. Bandingkan skor untuk MARX vs MRX dan M4RX:menghapus nomor dari nama meningkatkan rasio klik.
  3. 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.
  4. Gunakan Teks Oracle (atau yang serupa) untuk membuat tesaurus nama panggilan dan varian.
  5. Oracle 11g memperkenalkan fungsionalitas pencarian nama khusus ke Oracle Text. Cari tahu lebih lanjut.
  6. Buat tabel nama kanonik untuk menilai dan menautkan catatan data aktual ke sana.
  7. 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.
  8. Perhatikan bahwa nilai data lain datang dengan masalahnya sendiri:apakah seseorang yang lahir pada 31/01/11 berusia sebelas bulan atau delapan puluh tahun?
  9. 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).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggunakan CREATE OR REPLACE?

  2. Metode Pengumpulan:Fungsi COUNT Dalam Database Oracle

  3. Dalam database Oracle, apa perbedaan antara ROWNUM dan ROW_NUMBER?

  4. SQL tidak menampilkan nilai nol pada kueri yang tidak sama?

  5. Mengapa PL/SQL tidak menghormati hak istimewa yang diberikan oleh Peran?