Как работают программы проверки правописания?
Мне нужно реализовать проверку орфографии в C. В основном мне нужны все стандартные операции... Мне нужно иметь возможность проверять орфографию блока текста, предлагать слова и динамически добавлять новые слова в индекс.
Я бы хотел написать это сам, хотя я действительно не знаю, с чего начать.
7 ответов
Читайте о дерева обхода. Основная концепция заключается в следующем:
- Считать файл словаря в память (этот файл содержит полный список правильно написанных слов, которые возможны / являются общими для данного языка). Вы можете скачать бесплатные словарные файлы онлайн. Один пример на java.sun.com
- Разобрать этот файл словаря в дерево поиска, чтобы сделать фактический текстовый поиск максимально эффективным. Я не буду описывать все грязные детали этого типа древовидной структуры, но дерево будет состоять из узлов, которые имеют (до) 26 ссылок на дочерние узлы (по одной на каждую букву), а также флаг, указывающий, является ли более влажным или нет текущий узел является концом допустимого слова.
- Переберите все слова в вашем документе и сравните каждое из них с деревом поиска. Если вы достигнете узла в дереве, где следующая буква в слове не является допустимым дочерним элементом текущего узла, слово отсутствует в словаре. Кроме того, если вы достигли конца своего слова, и флаг "действительный конец слова" не установлен на этом узле, слово отсутствует в словаре.
- Если слово не найдено в словаре, сообщите об этом пользователю. На этом этапе вы также можете предложить альтернативные варианты написания, но это немного сложнее. Вам придется пройтись по каждому символу в слове, подставляя альтернативные символы, и проверять каждый из них на соответствие дереву поиска. Вероятно, существуют более эффективные алгоритмы поиска рекомендуемых слов, но я не знаю, что это такое.
Действительно короткий пример:
Толковый словарь:
апекс яблоко назначить назначен
Дерево: (*
указывает на действительный конец слова) обновление: спасибо Курту Сэмпсону за указание на то, что эта структура данных называется деревом Патрисии
A -> P -> E -> X*
\\-> P -> L -> E*
\\-> O -> I -> N -> T* -> E -> D*
Документ:
яблоко аппет апе
Результаты:
- "яблоко" будет найдено в дереве, поэтому оно считается правильным.
- Приложение будет помечено как неправильное. Пройдя по дереву, вы будете следовать
A -> P -> P
, но второйP
не имеетI
дочерний узел, поэтому поиск не выполняется. - "Обезьяна" также потерпит неудачу, так как
E
узел вA -> P -> E
не установлен флаг "действительный конец слова".
редактировать: для получения более подробной информации о предложениях правописания, посмотрите на расстояние Левенштейна, которое измеряет наименьшее количество изменений, которые должны быть сделаны, чтобы преобразовать одну строку в другую. Лучшими предложениями будут слова из словаря с наименьшим расстоянием Левенштейна до неправильно написанного слова.
Поскольку вы не знаете, с чего начать, я бы предложил использовать существующее решение. См. Например, Aspell (GLPL лицензируется). Если вам действительно нужно реализовать это самостоятельно, расскажите, пожалуйста, почему.
Надо смотреть на префиксы и суффиксы.
внезапно = внезапно + ля.
удалив ly's вы можете хранить только корневое слово.
Аналогично preallocate = pre + allocate.
И с любовью = love + ing + ly становится немного сложнее, так как вызываются английские правила для ing.
Существует также возможность использования некоторой хэш-функции для отображения корневого слова в конкретный бит - это большая битовая карта, как метод постоянного времени для определения правильности написания корневого слова.
Вы можете сделать еще более сложным, пытаясь предоставить альтернативный список возможных правильных написаний для слова с ошибкой. Вы можете исследовать алгоритм Soundex, чтобы получить некоторые идеи.
Я бы посоветовал прототипирование с небольшим набором слов. Сделайте много тестов, затем увеличьте масштаб. Это замечательная образовательная проблема.
E Джеймс дает отличный ответ о том, как сказать, является ли слово действительным. Вероятно, от проверки орфографии зависит, как они определяют возможные орфографические ошибки.
Один из таких методов, который я бы использовал, - это сходство строк Левенштейна, которое определяет, сколько букв нужно добавить, удалить или поменять местами в слове, чтобы составить другое слово.
Если вы говорите, пишется: Страна как Контри. Сходство строк Левенштейна будет равно 1, так как вам нужно всего лишь добавить 1 букву, чтобы преобразовать страну в страну.
Затем вы можете просмотреть все возможные правильные варианты написания слов (только 171 000 английских слов и 3000 из них составляют 95% текста). Определите те, у кого наименьшее значение сходства строк Левенштейна, а затем верните верхние X слов, которые наиболее похожи на слово с ошибкой.
Существует отличный пакет на языке Python Fuzzy Wuzzy, который эффективно реализует это и генерирует% сходство между двумя словами или предложениями на основе этой формулы.
Хорошей отправной точкой может быть проверка орфографии Open Office Hunspell. Вот домашняя страница: http://hunspell.sourceforge.net/
Разделение слова на корень и суффикс известно как "Алгоритм Stemming Портера", это хороший способ вписать английского словарей в удивительно малую память.
Это также полезно для поиска, так что "проверка орфографии" также найдет "проверку орфографии" и "проверку орфографии"
Я сделал это в классе
Вы должны рассмотреть Python Natural Language Toolkit NLTK, который специально создан для этого.
Это также позволяет создавать текстовые интерпретаторы, такие как чат-боты