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

Как рассчитать расстояние редактирования в Python

Самый короткий алгоритм Python (1 строка) для расчета расстояния редактирования

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

Введите «Helo World» в вашу панель поиска Google.

Google спросит вас: «Вы имели в виду: Hello World»

Простой метод для обнаружения этих Типы это Левенштейин Расстояние (также называемое расстояние редактирования). Фактически, алгоритм Google, похоже, использует свой вариант этого. ( Источник )

Изучая эту статью, вы узнаете о важном практическом алгоритме для расчета «Расстояние Левенштейна» или «Расстояние редактирования».

Основы

Расстояние Левенштейна является метрикой для расчета расстояния между двумя строками. Это поможет вам определить, как «похожие» две строки. Расстояние Левенштейна также называется «редактирование расстояния», которое точно описывает то, что он измеряет: количество измерений символов (вставка, удаление или замены), которые необходимы для преобразования одной строки в другую. Интуиция заключается в следующем: чем меньше расстояние левенштейна, тем больше похожи на строки.

Расстояние Левенштейна имеет важные приложения. Подумайте о функциональности автоматической коррекции на вашем смартфоне. Скажем, вы вводите «Helo» в своем WhatsApp Messenger. Затем ваш смартфон выбирает несколько высоких слов вероятности и сортирует их (например, расстояние левенштейна). Например, тот, с минимальным расстоянием левенштейна (и, следовательно, максимальное сходство) – это строка «Hello». Таким образом, он может автоматически исправить «Helo» на «Hello».

Давайте рассмотрим пример с двумя строками «кошка» и «Черо». Как рассчитать расстояние Левенштейна в этом сценарии?

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

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

  • “Кот”
  • « ЧТ » (заменить «А» по «H»)
  • « че » (заменить «т» по «е»)
  • Чел ” (Вставка “L” в положении 3)
  • Chell ” (Вставить “L” в положении 4)
  • « Chello » (Вставьте «O» в положение 5)

Таким образом, мы можем преобразовать строку «кошку» в строке «Chello» в пять шагов редактирования – расстояние левенштейна составляет 5.

Код

Проблема: напишите питон одноклассник, который рассчитывает расстояние Левенштейна из двух строк A и B.

## The Data
a = "cat"
b = "chello"
c = "chess"

## The One-Liner
ls = lambda a, b: len(b) if not a else len(a) if not b \
         else min(ls(a[1:], b[1:])+(a[0] != b[0]),
                  ls(a[1:], b)+1,
                  ls(a, b[1:])+1)

## The Result
print(ls(a,b))
print(ls(a,c))
print(ls(b,c))

Перечисление: расчет расстояния левенштейна двух строк в одной линии.

Какая вывод этого кода фрагмент?

Как это устроено

Перед тем, как мы погрузимся в код, давайте быстро исследовать важный трюк Python, который мы тяжело эксплуатируем в однокласснике. В Python каждый объект имеет значение правды – хотя вы либо хорошие, либо плохо в мире Гарри Поттера, вы либо правда, либо ложны в мире Python! Большинство объектов на самом деле верны (нормальные люди обычно хороши). Интуитивно, вы знаете, что несколько объектов, которые являются ложными, не так ли?

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

Как правило, объекты Python считаются ложными, если они пусты или нуля. Оснащен этой информацией, теперь вы можете легко понять первую часть функции левенштейна:

Мы создаем функцию лямбда, которая возвращает количество изменений, необходимых для преобразования строки в строка б. Существует два тривиальных случая: Предположим, что строка A пустая. В этом случае минимальное расстояние редактирования – Лен (б) Вставки символов в строке b. Мы не можем сделать лучше. Точно так же, если строка B пуста, минимальное расстояние редактирования – Лен (а). Таким образом, мы можем напрямую вернуть правильное расстояние редактирования, если ни один из строк пуст.

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

Во-первых, мы игнорируем ведущие символы обоих строк A и B и рассчитайте расстояние редактирования от [1:] до B [1:] в рекурсивном порядке. Если ведущие символы A [0] и B [0] разные, мы должны исправить его, заменив [0] на B [0]. Следовательно, мы увеличиваем расстояние редактирования на один, если они отличаются.

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

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

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

Это решение одноклассника еще раз демонстрирует важность подготовки ваших навыков рекурсии – рекурсия может не прийти к вам естественным путем, но отдыхать уверены, что он будет изучать многие рекурсивные проблемы, такие как этот.

Куда пойти отсюда?

Это продвинутый алгоритм, который требует основных компьютерных наук и навыков Python. Если вы чувствуете, что вам нужно тренировать основы, прочитайте книгу «Кофе-брейк Python». После изучения книги вы не только знаете свой точный уровень квалификации Python, вы также поймете код Python намного быстрее!

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

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

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