![]() |
проверка орфографии
Всем привет! Хочу собрать "на коленке" программу для проверки орфографии русского языка. Пока что склоняюсь к нечёткому поиску по словарю. Формулирую как 2 задачи:
1. Дан набор слов русского языка и текст, который следует проверить. Требуется написать список неправильных слов и предложить до 10 вариантов исправления. 2. Дана строка запроса и текст. Требуется написать список до 20 строк из текста, которые чем-то похожи на строку запроса. Хотелось бы быстрый, но несложный алгоритм. Кто что может подсказать? |
Цитата:
Я думаю вам стоит начать писать программу для проверки орфографии по словарю и если будут вопросы задавать их здесь. |
Вот неплохой обзорчик: http://habrahabr.ru/post/114997/
И еще алогоритм Ландау-Вишкина: http://algolist.ru/search/fsearch/index.php |
возможно есть смысл подумать о использовании свойств русского языка. скажем придумать как выделять в слове корень и искать в словаре корни слов, а по найденому корню проверять допустимое словообразование от этого корня. тут правда есть загвоздка - слова с 2-мя корнями. вообще русский язык слишком сложный чтобы влоб его так делать, английский бы прокатил влегкую.
незнаю нормальная ли идея, но стоит проверить. так мы просто создадим гиперсловарь (а-ля гипертекст) и ясное дело верхушка намного меньше чем полное содержание словаря и ищется там быстрее, вопрос в том компенсирует ли время, затраченное на разбор текста по корням и т.п. можно сделать так - есть очень большой словарь исключительно правильных слов и делается предположение, что допустить с неким нелинейным % относительно длинны слов ошибок реально, и если в словаре нет написанного слова - то показывать все возможные, отличающиеся на это число букв. но опять же - все эти наборы будут как у англичанина с русским словарем - слова те, но связи между ними просто 0. |
Tonny_Bennet,
Делаем шаг первый: тупо проверяем правильность слова, но не предлагаем варианты. словарь взят отсюда: http://files.speakrus.ru/dict/pldf-win.zip проверяем фрагмент книги братьев Стругацких "Обитаемый остров". Цитата:
Код:
#include <hash_map> Код:
spell: ладошек Beyound, судя по "ошибкам", которые выдаёт программа на основании словаря из 120К слов, двигаться нужно в твоём направлении. Типа метод триграмм, только разбивать по частям слова. Но тогда нужно добавлять ограничение на применимость частей слова друг к другу? |
Цитата:
Других альтернатив для подобных целей не имеется? |
|
Цитата:
|
yurfed, к сожалению, не понял суть ваших советов.
ferget, а есть ссылка на теорию, а не реализацию? |
После нескольких итераций чтения предложенных ссылок до меня допёрло, как сделать. Получилось вот что (расстояние Левенштейна):
Код:
spell: ладошек |
Используя ограничение на длину слова (удалили не больше 2-х и добавили не больше 2-х букв) получается увеличить скорость в 2 раза, сохранив результаты.
Код:
spell: ладошек Если символы на одинаковых позициях на клавиатуре расположены дальше круга радиусом 1 клавиши, добавляем штраф +3: Код:
indexed 162163 words |
пробуем другие варианты: у меня с орфографией в принципе нормально, но есть опечатки:
1. нажатие вместо рядом находящейся клавиши 2. набор части слова в другом прядке (иногда пальцы срабатывают в обратной последовательности. Обычно пара букв, но изредка до 4-х) 3. пропуск буквы 4. лишняя буква из окрестности клавиши Решение: будем сравнивать так: растянем слово №1 и №2 на одну и ту же длину. Если в некоторой окрестности буквы из слова 1 оказалась такая же буква из слова 2, значит добавляем штраф, равный расстоянию между буквами обоих слов на растянутом отрезке. Таким образом не требуется матрица как в методе Левенштейна, а нужен только проход по диагонали матрицы. Если буквы в окрестности не найдено, то добавляем второй штраф - расстояние между символами на клавиатуре. Код:
ё й ц у к е н г ш щ з х ъ знакомые буквы + раскладка Код:
indexed 162163 words Код:
indexed 162163 words |
Время: 03:49. |
Время: 03:49.
© OSzone.net 2001-