Обчислити відстань Левенштейна швидко


24

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

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

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

Посилання на документи на цю тему вітаються.

Відповіді:


16

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

Відстань для редагування дещо неприємно вирішувати для побудови пошукових структур поблизу. Основна проблема полягає в тому, що, як метрика, вона поводиться (як би) як інші добре відомі погані метрики, такі як з метою зменшення розмірів і наближення. На цю тему читається досить велика робота, і найкращим джерелом є набір робіт Алекса Андоні : слідуючи покажчиками назад (наприклад, з його документа FOCS 2010), ви отримаєте хороший набір джерел.1


1
Все, що я знаю про метричні простори, - із семантики, тому запитання: чи є гідні (для будь-якого значення пристойного) вбудовування метрики Левенштейна в ультраметричну? Мимоволі, це може породжувати алгоритм бінарного дерева-ish.
Ніл Крішнасвамі

Я не зовсім впевнений. Я підозрюю, що відповідь - це взагалі ні, але мені немає на що вказувати.
Суреш Венкат

Другий документ на boytsov.info/pubs - це хороший огляд можливих рішень для пошуку сусідів у межах відстані редагування Левенштайн та Дамрео-Левенштайн.
a3nm

@NeelKrishnaswami Вбудовування в ультраметричний має викривлення принаймні де - довжина рядка. Це випливає з нижньої межі спотворення для вбудовування в завдяки Крайтгамеру та Рабані , оскільки ультраметрія ізометрично вбудовується в евклідовий простір, який ізометрично вбудовується в . Ω(журналг)гL1L1
Сашо Ніколов


5

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

Загалом, на це краще дивитися навпаки: у вас є індекс усіх слів у словнику. Тепер для вхідного слова w, якщо воно є в словнику, зупиніться. В іншому випадку генеруйте всі варіанти на відстані 1 і шукайте їх. Якщо їх там немає, шукайте варіації на відстані 2 і так далі ...

У цій базовій ідеї є декілька вдосконалень.


1
Ви повинні були включити посилання на архів досліджень, що відтворюється .
Ден Д.


4

Я написав відповідь на дуже схоже запитання на cs.stackexchange.com ( /cs//a/2096/1490 ), і тоді я знайшов це питання. Відповідь є приблизним пошуком поблизу сусіда на відстані редагування (тобто алгоритм виводить рядок, приблизно такий же близький до рядка запиту, як найближчий сусід рядка запиту). Я розміщую тут повідомлення, оскільки я не знаходжу жодної з посилань, які я дав там, у відповідях, поданих тут.


3

Я думаю, що вам потрібно алгоритм Вагнера-Фішера: https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm Основне розуміння полягає в тому, що оскільки словник, який ви проходите, сортується, два слова підряд є велика ймовірність поділитися довгим префіксом, тому вам не потрібно оновлювати всю матрицю для кожного обчислення відстані.


2

Ви можете використовувати Ви мали на увазі?

А потім знайдіть відстань Левенштейна між відповіддю, поверненим "Ви мали на увазі" "та рядком введення, використовуючи" Динамічне програмування ".


Я не розумію цієї відповіді. Питання задає питання, як можна ефективно знайти слово у великому словнику з близькою відстані Левенштейна до заданого вводу, а не про те, як обчислити відстань Левенштейна або про порівняння з результатом перевірки орфографії у чорній коробці ...
Гек Беннетт

@Huck Bennett: Я думав, @Grigory Javadyan будує Did you mean?особливість. Крім того, Did you mean?повертає слово, яке дуже близьке до даного введення, і робить це досить ефективно. :)
Pratik Deoghare

Я думаю, що ваші ідеї хороші, але, схоже, Григорій просить щось глибше і конкретніше.
Гек Беннетт

@Huck Bennett: Так, ти маєш рацію! :)
Pratik Deoghare

-1

