Какой алгоритм дает предложения в проверке орфографии? - PullRequest
108 голосов
/ 19 февраля 2010

Какой алгоритм обычно используется при реализации средства проверки орфографии, сопровождаемого предложениями слов?

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

Как это обычно делается?

Ответы [ 5 ]

194 голосов
/ 19 февраля 2010

Есть хорошее сочинение Питера Норвиг , как реализовать корректор правописания. Это в основном метод грубой силы, пытающийся использовать строки-кандидаты с заданным расстоянием редактирования. ( Здесь - несколько советов, как можно улучшить производительность корректора орфографии с помощью Bloom Filter и более быстрого хеширования кандидата .)

Требования для проверки орфографии слабее. Надо только узнать, что слова нет в словаре. Вы можете использовать Bloom Filter для создания проверки орфографии, которая потребляет меньше памяти. Древние версии описаны в Programming Pearls Джоном Бентли с использованием 64 КБ для словаря английского языка.

A BK-Tree - альтернативный подход. Хорошая статья здесь 1020 *.

Расстояние Левенштайна не совсем правильное расстояние редактирования для проверки орфографии. Он знает только вставку, удаление и замену. Транспозиция отсутствует и выдает 2 для транспозиции 1 символа (это 1 удаление и 1 вставка). Расстояние Дамерау – Левенштейна - правильное расстояние редактирования.

17 голосов
/ 18 декабря 2013

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

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

Например, распространенной ошибкой является использование неправильного гласного, например определенное вместо определенное . Таким образом, вы разрабатываете хеш-функцию, которая обрабатывает все гласные как одну и ту же букву. Самый простой способ сделать это - сначала «нормализовать» входное слово, а затем поместить нормализованный результат через обычную хеш-функцию. В этом примере нормализующая функция может сбрасывать все гласные, поэтому definite становится dfnt. Затем «нормализованное» слово хешируется с помощью типичной хеш-функции.

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

Теперь, когда вы найдете слово с орфографической ошибкой, вы просматриваете списки столкновений для корзины, на которую отображается орфографическая ошибка, во вспомогательных индексах. Та да: У вас есть список предложений! Все, что вам нужно сделать, это оценить слова на нем.

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

Так что теперь вы просматриваете орфографические ошибки в каждом из вспомогательных индексов и объединяете списки столкновений перед ранжированием.

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

Обновление : с тех пор я нашел одно описание алгоритма, похожее на это, FAROO Distributed Search . Это все еще поиск с ограниченным расстоянием редактирования, но он очень быстрый, потому что этап предварительного вычисления работает как моя идея «плохих хэш-функций». FAROO просто использует ограниченную концепцию плохой хеш-функции.

6 голосов
/ 11 февраля 2017

Алгоритм

  1. Примите неверно написанное слово в качестве ввода.
  2. Сохранение списка английских слов вместе с их частотами в текстовом файле.
  3. Вставьте все доступные английские слова (сохраненные в текстовом файле) вместе с их частотами (мера того, как часто слово используется в английском языке) в дереве троичного поиска.
  4. Теперь пройдите вдоль дерева троичного поиска -
    • Для каждого слова, встречающегося в дереве троичного поиска, вычислите его расстояние Левенштейна от неправильно написанного слова.
    • Если расстояние Левенштейна <= 3, сохраните слово в очереди приоритетов. </li>
    • Если два слова имеют одинаковое расстояние редактирования, то слово с более высокой частотой терется. Распечатайте 10 лучших элементов из очереди с приоритетами.

Оптимизация

  1. Вы можете уничтожить слова в поддереве текущего узла, если расстояние редактирования подстроки входного слова из текущего слова больше, чем 3. <Ч /> Более подробное объяснение и исходный код вы можете найти в github project .
3 голосов
/ 19 февраля 2010

Вам не нужно знать точное расстояние редактирования для каждого слова в словаре.Вы можете остановить алгоритм после достижения предельного значения и исключить слово.Это сэкономит вам много вычислительного времени.

1 голос
/ 25 октября 2011

Проверка орфографии очень проста в реализации, как в программе заклинаний Unix. Исходный код доступен в открытом доступе. Исправление может быть связано, один метод заключается в том, чтобы внести изменения и снова проверить, есть ли это новое слово в словаре. Такие новые правки могут быть сгруппированы и показаны пользователю.

Система Unix использует программу, написанную Mc IllRoy. Альтернативный способ - использовать Trie, который может быть полезен в случае больших файлов.

Подход Unix требует очень меньше места для огромного словаря, так как он использует алгоритм разброса хэша.

...