Різниця між дистанцією Яро-Вінклера та Левенштейна? [зачинено]


83

У мене є варіант використання, коли мені потрібно зробити нечітке зіставлення мільйонів записів з декількох файлів. Я визначив два алгоритми для цього: Яро-Вінклер і Левенштейн редагують відстань.

Коли я почав досліджувати обидва, я не зміг зрозуміти, яка точна різниця між ними. Здається, Левенштейн дає кількість редагувань між двома рядками, а Яро-Вінклер надає нормований бал від 0,0 до 1,0. Я не зрозумів алгоритму.

Оскільки мені потрібно використовувати будь-який алгоритм, мені потрібно знати, які основні відмінності між цими двома алгоритмами.

По-друге, я хотів би знати про різницю в продуктивності між цими двома алгоритмами.

Відповіді:


174

Левенштейн підраховує кількість редагувань (вставки, видалення або заміни), необхідних для перетворення одного рядка в інший. Дамерау-Левенштейн - це модифікована версія, яка також розглядає транспозиції як окремі редагування. Незважаючи на те, що результат - це ціла кількість редагувань, це можна нормалізувати, щоб отримати значення подібності за формулою

1 - (edit distance / length of the larger of the two strings)

Алгоритм Яро - це міра загальних символів, що становить відстань не більше половини довжини довшого рядка, враховуючи транспозиції. Вінклер модифікував цей алгоритм, щоб підтримати ідею, що відмінності біля початку рядка є більш значними, ніж відмінності біля кінця рядка. Яро та Яро-Вінклер підходять для порівняння менших рядків, таких як слова та імена.

Рішення, яким користуватися, - це не лише питання продуктивності. Важливо вибрати метод, який відповідає характеру рядків, які ви порівнюєте. Загалом, обидва згадані вами алгоритми можуть бути дорогими, тому що кожен рядок повинен порівнюватися з будь-яким іншим рядком, а також з мільйонами рядків у вашому наборі даних, це величезна кількість порівнянь. Це набагато дорожче, ніж щось на зразок обчислення фонетичного кодування для кожного рядка, а потім просто групування рядків із однаковим кодуванням.

Існує безліч детальної інформації про ці алгоритми та інші нечіткі алгоритми узгодження рядків в Інтернеті. Це дасть вам початок:

Порівняння відповідності особистих імен: прийоми та практичні питання

Згідно з цим документом, швидкість чотирьох згаданих мною алгоритмів Яро та Левенштейна від найшвидшої до найповільнішої:

  • Джаро
  • Яро-Вінклер
  • Левенштейн
  • Дамерау-Левенштейн

з найповільнішим, який приймає в 2-3 рази більше часу, ніж найшвидший Звичайно, ці часи залежать від довжини рядків та реалізацій, і існують способи оптимізації цих алгоритмів, які, можливо, не використовувались.


6
Відповідь Хетче чудова, але якщо зрозуміти, чи варто згадувати, ви можете використовувати щось на зразок Elasticsearch для виконання як нечітких (Левенштейнових) запитів, так і фонетичних запитів і, швидше за все, дозволить вам швидко оцінити без особливих зусиль.
ppearcy

2
У мене була схожа ідея щодо цього. У мене є вимога порівняти поле object.description, яке може містити багато слів. Чи вже щось подібне зроблено ... для використання ES для Левенштейна?
Wexoni
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.