2013-05-02 3 views
2

Предположим, у меня есть словарь слов, { «кошка», «койку», «катализатор»}, и характер соотношение подобия е (х, у)Как неуловимо искать словарные слова?

f(x, y) = 1, if x and y are similar 
     = 0, otherwise 

Эти «сходства» может быть определен с помощью программист. таким образом, что, скажем,

f('t', 'l') = 1 
f('a', 'o') = 1 
f('f', 't') = 1 

но

f('a', 'z') = 0 
etc. 

Теперь, если у нас есть запрос 'cofatyst', алгоритм должен сообщить следующие матчи:

('cot', 0) 
('cat', 0) 
('catalyst', 0) 

, где число является начальным индексом на основе 0 найденного совпадения. Я пробовал Aho-Corasick algorithm, и хотя он отлично работает для точного соответствия, и в случае, когда персонаж имеет относительно меньшее количество «похожих» символов, его производительность падает экспоненциально, поскольку мы увеличиваем количество похожих символов для символа. Может ли кто-нибудь указать мне на лучший способ сделать это? Беспокойство - это абсолютная необходимость, и он должен принимать во внимание характер сходства (т. Е. Не слепо зависит от правого расстояния).

+0

Так в принципе, вы хотите какое-то минимальное редактирование расстояния, которое принимает во внимание, что некоторые символы (например, символы близко друг к другу на клавиатуре), скорее всего, будет заменено? Моя кишка говорит мне, что вы получите гораздо лучший ответ на StackOverflow. – acattle

+0

правильный! И понятие подобных символов может быть другим (например, когда вы OCR некоторые вещи, я, скорее всего, будет неверно истолкован как «t» или «i», чем неправильно понимать как «a»). Хорошо, спрашивая SO, как хорошо –

+0

Возможный дубликат [Как fuzzily поиск словарного слова?] (http://stackoverflow.com/questions/16333766/how-to-fuzzily-search-for-a-dictionary-word) Вы, по-видимому, размещены на обоих SO и лингвистика.stackexchange. Затем вопрос о последнем был перенесен сюда. – jogojapan

ответ

1

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

http://en.wikipedia.org/wiki/Levenshtein_distance

+0

Это начало, но проблема в том, что с огромным словарем, как искать словарные * подстроки * в запросе? Алгоритм вычисления расстояния Левенштейна может быть изменен, чтобы соответствовать этому: http://ginstrom.com/scribbles/2007/12/01/fuzzy-substring-matching-with-levenshtein-distance-in-python/ Но это дает только наименьшее расстояние Левенштейна подстроки - не дает позицию матча (ов) из коробки. Я думаю, что я близок, и если здесь будет достаточно мозгового штурма, мы можем придумать что-нибудь аккуратное. –

Смежные вопросы