Левенштейн Автоматы
Я реализовал левенштейновую три, чтобы найти похожие слова для данного слова. моя цель состояла в том, чтобы иметь быстрый способ исправить заклинание.
Однако я узнал, что есть еще более быстрый способ сделать это:
Левенштейн Автоматы
У меня просто проблема... Я не понимаю ни слова о том, что здесь написано. Может кто-нибудь объяснить мне идею и основные функции автомата Левенштейна в простых словах?
2 ответа
Может кто-нибудь объяснить мне идею и основные функции автомата Левенштейна в простых словах?
Детерминированный конечный автомат (DFA)
- алфавит (набор возможных входных символов)
- набор состояний (просто абстрактные объекты без специальных свойств)
- функция перехода (при любом состоянии и входном символе возвращается уникальное состояние)
- отличное начальное состояние
- набор принимающих состояний.
Вы можете нарисовать DFA в виде диаграммы, подобной приведенной в статье. Условно круговые узлы являются состояниями. Направленные ребра, каждый из которых помечен одним символом, являются переходами. Принимающие состояния помечены как двойные кружки. Начальное состояние имеет стрелку, указывающую внутрь, и на хвосте ничего нет.
DFA принимает слово W тогда и только тогда, когда вы можете переместить маркер из начального состояния по переходам, конкатенированные метки которых равны W, в принимающее состояние. То есть, если T является функцией перехода, а W = "cat", то T (T(T(T(Start, "c"), "a"), "t") должно быть принимающим состоянием. Циклы в функции перехода позволяют DFA принимать строки произвольной длины, даже если DFA конечен.
В программном обеспечении DFA представляет собой простой цикл и таблицу T(state, char), которая реализует функцию перехода.
current_state = START
while not end-of-input
c = get character from input
current_state = T(current_state, c)
end
if current_state is an accepting state return ACCEPT, else REJECT
Страница Википедии о DFA не плохая.
ДФА имеют хорошие свойства. Принятие / отклонение ввода длины N требует времени O(N) (при условии, что функция перехода выполняется в постоянное время). Существует уникальная минимальная версия каждого DFA (среди всех, принимающих один и тот же набор слов) и эффективный алгоритм для поиска этого минимального DFA. Легко сравнить DFA по равенству во времени, линейному по размеру DFA.
Автомат Левенштейна L(W, d) для слова W и расстояния Левенштейна d - это просто DFA, который принимает все слова, имеющие расстояние Левенштейна не более d от W. То есть автомат принимает W плюс кучу других слов, которые W с не более чем "ошибки" в обычном смысле Левенштейна на расстоянии.
Вклад статьи - быстрый алгоритм для вычисления DFA Левенштейна, а затем более продвинутый алгоритм, который выполняет то же самое без явного вычисления DFA.
Джин предоставил фантастическое высокоуровневое описание автоматов Левенштейна!
С учетом вышесказанного, если вы ищете какой-то код для вашего понимания, вам может пригодиться библиотека Java LevenshteinAutomaton. Он реализует оба алгоритма, описанные в статье, на которую вы наткнулись (среди прочих), и хорошо структурирован, прост в использовании и широко комментируется. Это также поддерживается вашим по-настоящему:) .