Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проверка орфографии


Автор: Hiori 2.4.2019, 07:18
Проверку орфографии я уже сделала. Для этого при нажатии клавиши, если последний символ входит в заранее заданный массив разделителей
Код

Separators = [' ', '.', ',', '?', ':', ';', '(', ')', '/', '\', '!', '-', '—', '–',  '…', 
'''', '"', '<', '>', '*', '%', '«', '»', '[', ']', #0, #$D, #$A];

Выхватываю слово под курсором, потом отсекаю разделительные знаки, после чего ищу слово в словаре. Ну помимо этого убираю из слова символ #769 (ударение), перевожу в нижний регистр и т.п. Словарь организован потомком от TStringList, в котором добавлен некий хэш для каждой строки (D7 поэтому такие извращения).
С самой проверкой у меня особых проблем не возникло.

Вопрос.
Кто-нибудь может подсказать хотя бы примерный алгоритм поиска вариантов при ошибке? Поясню. Я подразумеваю, что введено, например, слово "Ножык" и мне каким-то образом нужно подобрать к нему правильный вариант "ножик". Так же для "офрум" должен быть вариант "форум".

Автор: Snowy 2.4.2019, 13:33
Теория: https://habr.com/ru/post/114997/
Пример реализации: http://wiki.freepascal.org/Levenshtein_distance
Готовая реализация на delphi: http://gausi.de/approxstrutils-en.html

Автор: Hiori 2.4.2019, 16:17
спасибо, то что нужно

Автор: Hiori 4.4.2019, 07:28
Более или менее разобралась с нечётким поиском, ещё раз спасибо. Вобщем всё работает как надо.
Теперь возник закономерный вопрос, возможно ли как-то оптимизировать его? При том, что словарь содержит более 2.5 миллионов слов поиск затягивается на 6-15 секунд. Мне будет достаточно стройной идеи в какую сторону смотреть, потому что у меня совершенно нет вариантов.

Автор: Snowy 4.4.2019, 16:09
1. Словарь на 2.5 миллиона слов? Например, в словаре Open Office менее 150 000 слов. Зачем столько?
2. Список можно распараллелить на несколько потоков. Например поделить на 4 части и обрабатывать каждую в своём потоке
3. Список можно пополнять по мере обработки - добавлять варианты по мере обнаружения
4. Можно разбить на приоритеты. Например обработать сначала слова, которые начинаются на ту же букву. В большинстве случаев ошибка редко бывает в первой букве, так что первые результаты можно будет получить уже в течении первой секунды. Затем обработать слова, с такой же длиной +-1, добавить в список их. Ошибка в большее количество уже вряд ли подойдёт.
5. можно попробовать сократить словарь до словоформ. Например, обрезая суффиксы, окончания, приставки. Например син = синий, синим, синька, синенький. Но не синус. Ибо обратно добавлением окончания не восстанавливается. Но это уже более сложно. 

Автор: Hiori 4.4.2019, 21:46
ну я сама пока пришла только к тому, чтобы вырезать корни и их оставить в словаре, чтобы сократить словарь за счёт этого, но это надо тщательно обдумать, а так много как раз за счёт вариантов слов, плюс наиболее часто используемые аббревиатуры

Автор: Akella 18.7.2019, 14:03
Сторонние компоненты не годятся?
Например http://www.addictivesoftware.com/addict.htm#spelling

Автор: Hiori 19.7.2019, 08:31
ещё и как годятся, спасибо большое

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)