Levenshtein đếm số lần chỉnh sửa (chèn, xóa hoặc thay thế) cần thiết để chuyển đổi một chuỗi này sang chuỗi kia. Damerau-Levenshtein là một phiên bản sửa đổi cũng coi các chuyển vị là các chỉnh sửa đơn lẻ. Mặc dù đầu ra là số nguyên của các chỉnh sửa, nhưng điều này có thể được chuẩn hóa để cung cấp một giá trị tương tự bằng công thức
1 - (edit distance / length of the larger of the two strings)
Thuật toán Jaro là thước đo các ký tự chung, có độ dài không quá một nửa của chuỗi dài hơn trong khoảng cách, có tính đến các chuyển vị. Winkler đã sửa đổi thuật toán này để hỗ trợ ý tưởng rằng sự khác biệt gần đầu chuỗi có ý nghĩa hơn so với sự khác biệt gần cuối chuỗi. Jaro và Jaro-Winkler phù hợp để so sánh các chuỗi nhỏ hơn như từ và tên.
Quyết định sử dụng cái nào không chỉ là vấn đề về hiệu suất. Điều quan trọng là chọn một phương pháp phù hợp với bản chất của các chuỗi mà bạn đang so sánh. Mặc dù vậy, nói chung, cả hai thuật toán bạn đề cập đều có thể tốn kém, vì mỗi chuỗi phải được so sánh với mọi chuỗi khác và với hàng triệu chuỗi trong tập dữ liệu của bạn, đó là một số lượng lớn so sánh. Điều đó đắt hơn nhiều so với những thứ như tính toán mã hóa ngữ âm cho mỗi chuỗi, và sau đó chỉ cần nhóm các chuỗi chia sẻ các bảng mã giống hệt nhau.
Có rất nhiều thông tin chi tiết về các thuật toán này và các thuật toán so khớp chuỗi mờ khác trên internet. Cái này sẽ giúp bạn bắt đầu:
So sánh giữa trùng khớp tên cá nhân: Kỹ thuật và các vấn đề thực tế
Theo bài báo đó, tốc độ của bốn thuật toán Jaro và Levenshtein mà tôi đã đề cập là từ nhanh nhất đến chậm nhất:
- Jaro
- Jaro-Winkler
- Levenshtein
- Damerau-Levenshtein
chậm nhất mất 2 đến 3 lần và nhanh nhất. Tất nhiên những thời gian này phụ thuộc vào độ dài của chuỗi và cách triển khai, và có những cách để tối ưu hóa những thuật toán này có thể chưa được sử dụng.