Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Khớp các giá trị cột trùng lặp của Oracle bằng cách sử dụng Soundex, Jaro Winkler và Chỉnh sửa Khoảng cách (UTL_MATCH)

"Tôi đang cố gắng tìm một phương pháp đáng tin cậy để đối sánh các bản ghi người trùng lặp trong cơ sở dữ liệu."

Than ôi không có điều đó. Bạn có thể hy vọng nhiều nhất là một hệ thống có yếu tố nghi ngờ hợp lý.

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> 

Ưu điểm lớn của SOUNDEX là nó mã hóa chuỗi. Điều này có nghĩa là nó cung cấp cho bạn thứ gì đó có thể được lập chỉ mục :điều này cực kỳ có giá trị khi nói đến lượng lớn dữ liệu. Mặt khác, nó là cũ và thô. Có các thuật toán mới hơn xung quanh, chẳng hạn như Metaphone và Double Metaphone. Bạn có thể tìm thấy các ứng dụng PL / SQL của chúng thông qua Google.

Ưu điểm của việc ghi điểm là chúng cho phép có một mức độ mờ nhạt; vì vậy bạn có thể tìm thấy tất cả các hàng where name_score >= 90% . Điểm bất lợi là điểm số là tương đối và vì vậy bạn không thể lập chỉ mục chúng. Kiểu so sánh này giết bạn với số lượng lớn.

Điều này có nghĩa là:

  1. Bạn cần kết hợp các chiến lược. Không có thuật toán duy nhất nào giải quyết được vấn đề của bạn.
  2. Làm sạch dữ liệu rất hữu ích. So sánh điểm số của MARX so với MRX và M4RX:việc loại bỏ các số khỏi tên sẽ cải thiện tỷ lệ bắn trúng.
  3. Bạn không thể nhanh chóng ghi được nhiều tên tuổi. Sử dụng mã hóa và tính điểm trước nếu bạn có thể. Sử dụng bộ nhớ đệm nếu bạn không có nhiều sự cố. Sử dụng phân vùng nếu bạn có đủ khả năng.
  4. Sử dụng Văn bản Oracle (hoặc tương tự) để xây dựng từ điển đồng nghĩa về biệt hiệu và các biến thể.
  5. Oracle 11g đã giới thiệu chức năng tìm kiếm tên cụ thể cho Oracle Text. Tìm hiểu thêm.
  6. Xây dựng một bảng tên chuẩn để tính điểm và liên kết các bản ghi dữ liệu thực tế với bảng đó.
  7. Sử dụng các giá trị dữ liệu khác, đặc biệt là các giá trị có thể lập chỉ mục như ngày sinh, để lọc trước khối lượng lớn tên hoặc để tăng độ tin cậy trong các kết quả phù hợp được đề xuất.
  8. Lưu ý rằng các giá trị dữ liệu khác đi kèm với các vấn đề riêng của chúng:ai đó sinh ngày 31/01/11 11 tháng tuổi hay 80 tuổi?
  9. Hãy nhớ rằng những cái tên rất phức tạp, đặc biệt khi bạn phải xem xét những cái tên đã được viết bằng chữ La tinh:có hơn bốn trăm cách đánh vần khác nhau của Moammar Khadaffi (trong bảng chữ cái La Mã) - và thậm chí Google cũng không thể đồng ý về biến thể nào là chuẩn nhất.

Theo kinh nghiệm của tôi, việc nối các mã thông báo (tên, họ) là một may mắn hỗn hợp. Nó giải quyết các vấn đề nhất định (chẳng hạn như tên đường xuất hiện ở dòng địa chỉ 1 hoặc dòng địa chỉ 2) nhưng gây ra các vấn đề khác:xem xét tính điểm GRAHAM OLIVER vs OLIVER GRAHAM so với tính điểm OLIVER vs OLIVER, GRAHAM vs GRAHAM, OLIVER vs GRAHAM và GRAHAM vs OLIVER .

Dù bạn làm gì, bạn vẫn sẽ nhận được kết quả dương tính giả và các lần truy cập bị bỏ lỡ. Không có thuật toán nào là bằng chứng chống lại lỗi chính tả (mặc dù Jaro Winkler đã làm khá tốt với MARX và 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. Tệp đính kèm trong Ứng dụng Oracle R12

  2. Làm thế nào để có được ngày hôm qua trong Oracle

  3. Làm cách nào để biết liệu cơ sở dữ liệu tiên tri có được đặt thành tự động gửi hay không?

  4. Oracle Live SQL

  5. Lỗi DYLD_LIBRARY_PATH của Oracle Instantclient