В вычислительной лингвистике и информатике расстояние редактирования — это строковая метрика , то есть способ количественной оценки того, насколько непохожи друг на друга две строки (например, слова), который измеряется путем подсчета минимального количества операций, необходимых для преобразования одной строки в другую. Расстояния редактирования находят применение в обработке естественного языка , где автоматическая коррекция орфографии может определять кандидаты на исправление неправильно написанного слова, выбирая из словаря слова, которые имеют небольшое расстояние до рассматриваемого слова. В биоинформатике его можно использовать для количественной оценки сходства последовательностей ДНК , которые можно рассматривать как строки букв A, C, G и T.
Различные определения расстояния редактирования используют различные наборы подобных операций. Операции расстояния Левенштейна — это удаление, вставка или замена символа в строке. Будучи наиболее распространенной метрикой, термин расстояние Левенштейна часто используется взаимозаменяемо с расстоянием редактирования . [1]
Различные типы расстояния редактирования допускают различные наборы строковых операций. Например:
Некоторые расстояния редактирования определяются как параметризуемая метрика, вычисляемая с помощью определенного набора разрешенных операций редактирования, и каждой операции назначается стоимость (возможно, бесконечная). Это далее обобщается алгоритмами выравнивания последовательностей ДНК , такими как алгоритм Смита-Уотермана , которые делают стоимость операции зависящей от того, где она применяется.
Если даны две строки a и b в алфавите Σ (например, набор символов ASCII , набор байтов [0..255] и т. д.), расстояние редактирования d( a , b ) представляет собой минимально-весовой ряд операций редактирования, который преобразует a в b . Один из простейших наборов операций редактирования определен Левенштейном в 1966 году: [2]
В первоначальном определении Левенштейна каждая из этих операций имеет единичную стоимость (за исключением того, что замена символа на самого себя имеет нулевую стоимость), поэтому расстояние Левенштейна равно минимальному числу операций, необходимых для преобразования a в b . Более общее определение связывает с операциями неотрицательные весовые функции w ins ( x ), w del ( x ) и w sub ( x , y ). [2]
Были предложены дополнительные примитивные операции. Расстояние Дамерау–Левенштейна считается одним редактированием распространенная ошибка: транспозиция двух соседних символов, формально характеризуемая операцией, которая изменяет u x y v на u y x v . [3] [4] Для задачи исправления вывода OCR использовались операции слияния и разделения , которые заменяют один символ на пару или наоборот. [4]
Другие варианты расстояния редактирования получаются путем ограничения набора операций. Расстояние самой длинной общей подпоследовательности (LCS) — это расстояние редактирования, в котором вставка и удаление являются единственными двумя операциями редактирования, обе по стоимости единицы. [1] : 37 Аналогично, разрешая только замены (опять же по стоимости единицы), получается расстояние Хэмминга ; это должно быть ограничено строками одинаковой длины. [1] Расстояние Джаро–Винклера можно получить из расстояния редактирования, где разрешены только транспозиции.
Расстояние Левенштейна между «котёнок» и «сидит» равно 3. Минимальный сценарий редактирования, преобразующий первое во второе, выглядит следующим образом:
Расстояние LCS (только вставки и удаления) дает другое расстояние и минимальный сценарий редактирования:
на общую стоимость/расстояние 5 операций.
Расстояние редактирования с неотрицательной стоимостью удовлетворяет аксиомам метрики , что приводит к метрическому пространству строк, когда выполняются следующие условия: [1] : 37
При этих свойствах метрические аксиомы выполняются следующим образом:
Расстояние Левенштейна и расстояние LCS с единичной стоимостью удовлетворяют вышеуказанным условиям, а значит, и аксиомам метрики. Варианты расстояния редактирования, которые не являются собственными метриками, также рассматривались в литературе. [1]
Другие полезные свойства расстояний редактирования удельной стоимости включают в себя:
Независимо от стоимости/веса, для всех расстояний редактирования справедливо следующее свойство:
Первый алгоритм для вычисления минимального расстояния редактирования между парой строк был опубликован Дамеро в 1964 году. [6]
Используя оригинальные операции Левенштейна, (несимметричное) расстояние редактирования от до задается выражением , определяемым рекуррентным соотношением [2]
Этот алгоритм можно обобщить для обработки транспозиций, добавив еще один член в минимизацию рекурсивного предложения. [3]
Прямой, рекурсивный способ оценки этой рекуррентности занимает экспоненциальное время . Поэтому его обычно вычисляют с использованием алгоритма динамического программирования , который обычно приписывают Вагнеру и Фишеру , [7] хотя он имеет историю множественных изобретений. [2] [3] После завершения алгоритма Вагнера-Фишера минимальная последовательность операций редактирования может быть считана как обратный след операций, используемых во время алгоритма динамического программирования, начиная с .
Этот алгоритм имеет временную сложность Θ( m n ), где m и n — длины строк. Когда построена полная таблица динамического программирования, ее пространственная сложность также равна Θ( m n ) ; ее можно улучшить до Θ(min( m , n )), заметив, что в любой момент времени алгоритму требуется только две строки (или два столбца) в памяти. Однако эта оптимизация делает невозможным считывание минимальной серии операций редактирования. [3] Линейно-пространственное решение этой проблемы предлагается алгоритмом Хиршберга . [8] : 634 Общая рекурсивная структура «разделяй и властвуй» для решения таких рекуррентных уравнений и извлечения оптимальной последовательности операций с эффективностью кэширования в пространстве, линейном по размеру входных данных, предоставлена Чоудхури, Ле и Рамачандраном. [9]
Улучшая алгоритм Вагнера-Фишера, описанный выше, Укконен описывает несколько вариантов, [10] один из которых берет две строки и максимальное расстояние редактирования s и возвращает min( s , d ) . Он достигает этого, вычисляя и сохраняя только часть таблицы динамического программирования вокруг ее диагонали. Этот алгоритм занимает время O( s ×min( m , n )) , где m и n — длины строк. Сложность пространства составляет O( s 2 ) или O( s ) , в зависимости от того, нужно ли считывать последовательность редактирования. [3]
Дальнейшие усовершенствования Ландау , Майерса и Шмидта [1] дают алгоритм со временем O( s 2 + max( m , n )) [11]
Для конечного алфавита и кратных друг другу затрат на редактирование самым быстрым из известных точных алгоритмов является алгоритм Масека и Патерсона [12], в худшем случае время выполнения которого составляет O(nm/logn).
Расстояние редактирования находит применение в вычислительной биологии и обработке естественного языка, например, для исправления орфографических ошибок или ошибок оптического распознавания символов, а также для приблизительного сопоставления строк , где целью является поиск соответствий для коротких строк во многих длинных текстах в ситуациях, когда ожидается небольшое количество различий.
Существуют различные алгоритмы, решающие задачи, выходящие за рамки вычисления расстояния между парой строк, а также решающие смежные типы задач.
Обобщением расстояния редактирования между строками является расстояние редактирования языка между строкой и языком, обычно формальным языком . Вместо того, чтобы рассматривать расстояние редактирования между одной строкой и другой, расстояние редактирования языка является минимальным расстоянием редактирования, которое может быть достигнуто между фиксированной строкой и любой строкой, взятой из набора строк. Более формально, для любого языка L и строки x над алфавитом Σ расстояние редактирования языка d ( L , x ) задается как [14] , где — расстояние редактирования строки. Когда язык L является контекстно-свободным , существует алгоритм динамического программирования с кубическим временем, предложенный Ахо и Петерсоном в 1972 году, который вычисляет расстояние редактирования языка. [15] Для менее выразительных семейств грамматик, таких как регулярные грамматики , существуют более быстрые алгоритмы для вычисления расстояния редактирования. [16]
Расстояние редактирования языка нашло множество разнообразных применений, таких как сворачивание РНК, исправление ошибок и решения проблемы оптимальной генерации стека. [14] [17]