Ответ 1
Возможный источник статистики о реальном мире в истории Wikipedia complete edit.
http://download.wikimedia.org/
Кроме того, вам может быть интересен AWB RegExTypoFix
Где я могу найти реальную статистику о типовом мире?
Я пытаюсь сопоставить текст ввода с внутренними объектами, и люди склонны совершать орфографические ошибки.
Существует 2 типа ошибок:
typos
- "Helllo" вместо "Hello" / "Satudray" вместо "Saturday" и т.д.Spelling
- "Шикаго" вместо "Чикаго" Я использую расстояние Дамерау-Левенштейна для опечаток и Double Metaphone для написания (реализации Python здесь и здесь).
Я хочу сосредоточиться на Damerau-Levenshtein (или просто edit-distance
). Реализации учебников всегда используют "1" для веса делеций, замен вставки и транспозиций. Хотя это просто и позволяет использовать хорошие алгоритмы, он не соответствует "реальности" / "реальным возможностям".
Примеры:
Каким должен быть вес "реального мира" для делеций, вставок, замещений и транспозиций?
Даже Норвиг очень крутой корректор заклинаний использует невесомое расстояние редактирования.
BTW- Я уверен, что веса должны быть функциями, а не простыми поплавками (в соответствии с приведенным выше примеры)...
Я могу настроить алгоритм, но где я могу "узнать" эти веса? У меня нет доступа к данные Google-масштаба...
Должен ли я просто угадать их?
EDIT - попытка ответить на вопросы пользователя:
Возможный источник статистики о реальном мире в истории Wikipedia complete edit.
http://download.wikimedia.org/
Кроме того, вам может быть интересен AWB RegExTypoFix
Я бы посоветовал вам проверить триграмм alogrithm. По-моему, он лучше работает для поиска опечаток, а затем редактирует алгоритм расстояния. Он также должен работать быстрее, и если вы сохраняете словарь в базе данных postgres, вы можете использовать индекс.
Вы можете найти полезный stackoverflow тему о Google "Возможно, вы имели в виду"
Вероятность подсчета орфографической коррекции от Церкви и Гейла может помочь. В этой статье авторы моделируют опечатки как шумный канал между автором и компьютером. В приложении есть таблицы для опечаток, которые можно найти в корпусе публикаций Associated Press. Существует таблица для каждого из следующих типов опечаток:
Например, рассматривая таблицу вставки, мы можем видеть, что l был неправильно вставлен после l 128 раз (наибольшее число в этом столбце). Используя эти таблицы, вы можете генерировать вероятностные возможности, которые вы ищете.
Если исследование является вашим интересом, я думаю, что продолжение этого алгоритма, пытаясь найти достойный вес, будет плодотворным.
Я не могу помочь вам с опечатками, но я думаю, вы также должны играть с python difflib. В частности, метод ratio() для SequenceMatcher. Он использует алгоритм, который docs http://docs.python.org/library/difflib.html утверждает, что он подходит для совпадений, которые выглядят правильно, и могут быть полезны для дополнения или тестирования что вы делаете.
Для программистов на python, просто ищущих опечатки, это хорошее место для начала. Один из моих коллег использовал расстояние редактирования Левенштейна и соотношение SequenceMatcher() и получил намного лучшие результаты от отношения().
Некоторые вопросы для вас, чтобы помочь вам определить, следует ли вам задавать вопрос "Где я могу найти реальные веса":
Действительно ли вы измерили эффективность единообразного взвешивания? Как?
Сколько разных "внутренних объектов" у вас есть - т.е. какой размер вашего словаря?
Как вы на самом деле используете расстояние редактирования, например. John/Joan, Marmaduke/Marmeduke, Featherstonehaugh/Featherstonhaugh: это "все 1 ошибка" или разница 25%/11.1%/5.9%? Какой порог вы используете?
Сколько пар словарных статей находится в пределах вашего порога (например, Джон против Джоан, Джоан против Хуана и т.д.)? Если вы представили систему причудливого взвешивания, сколько пар словарных статей будет мигрировать (а) изнутри порога на внешний (б) наоборот?
Что вы будете делать, если и Джон и Хуан находятся в вашем словаре, и пользователь называет Joan?
Каковы штрафы/издержки (1) выбор неправильного словаря (не того, что означает пользователь) (2) неспособность распознать ввод пользователя?
Внедрение сложной взвешивающей системы фактически уменьшит вероятности двух вышеперечисленных типов ошибок с достаточным запасом, чтобы сделать сложность и более медленную скорость полезной?
Кстати, откуда вы знаете, какую клавиатуру пользовался пользователь?
Update:
"" Мой текущий не взвешенный алгоритм часто не работает, когда сталкивается с опечатками по вышеуказанным причинам. "Возвращение в четверг": каждый "настоящий человек" может легко сказать, что четверг скорее, чем во вторник, но они оба - edit-distance away! (Да, я регистрирую и измеряю свое исполнение). ""
Да, четверг → четверг, опуская "h", но вторник → четверг, заменив "r" вместо "e". E и R находятся рядом друг с другом на клавиатурах qwERty и azERty. Каждый "настоящий человек" может легко угадать, что четверг более вероятно, чем вторник. Даже если статистика, а также догадки указывают на то, что четверг будет более вероятным, чем во вторник (возможно, упущение h будет стоить 0,5, а e- > r будет стоить 0,75), будет ли разница (возможно, 0,25) достаточной, чтобы всегда выбирать четверг? Может/спросит ваша система: "Вы имели в виду вторник?" или делает/будет ли он просто пахать вперед с четвергом?