Левенштейн підраховує кількість редагувань (вставки, видалення або заміни), необхідних для перетворення одного рядка в інший. Дамерау-Левенштейн - це модифікована версія, яка також розглядає транспозиції як окремі редагування. Незважаючи на те, що результат - це ціла кількість редагувань, це можна нормалізувати, щоб отримати значення подібності за формулою
1 - (edit distance / length of the larger of the two strings)
Алгоритм Яро - це міра загальних символів, що становить відстань не більше половини довжини довшого рядка, враховуючи транспозиції. Вінклер модифікував цей алгоритм, щоб підтримати ідею, що відмінності біля початку рядка є більш значними, ніж відмінності біля кінця рядка. Яро та Яро-Вінклер підходять для порівняння менших рядків, таких як слова та імена.
Рішення, яким користуватися, - це не лише питання продуктивності. Важливо вибрати метод, який відповідає характеру рядків, які ви порівнюєте. Загалом, обидва згадані вами алгоритми можуть бути дорогими, тому що кожен рядок повинен порівнюватися з будь-яким іншим рядком, а також з мільйонами рядків у вашому наборі даних, це величезна кількість порівнянь. Це набагато дорожче, ніж щось на зразок обчислення фонетичного кодування для кожного рядка, а потім просто групування рядків із однаковим кодуванням.
Існує безліч детальної інформації про ці алгоритми та інші нечіткі алгоритми узгодження рядків в Інтернеті. Це дасть вам початок:
Порівняння відповідності особистих імен: прийоми та практичні питання
Згідно з цим документом, швидкість чотирьох згаданих мною алгоритмів Яро та Левенштейна від найшвидшої до найповільнішої:
- Джаро
- Яро-Вінклер
- Левенштейн
- Дамерау-Левенштейн
з найповільнішим, який приймає в 2-3 рази більше часу, ніж найшвидший Звичайно, ці часи залежать від довжини рядків та реалізацій, і існують способи оптимізації цих алгоритмів, які, можливо, не використовувались.