Sự khác biệt giữa khoảng cách Jaro-Winkler và Levenshtein? [đóng cửa]


82

Tôi có một trường hợp sử dụng mà tôi cần thực hiện đối sánh mờ hàng triệu bản ghi từ nhiều tệp. Tôi đã xác định hai thuật toán cho điều đó: Jaro-WinklerLevenshtein chỉnh sửa khoảng cách.

Khi tôi bắt đầu khám phá cả hai, tôi không thể hiểu sự khác biệt chính xác giữa hai loại này là gì. Có vẻ như Levenshtein đưa ra số lần chỉnh sửa giữa hai chuỗi và Jaro-Winkler cung cấp điểm chuẩn hóa từ 0,0 đến 1,0. Tôi không hiểu thuật toán.

Khi tôi cần sử dụng một trong hai thuật toán, tôi cần biết sự khác biệt cơ bản giữa hai thuật toán này là gì.

Thứ hai, tôi muốn biết về sự khác biệt hiệu suất giữa hai thuật toán này.

Câu trả lời:


173

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.


5
Câu trả lời của Hatchet rất hay, nhưng nếu cần đề cập, bạn có thể sử dụng một thứ gì đó như Elasticsearch để thực hiện cả truy vấn mờ (Levenshtein) và truy vấn dựa trên ngữ âm và có khả năng cho phép bạn đánh giá nhanh chóng mà không cần nỗ lực nhiều.
ppearcy

1
Tôi đã có một ý tưởng tương tự cho điều đó. Tôi có yêu cầu so sánh trường object.description, trường này có thể có nhiều từ. Có điều gì đã được thực hiện như thế này ... để sử dụng ES cho Levenshtein không?
Wexoni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.