Рубрики
Без рубрики

Как рассчитать расстояние Левенштейна в Python?

Прочитав этот урок, вы точно узнаете, как рассчитать расстояние редактирования в Python. [Бонус] Python Puzzle.

Автор оригинала: Chris.

После изучения этой статьи вы будете точно знать Как рассчитать расстояние редактирования в Python Отказ

Обучение требует первого открытия вашего разрыва знаний. Итак, давайте сделаем это. Какова производительность следующих пазл Python, показывающая вам краткий фрагмент кода для расчета расстояния редактирования в Python? ( Источник )

Исходный код Python

def levenshtein(a, b):
    if not a: return len(b)
    if not b: return len(a)
    return min(levenshtein(a[1:], b[1:])+(a[0] != b[0]),
               levenshtein(a[1:], b)+1,
               levenshtein(a, b[1:])+1)

    
print(levenshtein("cat","chello"))

Теперь это жесткая гайка для трещины. Давайте посмотрим, как работает этот код!

Общая идея Левенштейна расстояние

Перед тем, как мы погрузимся в код, давайте сначала понять идею расстояния Левенштейна:

«В теории информации, лингвистике и информатике, расстояние левенштейна – это строковая метрика для измерения разницы между двумя последовательностями. Неофициально, расстояние Левенштейна между двумя словами является минимальное количество односимвольных редактиций (вставка, делеции или замены), необходимые для изменения одного слова в другое.Википедия

Вот два самых важных пункта из определения:

  • Расстояние Левенштейна – это метрическая измерение разницы между двумя строками. Если две строки похожи, расстояние должно быть небольшим. Если они очень разные, расстояние должно быть большим.
  • Но что это значит для двух строк, чтобы быть похожими или другими? Метрика определяется как число «редактирование» для преобразования одной строки в другую. Редактирование может быть введением символа в заданном положении, удаление символа или замена символа с другим символом.

Применение расстояния Левенштейна

Левенштейин Расстояние имеет важные приложения на практике. Подумайте о Функциональность автоматической коррекции на вашем смартфоне Отказ

Скажем, вы напечатаете “HELO” В вашем WhatsApp Messenger. Ваш смартфон распознает, что это не слово в его словаре. Затем он выбирает несколько высоких слов вероятности и может отсортировать их от расстояния Левенштейна. Один с минимальным расстоянием левенштейна (и, следовательно, максимальное сходство) является “Привет” Потому что вам просто нужно вставить один символ "L" идти от неверных "HELO" К правильному слову "Привет" что существует в словаре.

Объяснение исходного кода

Давайте погрузимся в код. Мы уже знаем, что расстояние левенштейна вычисляет минимальное количество редактиций ( вставка , Удалить или заменить ) Чтобы достичь второй строки, начиная с первой строки.

Вот одна минимальная последовательность:

"cat"
"cht" (replace "a" by "h")
"che" (replace "t" by "e")
"chel" (insert "l" at position 3)
"chell" (insert "l" at position 4)
"chello" (insert "o" at position 5)

Итак, мы можем преобразовать строку "Кошка" В строке "Челло" с пятью редакциями. Нет быстрее пути вперед и попробуйте!

Но как алгоритм делает это?

Intermezzo: ценность прав истина Python

В Python каждый объект имеет значение правды. В Гарри Поттере вы либо хорошие или плохие. В Python вы либо правда или ложь.

Большинство объектов на самом деле «правда» (нормальные люди обычно хороши). Интуитивно, вы знаете несколько объектов, которые являются «ложными», не так ли? Например:

  • 0 ложно
  • “Ложно
  • [] ложно
  • {} ложно

Понимание алгоритма Левенштейна

С этой информацией вы можете легко понять первые две линии функции левенштейна:

if not a: return len(b)
if not b: return len(a)

Предположим, строка a пустая. В этом случае минимальное расстояние редактирования – Лен (б) Вставки символов в строке b . Мы не можем сделать лучше. Следовательно, мы можем напрямую вернуть правильное расстояние редактирования, если ни один из строк пуст.

Покажем, обе строки не пустые (в противном случае решение тривиально, как показано ранее).

Теперь мы можем упростить проблему тремя способами.

Во-первых, мы игнорируем ведущие персонажи обоих строк А и B и рассчитать расстояние редактирования от А [1.:] к B [1:] в оформлении рекурсивный манера. Обратите внимание, что мы используем Slicing, чтобы получить подстроки, начиная со второго символа с индексом 1.

💡 Нарезка это концепция, чтобы вырезать подстроку из данной строки. Используйте нотацию нарезки S [Старт: Стоп: Шаг] Для доступа к каждому шаг -ный элемент, начиная с индекса Начните (включая) и заканчивая индекс Стоп (Исключенный). Все три аргумента являются необязательными, поэтому вы можете пропустить их для использования значений по умолчанию ( Start = 0 , Stop = Len (LST) , Шаг = 1 ). Например, выражение S [2: 4] из струны «Привет» выкрой ломтик «Я» и выражение S [: 3: 2] выкрой ломтик 'HL' Отказ

Связанная статья + Видеоурок: Введение в нарезку

Если ведущие персонажи [0] и B [0] разные, мы должны исправить это, заменяя A [0] По B [0] . Следовательно, мы должны увеличить расстояние редактирования на один, если они отличаются.

В коде это выглядит следующим образом:

levenshtein(a[1:], b[1:])+(a[0] != b[0])

Во-вторых, мы удаляем первый персонаж A [0] Отказ Теперь мы проверяем минимальное расстояние редактирования рекурсивно для этой меньшей проблемы. Как мы убрали персонаж, мы увеличиваем результат на один.

В коде это выглядит следующим образом:

levenshtein(a[1:], b) + 1

В-третьих, мы (концептуально) вставьте символ B [0] до начала слова А Отказ Теперь мы можем уменьшить эту проблему на меньшую проблему, которая возникает, если убрать первый символ B Отказ Как мы выполнили одну операцию редактирования (вставку), мы увеличиваем результат на одну.

Вот код:

levenshtein(a, b[1:])+1

Наконец, мы просто принимаем минимальное расстояние редактирования всех трех результатов (замените первый символ, удалите первый символ, вставьте первый символ).

Последние замечания

Спасибо за чтение этого учебника на блог Finxter! 🙂

У вас были трудности понять рекурсию и основы Python (их так много)? Почему бы не разрешить их, раз и для всех, и присоединиться к топ-10% Pythonistas?

Если вы хотите повысить свою карьеру и одновременно улучшить свои навыки Python, почему бы не начать зарабатывать деньги, когда вы узнаете как питонский фрилансеры?

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.