В теории информации , лингвистики и информатики , то расстояние Левенштейна является строка метрики для измерения разности между двумя последовательностями. Неформально расстояние Левенштейна между двумя словами - это минимальное количество односимвольных правок (вставок, удалений или замен), необходимых для преобразования одного слова в другое. Он назван в честь советского математика Владимира Левенштейна , который рассмотрел это расстояние в 1965 году. [1]
Расстояние Левенштейна также может называться расстоянием редактирования , хотя этот термин может также обозначать более крупное семейство показателей расстояния, вместе известных как расстояние редактирования . [2] : 32 Это тесно связано с попарным выравниванием строк .
Определение [ править ]
Расстояние Левенштейна между двумя струнами (длины и соответственно) определяется как где
где некоторой строки - это строка, состоящая из всех символов , кроме первого , и - это th символ строки , начинающийся с символа 0.
Обратите внимание, что первый элемент в минимуме соответствует удалению (от до ), второй - вставке, а третий - замене.
Это определение прямо соответствует наивной рекурсивной реализации .
Пример [ править ]
Например, расстояние Левенштейна между «котенком» и «сидящим» равно 3, поскольку следующие три правки меняют одно на другое, и нет способа сделать это, сделав менее трех правок:
- k itten → s itten (замена «k» на «s»)
- sitt e n → sitt i n (замена «i» на «e»)
- sittin → sittin g (вставка буквы "g" в конце).
Верхняя и нижняя границы [ править ]
Расстояние Левенштейна имеет несколько простых оценок сверху и снизу. Это включает:
- Это как минимум разница в размерах двух струн.
- Это не больше длины более длинной струны.
- Он равен нулю тогда и только тогда, когда строки равны.
- Если строки одинакового размера, расстояние Хэмминга является верхней границей расстояния Левенштейна. Расстояние Хэмминга - это количество позиций, в которых соответствующие символы в двух строках различаются.
- Расстояние Левенштейна между двумя струнами не больше суммы их расстояний Левенштейна от третьей струны ( неравенство треугольника ).
Пример, когда расстояние Левенштейна между двумя струнами одинаковой длины строго меньше расстояния Хэмминга, дается парой «изъян» и «лужайка». Здесь расстояние Левенштейна равно 2 (удалить букву «f» спереди, вставить «n» в конце). Расстояние Хэмминга равно 4.
Приложения [ править ]
При приблизительном сопоставлении строк цель состоит в том, чтобы найти совпадения для коротких строк во многих более длинных текстах в ситуациях, когда ожидается небольшое количество различий. Например, короткие строки могут быть взяты из словаря. Здесь одна из струн обычно короткая, а другая произвольно длинная. Он имеет широкий спектр приложений, например, средства проверки орфографии , системы коррекции для оптического распознавания символов и программное обеспечение для помощи в переводе на естественный язык на основе памяти переводов .
Расстояние Левенштейна также можно вычислить между двумя более длинными строками, но стоимость его вычисления, которая примерно пропорциональна произведению двух длин строк, делает это непрактичным. Таким образом, при использовании для помощи в поиске нечетких строк в приложениях, таких как связывание записей , сравниваемые строки обычно короткие, что помогает повысить скорость сравнения. [ необходима цитата ]
В лингвистике расстояние Левенштейна используется в качестве метрики для количественной оценки лингвистического расстояния или того, насколько два языка отличаются друг от друга. [3] Это связано с взаимной разборчивостью : чем выше языковая дистанция, тем ниже взаимная разборчивость, и чем меньше языковая дистанция, тем выше взаимная разборчивость.
Связь с другими показателями расстояния редактирования [ править ]
Существуют и другие популярные меры расстояния редактирования , которые рассчитываются с использованием другого набора допустимых операций редактирования. Например,
- расстояние Дамерау – Левенштейна позволяет переставлять два соседних символа вместе с вставкой, удалением, заменой;
- расстояние самой длинной общей подпоследовательности (LCS) допускает только вставку и удаление, но не замену;
- расстояние Хэмминга допускает только замену, следовательно, оно применяется только к строкам одинаковой длины.
- Яро расстояние позволяет только транспозиции .
Расстояние редактирования обычно определяется как параметризуемая метрика, вычисляемая с помощью определенного набора разрешенных операций редактирования, и каждой операции назначается стоимость (возможно, бесконечная). Это дополнительно обобщается алгоритмами выравнивания последовательностей ДНК , такими как алгоритм Смита – Уотермана , который заставляет стоимость операции зависеть от того, где она применяется.
Вычисление расстояния Левенштейна [ править ]
Рекурсивный [ править ]
Это простая, но неэффективная рекурсивная реализация HaskelllDistance
функции, которая принимает две строки s и t вместе с их длинами и возвращает расстояние Левенштейна между ними:
lDistance :: ( Eq a ) => [ a ] -> [ a ] -> Int lDistance [] t = length t - Если s пусто, расстояние - это количество символов в t lDistance s [] = длина s - - Если t пусто, расстояние - это количество символов в s lDistance ( a : s ' ) ( b : t' ) = если a == b, то lDistance s ' t' - Если первые символы совпадают, их можно игнорировать, иначе 1 + минимум - В противном случае попробуйте все три возможных действия и выберите лучшее [ lDistance ( a : s ' ) t' - Символ вставлен ( b вставлен) , lDistance s ' ( b : t' ) - символ удален (a удален) , lDistance s ' t' - символ заменен (a заменен на b) ]
Эта реализация очень неэффективна, поскольку она многократно пересчитывает расстояние Левенштейна для одних и тех же подстрок.
Более эффективный метод никогда не повторит тот же расчет расстояния. Например, расстояние Левенштейна всех возможных префиксов может быть сохранено в массиве, где - расстояние между последними символами строки и последними символами строки . Таблицу легко построить по одной строке, начиная со строки 0. Когда вся таблица построена, желаемое расстояние находится в таблице в последней строке и столбце, представляя расстояние между всеми символами и всеми символами. персонажи в .s
t
s
t
Итеративная с полной матрицей [ править ]
- Примечание. В этом разделе используются строки с отсчетом от 1 вместо строк с отсчетом от 0.
Вычисление расстояния Левенштейна основано на наблюдении, что если мы резервируем матрицу для хранения расстояний Левенштейна между всеми префиксами первой строки и всеми префиксами второй строки, то мы можем вычислить значения в матрице способом динамического программирования , и таким образом найдите расстояние между двумя полными строками как последнее вычисленное значение.
Этот алгоритм, пример снизу вверх динамического программирования , обсуждается, с вариантами, в 1974 статье The Строка в строку задачи коррекции Роберт А. Вагнер и Майкл Дж Фишер. [4]
Это простая реализация псевдокода для функции, LevenshteinDistance
которая принимает две строки s длины m и t длины n и возвращает расстояние Левенштейна между ними:
function LevenshteinDistance ( char s [ 1 .. m ] , char t [ 1 .. n ]) : // для всех i и j, d [i, j] будет содержать расстояние Левенштейна между // первыми i символами s и первые j символов t объявляют int d [ 0 .. m , 0 .. n ] установить каждый элемент в D к нулю // исходные префиксы могут быть преобразованы в пустую строку // путем удаления всех символов для i с 1 до m : d [ i , 0 ] : = i // целевые префиксы могут быть достигнуты из пустого исходного префикса // путем вставки каждого символа для j от 1 до n : d [ 0 , j ] : = j для j от 1 до n : для i от 1 до m : если s [ i ] = t [ j ] : substitutionCost : = 0 else : substitutionCost : = 1 d [ i , j ] : = minimum ( d [ i - 1 , j ] + 1 , // удаление d [ i , j - 1 ] + 1 , // вставка d [ i - 1 , j - 1 ] + substitutionCost ) // подстановка вернуть d [ m , n ]
Два примера результирующей матрицы (наведение курсора на помеченное число показывает операцию, выполняемую для получения этого числа):
|
|
Инвариант сохраняется в течение всего алгоритма является то , что мы можем преобразовать начальный сегмент в использовании минимума операций. В конце концов, нижний правый элемент массива содержит ответ.s[1..i]
t[1..j]
d[i,j]
Итеративная с двумя строками матрицы [ править ]
Оказывается, для построения нужны только две строки таблицы, если не нужно восстанавливать отредактированные входные строки (предыдущая строка и текущая вычисляемая строка).
Расстояние Левенштейна может быть вычислено итеративно с использованием следующего алгоритма: [5]
function LevenshteinDistance ( char s [ 0 .. m - 1 ] , char t [ 0 .. n - 1 ]) : // создать два рабочих вектора с целочисленными расстояниями объявить int v0 [ n + 1 ] объявить int v1 [ n + 1 ] // инициализируем v0 (предыдущая строка расстояний) // эта строка A [0] [i]: редактируем расстояние для пустого s // расстояние - это просто количество символов, которые нужно удалить из t для i от 0 до n : v0 [ i ] = i for i от 0 до m - 1 : // вычисляем v1 (текущие расстояния между строками) из предыдущей строки v0 // первый элемент v1 - это A [i + 1] [0] // расстояние редактирования - удаление (i + 1) символов из s для соответствия пустому t v1 [ 0 ] = i + 1 // используйте формулу, чтобы заполнить оставшуюся часть строки для j от 0 до n - 1 : // вычисление затрат для A [i + 1] [j + 1] deletionCost : = v0 [ j + 1 ] + 1 InsertCost : = v1 [ j ] + 1, если s [ i ] = t [ j ] : substitutionCost : = v0 [ j ] else : substitutionCost : = v0 [ j ] + 1 v1 [ j + 1 ] : = минимум ( deletionCost , InsertCost , substitutionCost ) // копируем v1 (текущая строка) в v0 (предыдущая строка) для следующей итерации // поскольку данные в v1 всегда недействительны, замена без копирования могла бы быть более эффективной заменой v0 на v1 // после последней замены, результаты v1 теперь в v0 return v0 [ n ]
Этот вариант с двумя строками является субоптимальным - объем требуемой памяти может быть уменьшен до одной строки и одного (индексного) служебного слова для лучшей локализации кэша. [6]
Алгоритм Хиршберга сочетает этот метод с « разделяй и властвуй» . Он может вычислить оптимальную последовательность редактирования, а не только расстояние редактирования, с теми же асимптотическими временными и пространственными ограничениями. [7]
Адаптивный вариант [ править ]
Динамический вариант - не идеальная реализация. Адаптивный подход может уменьшить объем требуемой памяти и, в лучшем случае, может уменьшить временную сложность до линейной по длине самой короткой строки и, в худшем случае, не более чем квадратичной по длине самой короткой строки. . Идея состоит в том, что можно использовать эффективные библиотечные функции ( std::mismatch
) для проверки общих префиксов и суффиксов и погружаться в часть DP только при несовпадении. [6]
Автоматы [ править ]
Автоматы Левенштейна эффективно определяют, имеет ли строка расстояние редактирования ниже заданной константы от заданной строки. [8]
Приближение [ править ]
Расстояние Левенштейна между двумя струнами длины n можно аппроксимировать с точностью до множителя
где ε > 0 - свободный параметр, который нужно настроить за время O ( n 1 + ε ) . [9]
Вычислительная сложность [ править ]
Было показано, что расстояние Левенштейна двух цепочек длины n не может быть вычислено за время O ( n 2 - ε ) для любого ε больше нуля, если только гипотеза сильного экспоненциального времени не является ложной. [10]
См. Также [ править ]
- соглашаться
- Расстояние Дамерау – Левенштейна
- разница
- Динамическое искажение времени
- Евклидово расстояние
- Гомология последовательностей в генетике
- Расстояние Хэмминга
- Алгоритм Ханта – Шимански
- Индекс Жаккара
- Хеширование с учетом местоположения
- Самая длинная общая проблема подпоследовательности
- Lucene (поисковая система с открытым исходным кодом, реализующая дистанционное редактирование)
- Манхэттенское расстояние
- Метрическое пространство
- MinHash
- Оптимальный алгоритм сопоставления
- Числовая таксономия
- Индекс сходства Соренсена
Ссылки [ править ]
- ^ В. И. Левенштейн (1965).Двоичные коды с исправлением выпадений, вставок и замен символов[Двоичные коды, способные исправлять удаления, вставки и обращения]. Доклады Академии Наук СССР . 163 (4): 845–848.На английском языке появился как: Левенштейн, Владимир I. (февраль 1966 г.). «Двоичные коды, способные исправлять удаления, вставки и обращения». Доклады советской физики . 10 (8): 707–710. Bibcode : 1966SPhD ... 10..707L .
- ^ Ян Д. тен Тидже; Людгер Зееваерт (1 января 2007 г.), Восприимчивое многоязычие: лингвистический анализ, языковая политика и дидактические концепции , издательство John Benjamins Publishing Company, 2007, ISBN 978-90-272-1926-8,
... Предполагая, что разборчивость обратно пропорциональна лингвистической дистанции ... содержание слов процент родственных слов (связанных напрямую или через синоним) ... лексическое родство ... грамматическое родство ...
- ^ Вагнер, Роберт А .; Фишер, Майкл Дж (1974), "Строка в строку коррекции ошибок", журнал АКМ , 21 (1): 168-173, DOI : 10,1145 / 321796,321811 , S2CID 13381535
- ^ Hjelmqvist, Sten (26 марта 2012), Fast, память эффективный алгоритм Левенштейна
- ^ a b «Четкое / Иосифович: невероятно быстрая функция расстояния Левенштейна» . Заархивировано из оригинала 12 июня 2018 года.
Его [
sic
] скорость
достигается за
счет использования очень небольшого объема памяти, частого сохранения буфера полностью в кеше и уменьшения объема работы за счет пропуска любых префиксов и постфиксов, которые не увеличивают стоимость .
[...] Дело в том, что вам действительно нужно знать три значения, когда вы хотите обновить ячейку в матрице, и вы можете сохранить два из них в буфере, а третье значение - в фиксированном месте.
Живой дочерний код.
- Перейти ↑ Hirschberg, DS (1975). «Алгоритм линейного пространства для вычисления максимальных общих подпоследовательностей» (PDF) . Сообщения ACM (Представленная рукопись). 18 (6): 341–343. CiteSeerX 10.1.1.348.4774 . DOI : 10.1145 / 360825.360861 . Руководство по ремонту 0375829 . S2CID 207694727 .
- ^ Шульц, Клаус У .; Михов, Стоян (2002). "Быстрая коррекция строки с помощью автоматов Левенштейна". Международный журнал анализа и распознавания документов . 5 (1): 67–85. CiteSeerX 10.1.1.16.652 . DOI : 10.1007 / s10032-002-0082-8 . S2CID 207046453 .
- ^ Андони, Александр; Krauthgamer, Роберт; Онак, Кшиштоф (2010). Полилогарифмическое приближение для расстояния редактирования и асимметричной сложности запроса . IEEE Symp. Основы компьютерных наук (FOCS). arXiv : 1005,4033 . Bibcode : 2010arXiv1005.4033A . CiteSeerX 10.1.1.208.2079 .
- ^ Бакурс, Артурс; Индык, Петр (2015). Расстояние редактирования не может быть вычислено за строго субквадратное время (если SETH не является ложным) . Сорок седьмой ежегодный симпозиум ACM по теории вычислений (STOC). arXiv : 1412.0348 . Bibcode : 2014arXiv1412.0348B .
Внешние ссылки [ править ]
В реализации алгоритма Викибука есть страница на тему: Расстояние Левенштейна |
- Блэк, Пол Э., изд. (14 августа 2008 г.), «Расстояние Левенштейна», Словарь алгоритмов и структур данных [онлайн] , Национальный институт стандартов и технологий США , получено 2 ноября 2016 г.