Алгоритм проверки орфографии
В голову начали закрадываться мысли о поиске в слове стандартных морфем в нужных частях слова, определении по ним части речи и работе с этими морфемами по правилам(напоминаю, что словарные слова не рассматриваются, а значит кровать, вокзал - глаголы. и т.п.) Но конкретных алгоритмов пока не видится.
Так вот, товарищи, прошу помощи! Может у кого нибудь есть дельные идеи, или может кто знает об этом алгоритме-трех-букв.
http://www.codenet.ru/webmast/search/Morphology-Russian.php
Но совсем без словарной базы никак не обойтись.
Разве что можно поступить так: считаем ошибкой такую комбинацию букв, которая никак не может быть в слове. Например, ъ, ъ или ы в начале слова; подряд более двух одинаковых букв; и т. п. Думаю, именно это и называется алгоритмом трёх букв.
Алгоритм-трех-букв мне был описан как: "Слово разбивается по три буквы, то есть император => имп|ера|тор и с этими частями что-то делается"
Цитата: koodeer
.....подряд более двух одинаковых букв.......
Длинношеее, змееед.
Мне кажется, что имеются в виду правила вроде жы шы, чя щя и т.д
1) берем словарную базу (это подготовка данных для алогоритма а не часть его) и на ее основе строим мн-во всевозможных допустимых 3-буквенных сочетаний, напр. "правило" дает [color=blue]пра, рав, ави, вил, ило[/color] -- и так со всеми словами
2) после того как составлен набор всех сочетаний по 3 буквы можно проверять слова: тестируемое слово точно так же разбивается на тройки и если очередная тройка не находится в нашем наборе то ошибка. Пример "прывило" → [color=red]пры, рыв, ыви,[/color][color=blue] вил, ило[/color] (для набора в предыдущем примере)
Мне кажется, что ближе всех к истине все-таки P*t*, речь ведь идет о нахождении не опечаток, как это делает Word, а именно орфографических ошибок. Я бы взял основные правила русского правописания и строил алгоритм на их основе, их не так много, по большому счету. Да и словарная база действительно тут не нужна оказывается.
по-моему некоторые правила русского правописания сильно зависят от разнык характеристик слова (род, часть речи, тип склонения и тд) а это можно определить только по словарю
Как по мне можно построить конечный автомат. И плясать от этого..
1. Проверяем ввод на униерсальные правила(как то сказали koodeer, P*t* - "сделаннный", "ъкология", "чюкотка")
2. Сканим слово с конца, на предмет начичия стандартных морфем(создать базу из них, в том числе и морфемы со стандртными ошибками), определяем чать речи. К примеру: слово "серебрянный" - видим в конце "ый" - либо приагательное, либо причастие. Сканим дальше, видим суффикс "янн". В то же время этот суффикс является ошибочным, согласно правилу, правильный суффикс "ян" - нашли ошибку.[SIZE="1"]*[/SIZE]
Так же искать и стандарные приставки и прочие морфемы, и, опираясь на правила, определять свойтва слова(вид, склонение и т.п.)
[SIZE="1"]*Пример, конечно, не идеален, но примерую суть отражает[/SIZE]
Соответственно, если допущена ошибка, на которую правила не ориентированы("серебрянцй") - алгоритм не сработает, но такие случаи без словарной базы не обработать, ибо это можно представить как самодостаточное слово, но, как я понял, это и не требуется.
как-то так пока думается..
Цитата: Lone Wolf
Как по мне можно построить конечный автомат. И плясать от этого..
каким образом?
Почитайте про них. постройте правила перехода.
Цитата: LM(AL/M)
может как то так:
1) берем словарную базу (это подготовка данных для алогоритма а не часть его) и на ее основе строим мн-во всевозможных допустимых 3-буквенных сочетаний, напр. "правило" дает [color=blue]пра, рав, ави, вил, ило[/color] -- и так со всеми словами
2) после того как составлен набор всех сочетаний по 3 буквы можно проверять слова: тестируемое слово точно так же разбивается на тройки и если очередная тройка не находится в нашем наборе то ошибка. Пример "прывило" → [color=red]пры, рыв, ыви,[/color][color=blue] вил, ило[/color] (для набора в предыдущем примере)
1) берем словарную базу (это подготовка данных для алогоритма а не часть его) и на ее основе строим мн-во всевозможных допустимых 3-буквенных сочетаний, напр. "правило" дает [color=blue]пра, рав, ави, вил, ило[/color] -- и так со всеми словами
2) после того как составлен набор всех сочетаний по 3 буквы можно проверять слова: тестируемое слово точно так же разбивается на тройки и если очередная тройка не находится в нашем наборе то ошибка. Пример "прывило" → [color=red]пры, рыв, ыви,[/color][color=blue] вил, ило[/color] (для набора в предыдущем примере)
Кстати, очень и очень похоже на истину! Если позарез нужно реализовать алгоритм трёх букв, то это подходит.
Естественно, ни один естественный язык нельзя проверить набором простых правил, всегда будет куча исключений. Но на крайний случай сойдёт.
Забавно что никто похоже не вспомнил про расстояние Левенштейна и Дамерау-Левенштейна. Классика спеллчекеров.
Цитата: Zorkus
Забавно что никто похоже не вспомнил про расстояние Левенштейна и Дамерау-Левенштейна. Классика спеллчекеров.
К этим же методам вдогонку ещё следующие: Расстояние Хемминга, Коэффициент Дайса, Коэффициент и расстояние Джаккарда (Jaccard),
Цитата: UAS
К этим же методам вдогонку ещё следующие: Расстояние Хемминга, Коэффициент Дайса, Коэффициент и расстояние Джаккарда (Jaccard),
Да, полезный методы. А еще полнее тут - http://en.wikipedia.org/wiki/String_metric.