EDIT: новое решение
Да, вычисления расстояния Левенштейна между входом и список слов может быть разумный подход, но занимает много времени. BK-деревья могут улучшить это, но они быстро замедляются, так как расстояние Левенштейна становится больше.Кажется, мы можем ускорить вычисления расстояния Левенштейна используя синтаксического дерева, как описано в этом отличном блоге:
Fast and Easy Levenshtein distance using a Trie
Он основан на том, что динамическое программирование таблицы поиска для расстояния Левенштейна имеет общий строки в разных вызовах т.е. levenshtein(kate,cat)
и levenshtein(kate,cats)
.
Запуск программы Python, приведенная на этой странице с TWL06 словаря дает:
> python dict_lev.py HACKING 1
Read 178691 words into 395185 nodes
('BACKING', 1)
('HACKING', 0)
('HACKLING', 1)
('HANKING', 1)
('HARKING', 1)
('HAWKING', 1)
('HOCKING', 1)
('JACKING', 1)
('LACKING', 1)
('PACKING', 1)
('SACKING', 1)
('SHACKING', 1)
('RACKING', 1)
('TACKING', 1)
('THACKING', 1)
('WHACKING', 1)
('YACKING', 1)
Search took 0.0189998 s
Это очень быстро, и будет еще быстрее и на других языках. Большую часть времени тратится на создание три, что не имеет значения, поскольку это нужно делать только один раз и хранить в памяти.
Единственный недостаток этого заключается в том, что попытки занимают много памяти (что может быть уменьшено с помощью DAWG за счет некоторой скорости).
Другой подход: У Питера Норвига отличная статья (с полным исходным кодом) по исправлению правописания.
http://norvig.com/spell-correct.html
Идея заключается в том, чтобы построить возможные изменения из слов, а затем выбрать наиболее вероятную коррекцию орфографии этого слова.
Похоже, вы грубо нуждаетесь в автоматическом корректоре орфографии - там должно быть достаточно информации. – Dukeling
@ Dukeling, На самом деле, корректор орфографии не был тем, чего я пытался достичь, но спасибо. Я могу найти что-то сейчас :) – cipher
@cipher Я просто разместил новое решение, если вам интересно. – Max