"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à:
- 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.
- 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.
- 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.
- 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ể.
- 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.
- 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 đó.
- 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.
- 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?
- 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).