По моему опыту, приближение k-граммы оставляет желать лучшего (оно исключает множество релевантных результатов).
Вместо этого достаточно поместить ваши термины в автомат / преобразователь, три или даже отсортированный массив.и найти истинные совпадения Левенштейна через пересечение.
это интуитивно понятно, если вы думаете об этом: если вы хотите, чтобы слова были только на расстоянии 1, а входной термин - "foo", нет смысла исследовать"bar", "baz" и т. д. при проверке узлов 'b'.Только boo, bfoo и т. д. имеют шанс, поэтому вы можете ограничить поиск только префиксами, которые могут привести к конечному состоянию.
, поэтому вы просто создаете автомат, который принимает все слова в пределах k расстояний редактирования, равных "foo"и затем пересекайте этот автомат с вашим словарем-автоматом / три / чем угодно.
вы можете очень эффективно вычислить эти эти DFA, избегая медленного определения NFA-DFA и т. д .:
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.652