Один із способів - це підготовка моделі машинного навчання для відображення слів у вектори та відображення відстані Левенштейна до евклідової відстані. Тоді ви можете побудувати KDTree з векторів для словника, який ви хочете використовувати. Я створив зошит з юпітером, який робить це тут: https://gist.github.com/MichaelSnowden/9b8b1e662c98c514d571f4d5c20c3a03

Відповідно до коментарів DW:

  1. тренувальна процедура = стохастичний градієнтний спуск з адаптивними градієнтами
  2. функція втрати = середня квадратна помилка між істинною відстані редагування та евклідовою дистанцією
  3. навчальні дані = випадкові рядки довжиною від 1 до 32 символів (можна покращити дані, що відповідають фактичному розподілу загальних помилок)
  4. кількісні результати: після тренінгу приблизно за 150 епох з розміром партії 2048 (час стіни = приблизно одна хвилина), використовуючи вбудовування слів 512 розмірів, з одним прихованим шаром, середня абсолютна помилка між справжньою дистанцією редагування та передбачуваною дистанцією редагування сидить приблизно в 0,75, тобто передбачувана відстань редагування становить приблизно один символ

Короткий зміст структури моделі:

  1. Створіть вивчене вбудовування для кожного символу, включаючи нульовий символ (використовується пізніше для правої панелі тексту під лімітом символів)
  2. Прокладіть праву частину тексту з нульовим символом, поки він не буде на межі символу (32)
  3. Об’єднайте ці вкладення
  4. Запустіть вбудовування через нейронну мережу, що передається вперед, щоб створити вбудовуване слово нижнього розміру (512-мірне)
  5. Зробіть це для обох слів
  6. Знайдіть евклідову відстань між векторами
  7. Встановіть втрату як середню квадратичну помилку між справжньою відстані Левенштейна та евклідовою дистанцією

Мої дані тренувань - це лише випадкові рядки, але я думаю, що результати могли б справді покращитися, якби дані тренувань були (помилка друку / правильне слово). Я закінчив просто використовувати, /usr/share/dict/wordsтому що це зазвичай доступно.


2
Як ви тренуєте модель ML, щоб слова, які знаходяться поблизу відстані Левенштайн, відображалися на подібні вектори? Яку процедуру навчання та функцію втрати ви використовуєте для цього? Чи можете ви узагальнити метод у своїй відповіді, щоб відповідь все ще була корисною, навіть якщо посилання перестане працювати, і щоб нам не довелося перекопувати ваш ноутбук, щоб зрозуміти метод, який ви використовуєте? Також, чи можете ви оцінити, наскільки добре це працює в якомусь кількісному відношенні? Це краще, ніж альтернативи?
DW

На даний момент це (я думаю) погано підходить для CSTheory. Тобто, немає уявлення про те, що конкретно пропонується, і жодного теоретичного обґрунтування цього.
Климент К.

@DW Вибачте з цього приводу - я зробив досить вагому редакцію, яка повинна бути всеосяжною, якщо посилання переходить вниз (або випадок, коли ви не хочете заглядати через ноутбук). Хоча це насправді не теорія CS, оскільки це не дослідження, але я думаю, що це практичний підхід, тому що це швидко і легко як для навчання, так і для висновку.
michaelsnowden

1
Ви тренуєтесь на випадкових струнах. Очікувана відстань Левенштейна між двома такими струнами буде приблизно довжиною довшої струни. Таким чином, оцінити цю відстань за випадковими рядками дуже просто, але це не корисно для роботи з реальними даними. Я підозрюю, що ваші вкладення можуть просто кодувати довжину рядка, і, таким чином, ви могли створити фантазійний спосіб зробити щось тривіальне і марне. Це проблема із використанням ML; він дуже чутливий до функції втрат, яку ви використовуєте.
DW

@DW Якщо ви подивитесь на результати в зошиті, пошук отримав гідні результати - не лише рядки однакової довжини. Я б дуже попросив вас пропустити це. Я б не назвав це тривіальним і марним.
michaelsnowden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.