Алгоритм сравнения слов (не по алфавиту) - PullRequest
5 голосов
/ 19 мая 2009

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

Пользователь вводит слово, которое должно быть одним из нескольких фиксированных параметров (я держу параметры в списке). Я знаю, что ввод должен быть в списке в списке, но так как это ввод пользователя, он / она, возможно, допустил ошибку. Я ищу алгоритм, который скажет мне, какое слово наиболее вероятно имел в виду пользователь. У меня нет контекста, и я не могу заставить пользователя выбирать из списка (то есть он должен иметь возможность вводить слово свободно и вручную).

Например, скажем, в списке есть слова «вода», «четверть», «пиво», «свекла», «ад», «привет» и «аардварк».

Решение должно учитывать различные типы «обычных» ошибок:

  • Оперативные опечатки (например, удвоение символов, удаление символов и т. Д.)
  • Опечатки рядом с символами клавиатуры (например, "qater" для "воды")
  • опечатки на неродном английском языке (например, "quater" для "четверти")
  • И так далее ...

Очевидное решение состоит в том, чтобы сравнивать букву за буквой и давать «веса штрафа» для каждой отдельной буквы, дополнительной буквы и пропущенной буквы. Но это решение игнорирует тысячи «стандартных» ошибок, которые, я уверен, где-то перечислены. Я уверен, что есть эвристики, которые имеют дело со всеми случаями, как конкретными, так и общими, возможно, с использованием большой базы данных стандартных несоответствий (я открыт для решений с большим объемом данных).

Я пишу на Python, но считаю этот вопрос независимым от языка.

Любые рекомендации / мысли?

Ответы [ 7 ]

10 голосов
/ 19 мая 2009

Вы хотите прочитать, как это делает Google: http://norvig.com/spell-correct.html

Редактировать: Некоторые люди упоминали алгоритмы, которые определяют метрику между данным пользователем словом и словом-кандидатом (levenshtein, soundex). Это, однако, не является полным решением проблемы, так как для эффективной работы неевклидового поиска ближайших соседей также потребуется структура данных. Это можно сделать, например, с покровным деревом: http://hunch.net/~jl/projects/cover_tree/cover_tree.html

6 голосов
/ 19 мая 2009

Распространенным решением является вычисление расстояния Левенштейна между вводом и вашими фиксированными текстами. Расстояние Левенштейна между двумя строками - это просто число простых операций - вставки, удаления и замены одного символа - необходимое для превращения одной строки в другую.

2 голосов
/ 19 мая 2009

Рассматривали ли вы алгоритмы, которые сравниваются по фонетическим звукам, например soundex ? Не должно быть слишком сложно создать soundex-представления вашего списка слов, сохранить их, а затем получить soundex для ввода пользователя и найти там самое близкое соответствие.

1 голос
/ 20 мая 2009

Если ваш набор данных действительно мал, достаточно просто сравнить расстояние Левенштейна по всем пунктам. Однако, если он больше, вам нужно использовать BK-Tree или аналогичную систему индексации. В статье, на которую я ссылался, описывается, как находить совпадения на заданном расстоянии Левенштейна, но довольно просто приспособиться к поискам ближайшего соседа (и оставлено в качестве упражнения для читателя;).

1 голос
/ 19 мая 2009

Ищите алгоритм Bitap. Он хорошо подходит для того, что вы хотите сделать, и даже поставляется с примером исходного кода в Википедии.

0 голосов
/ 19 мая 2009

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

0 голосов
/ 19 мая 2009

Хотя это может не решить всю проблему, вы можете рассмотреть возможность использования алгоритма soundex как части решения. Быстрый поиск в Google "soundex" и "python" показал некоторые реализации алгоритма на python.

...