Правила переноса слов ⇐ В мире компьютеров
Модератор: Роксана
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Правила переноса слов
Всем здравствуйте.
Я начинающий программист и столкнулся с задачей вывода текста в окне шириной не более N символов. Стало интересно, поискал, для освежения в памяти русского языка, в интернете правила переноса слов и за выходные накропал программу. Чтение результирующего текста выявило, что найденных правил недостаточно.
Ниже выкладываю сомнительные результаты (т. е. может где-то перенос и правильный).
бу-нтовщикам, ст-рого, домы-слы, четы-рехклассникам, отлича-лся, дво-йками, чувст-вуя, безмятеж-но, преду-предил, трехкопее-чную, после-дний, вд-руг, радо-сть, тве-рдо, ца-рской, сло-вно, безлю-дно, служа-нка, во-зможности, уди-вляться, во-збуждали, ус-коренным, дире-ктор(ом), дире-кции, прио-ткрытой, тра-мваи, гардеро-бной, завсе-гдатаев, усе-рдием, переговаривавши-хся, польс-кой, возмо-жности, безусло-вного, семи-шника, убеди-лся, предс-тавляете, возбу-ждали, начинае-тся, вс-помнил.
Руча-юсь, неча-янно, влияни-ем, - так не перенесла, перенесла левее: ру-чаюсь, не-чаянно, влия-нием.
Полученные результаты подчиняются правилам, написанным ниже. Какие правила я не учел при составлении программы?
Правила работы программы:
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить". Слово не переносится, если в нем найден не буквенный символ.
2. Крайние символы самостоятельно не переносятся.
3. Можно переносить:
- гласная - согласная;
- согласная ("ъ" или "ь") - гласная;
- согласная - согласная (если правая согласная не "ъ" или "ь";
- гласная, затем "й" - гласная;
- гласная - гласная (если левая гласная - это окончание приставки "при", "пре" или "про");
4. Нельзя переносить (проверяется, для каждой найденной точки переноса по правилам п.3.)
- если правее, правой согласной буквы, стоит "ь";
- если слева или справа две одинаковых согласных;
А может и ещё есть какие-то правила переноса, которые просто не встретились при обработке текста?
Добавлено спустя 2 минуты 6 секунд:
Что - то тема раздвоилась? Я нажимал кнопку "Отправить" один раз.
Я начинающий программист и столкнулся с задачей вывода текста в окне шириной не более N символов. Стало интересно, поискал, для освежения в памяти русского языка, в интернете правила переноса слов и за выходные накропал программу. Чтение результирующего текста выявило, что найденных правил недостаточно.
Ниже выкладываю сомнительные результаты (т. е. может где-то перенос и правильный).
бу-нтовщикам, ст-рого, домы-слы, четы-рехклассникам, отлича-лся, дво-йками, чувст-вуя, безмятеж-но, преду-предил, трехкопее-чную, после-дний, вд-руг, радо-сть, тве-рдо, ца-рской, сло-вно, безлю-дно, служа-нка, во-зможности, уди-вляться, во-збуждали, ус-коренным, дире-ктор(ом), дире-кции, прио-ткрытой, тра-мваи, гардеро-бной, завсе-гдатаев, усе-рдием, переговаривавши-хся, польс-кой, возмо-жности, безусло-вного, семи-шника, убеди-лся, предс-тавляете, возбу-ждали, начинае-тся, вс-помнил.
Руча-юсь, неча-янно, влияни-ем, - так не перенесла, перенесла левее: ру-чаюсь, не-чаянно, влия-нием.
Полученные результаты подчиняются правилам, написанным ниже. Какие правила я не учел при составлении программы?
Правила работы программы:
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить". Слово не переносится, если в нем найден не буквенный символ.
2. Крайние символы самостоятельно не переносятся.
3. Можно переносить:
- гласная - согласная;
- согласная ("ъ" или "ь") - гласная;
- согласная - согласная (если правая согласная не "ъ" или "ь";
- гласная, затем "й" - гласная;
- гласная - гласная (если левая гласная - это окончание приставки "при", "пре" или "про");
4. Нельзя переносить (проверяется, для каждой найденной точки переноса по правилам п.3.)
- если правее, правой согласной буквы, стоит "ь";
- если слева или справа две одинаковых согласных;
А может и ещё есть какие-то правила переноса, которые просто не встретились при обработке текста?
Добавлено спустя 2 минуты 6 секунд:
Что - то тема раздвоилась? Я нажимал кнопку "Отправить" один раз.
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- -
- Всего сообщений: 3779
- Зарегистрирован: 10.10.2005
- Образование: высшее гуманитарное
- Профессия: любимая
Andrey, сомнительные результаты немного подправлю, хотя, по большому счёту ошибка была лишь в слове вдруг (в нём один слог, и слово на слоги не делится и не переносится), остальные варианты допускаются.
Не все слова стала корректировать, некоторые (последние в абзаце) оставила без изменений.Andrey:бун - тов-щи-кам, стро-го, до-мыс - лы, четы-рехклассникам, отличал - ся, двой -ками, чувст-вуя, безмятеж-но, преду-предил, трехкопе - ечную, послед -ний, вдруг, ра - дость, твер-до, цар -ской, слов-но, безлюд-но, служан-ка, воз-можности, уди-вляться, во-збуждали, ус-коренным, дире-ктор(ом), дире-кции, прио-ткрытой, тра-мваи, гардеро-бной, завсе-гдатаев, усе-рдием, переговаривавши-хся, польс-кой, возмо-жности, безусло-вного, семи-шника, убеди-лся, предс-тавляете, возбу-ждали, начинае-тся, вс-помнил.
"Мы с тобой одной крови: ты и я!" Я верю в нас. Но если сомневаешься, не выбирай меня.
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Спасибо за отзыв, но вы меня не правильно поняли.
Мне нужно для слов, которые перенесены не правильно, объяснение почему данный, конкретный перенос, который стоит в слове перечня слов, не правильный.
То, что надо перенести слово бунтовщикам - бун-товщикам, я понимаю. Программа так - бы и перенесла, но из данного слова оказалось на границе 3 символа "бун", и, т. к. надо оставить еще место под дефис, остается бу-..., что согласуется с моим перечнем правил. Вот если - бы ввести еще правило, которое бы указало, что бу-... переносить нельзя, то перенос слова "бунтовщиками", с границей "бун|товщиками" оказался бы запрещен и слово целиком перенеслось на следующую строку.
В других словах, более длинных слева от границы, был бы (должен быть, но у меня нет формализованных правил) найден правильный перенос левее.
В трех словах, которые написаны во второй группе слов граница, с которой производился поиск места для переноса позволяла поставить правильный перенос правее, чем он был поставлен, тут наоборот надо ввести разрешающее правило.
Моя программа, хоть и переносит произвольный текст, предназначена для переносов названий, выводимых в иконки большого размера 156 на 156. Для данной задачи работает вполне приемлемо. (Например в Windows вообще нет никаких правил для переноса названий, слова просто обрезаются, там, где их встретила граница.)
Но меня этот вопрос заинтересовал, сижу ищу в интернете (пока безрезультатно).
Добавлено спустя 15 минут 5 секунд:
Извините, не внимательно сразу прочитал ответ. Отвлекло цитирование перечня слов с исправлениями и первое слово "бунтовщикам" с кучей переносов.
Если все такие переносы разрешены (а было протестировано слов в несколько раз больше, чем "сомнительные результаты"), получается, что программа работает на 95% правильно и я зря начал беспокоиться по этому поводу.
Для полного счастья осталось найти словарь слов из одного слога.

Добавлено спустя 7 минут 55 секунд:
Ради интереса понаблюдаю, как нибудь, попутно, как переносит слова "MS Word".
Мне нужно для слов, которые перенесены не правильно, объяснение почему данный, конкретный перенос, который стоит в слове перечня слов, не правильный.
То, что надо перенести слово бунтовщикам - бун-товщикам, я понимаю. Программа так - бы и перенесла, но из данного слова оказалось на границе 3 символа "бун", и, т. к. надо оставить еще место под дефис, остается бу-..., что согласуется с моим перечнем правил. Вот если - бы ввести еще правило, которое бы указало, что бу-... переносить нельзя, то перенос слова "бунтовщиками", с границей "бун|товщиками" оказался бы запрещен и слово целиком перенеслось на следующую строку.
В других словах, более длинных слева от границы, был бы (должен быть, но у меня нет формализованных правил) найден правильный перенос левее.
В трех словах, которые написаны во второй группе слов граница, с которой производился поиск места для переноса позволяла поставить правильный перенос правее, чем он был поставлен, тут наоборот надо ввести разрешающее правило.
Моя программа, хоть и переносит произвольный текст, предназначена для переносов названий, выводимых в иконки большого размера 156 на 156. Для данной задачи работает вполне приемлемо. (Например в Windows вообще нет никаких правил для переноса названий, слова просто обрезаются, там, где их встретила граница.)
Но меня этот вопрос заинтересовал, сижу ищу в интернете (пока безрезультатно).
Добавлено спустя 15 минут 5 секунд:
Извините, не внимательно сразу прочитал ответ. Отвлекло цитирование перечня слов с исправлениями и первое слово "бунтовщикам" с кучей переносов.
Если все такие переносы разрешены (а было протестировано слов в несколько раз больше, чем "сомнительные результаты"), получается, что программа работает на 95% правильно и я зря начал беспокоиться по этому поводу.

Для полного счастья осталось найти словарь слов из одного слога.

Добавлено спустя 7 минут 55 секунд:
Ради интереса понаблюдаю, как нибудь, попутно, как переносит слова "MS Word".
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- -
- Всего сообщений: 3779
- Зарегистрирован: 10.10.2005
- Образование: высшее гуманитарное
- Профессия: любимая
Andrey,
чтобы программа работала абсолютно точно, она должна отличать гласный от согласного и видеть, где рядом несколько согласных. Просто обычно при делении слова на слоги играет роль "закрытость" слогов (на стыке согласных - одна из них остаётся - другая "уходит") и наличие гласной в слоге (без неё слог не существует).
Я не знаю, насколько это реально.
Неточно написала я:
Упустила ли я что-то? ИЛи что-то снова не уловила?
Добавлено спустя 2 минуты 38 секунд:
Вообще, может быть, компьютерно-языковые специалисты что-нибудь подскажут, если сюда придут.
чтобы программа работала абсолютно точно, она должна отличать гласный от согласного и видеть, где рядом несколько согласных. Просто обычно при делении слова на слоги играет роль "закрытость" слогов (на стыке согласных - одна из них остаётся - другая "уходит") и наличие гласной в слоге (без неё слог не существует).
Я не знаю, насколько это реально.
Неточно написала я:
согласные не могут быть отдельно от гласных. Имею в виду, что есть ещё слова с ошибками: Стро-го, вспом-нил, вдруг.Елена: ошибка была лишь в слове вдруг
Упустила ли я что-то? ИЛи что-то снова не уловила?
Добавлено спустя 2 минуты 38 секунд:
Вообще, может быть, компьютерно-языковые специалисты что-нибудь подскажут, если сюда придут.
"Мы с тобой одной крови: ты и я!" Я верю в нас. Но если сомневаешься, не выбирай меня.
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Вполне реально, именно так и работает (уже) программа!Елена:Andrey,
чтобы программа работала абсолютно точно, она должна отличать гласный от согласного и видеть, где рядом несколько согласных. Просто обычно при делении слова на слоги играет роль "закрытость" слогов (на стыке согласных - одна из них остаётся - другая "уходит") и наличие гласной в слоге (без неё слог не существует).
Я не знаю, насколько это реально.
Вы то же не внимательно читали сообщения. Повторю кусочек из первого сообщения.
-------Программа использует следующие правила-------------
Можно переносить:
- гласная - согласная;
- согласная ("ъ" или "ь") - гласная;
- согласная - согласная (если правая согласная не "ъ" или "ь";
- гласная, затем "й" - гласная;
- гласная - гласная (если левая гласная - это окончание приставки "при", "пре" или "про");
Нельзя переносить:
- если правее, правой согласной буквы, стоит "ь";
- если слева или справа две одинаковых согласных;
-------------------------------------------------------------------------
Эти правила можно дополнить, что я и хочу сделать.
Но, кроме них, я, к сожалению, пока ничего нового не нашел, кроме правила: "не переносится слово из одного слога". На которое, в том числе и вы обратили мое внимание.
------------------------------------------------------------------------
Поясню, что значит "правая", "левая", "правее" и т. п.
Программе передается слово с указанием места, с которого надо найти место переноса, например: пролет|арий, здесь левая буква - "т", левее - "е", правая - "а".
Можно, при необходимости анализировать любые куски слова.
Т. к. пролет-арий перенести нельзя, то анализируется место слова левее, т. е.проле|тарий, и так до тех пор, пока не будет найдено место, где подойдет к. л. правило переноса и не будет ни одного запрета, т. е. ответ программы: проле-тарий.
Если программе передали все слово, пролетарий|, то правильный ответ должен быть пролета-рий.
Если передали пр|олетарий, то правильный ответ будет - "нельзя перенести" и все слово уйдет на новую строку.
--------------------------
Уф.
Добавлено спустя 7 минут 42 секунды:
Вот и правило:Елена:Просто обычно при делении слова на слоги играет роль "закрытость" слогов (на стыке согласных - одна из них остаётся - другая "уходит") и наличие гласной в слоге (без неё слог не существует).
"слово (целиком) в котором только одна гласная нельзя переносить".
Утверждаете скрижаль помощника писаря с высот мастера слова ?

Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- -
- Всего сообщений: 3779
- Зарегистрирован: 10.10.2005
- Образование: высшее гуманитарное
- Профессия: любимая
Нет, что Вы.... Просто написалаAndrey:Утверждаете скрижаль помощника писаря с высот мастера слова ?
Andrey: объяснение, почему данный, конкретный перенос, который стоит в слове перечня слов, неправильный.
не совсем соответствует тому, что при делении слова на слоги играет роль "закрытость" слогов (на стыке согласных - одна из них остаётся - другая "уходит") и наличие гласной в слоге (без неё слог не существует).Andrey:Вот и правило:
"слово (целиком) в котором только одна гласная нельзя переносить".
Сколько гласных - столько может быть и переносов, по большому счёту.
Мне-то кажется, что Ваша программа и так довольно точна. Добиться по этому вопросу ещё более точной работы программы (больше 95%), наверное, сложно.
-
- заслуженный писатель форума
- Всего сообщений: 454
- Зарегистрирован: 21.11.2005
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Спасибо.
Совсем обобщив, получается одно, более широкое, запрещающее правило.
Правда сформулировал как разрешающее.
"Перенос разрешен, если и слева и справа от предполагаемого места переноса есть гласная буква".
"Тему не закрываю".
Совсем обобщив, получается одно, более широкое, запрещающее правило.
Правда сформулировал как разрешающее.
"Перенос разрешен, если и слева и справа от предполагаемого места переноса есть гласная буква".
"Тему не закрываю".

Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- заслуженный писатель форума
- Всего сообщений: 323
- Зарегистрирован: 01.07.2007
- Откуда: Москва
Надо ещё подумать, но сдаётся, что,Andrey:"Перенос разрешен, если и слева и справа от предполагаемого места переноса есть гласная буква
если перенос попадает между гласной и согласной, а в соседней позиции справа или слева есть его положение между двумя согласными (при сохранении процитированного правила), то именно это положение - истинно.
Не ли-стья, а лис-тья.
Не ки-рпич, а кир-пич.
На первый взгляд выглядит верно.

-
- поэт-прозаик
- Всего сообщений: 235
- Зарегистрирован: 22.08.2007
- Откуда: Финляндия, Espoo
- Контактная информация:
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Спасибо за отклики.
Я тоже продвинулся в своем вопросе.
Сейчас программа работает практически без ошибок, вечером выложу, как этого достиг, но еще есть вопросы улучшения алгоритма.
Добавлено спустя 2 минуты 23 секунды:

Я тоже продвинулся в своем вопросе.
Сейчас программа работает практически без ошибок, вечером выложу, как этого достиг, но еще есть вопросы улучшения алгоритма.
Добавлено спустя 2 минуты 23 секунды:
Вы неправильно поняли - это извращенная формулировка запрета на перенос, для точки переноса найденной ранее по разрешающим правилам.Хорхе7:Andrey:"Перенос разрешен, если и слева и справа от предполагаемого места переноса есть гласная буква

Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Хотел выложить результаты и вопросы после набора некоторой статистики (совмещая полезное с приятным, т. е. чтением книг), где то через 2 - 3 месяца, но раз есть интересующиеся, что - бы им не искать то, что уже найдено.
На то, что получилось сейчас, я вышел понаблюдав как переносит WORD (и, естественно читая то, что "напереносила" моя программа) - оказалось, что WORD выполняет переносы в простых случаях (хотя утверждать не берусь, статистику не набирал).
Это натолкнуло меня на запрещающее правило - если справа от предполагаемого места переноса согласная, то следующая должна быть гласная, иначе перенос запрещен. Другими словами две согласных справа от переноса запрещено кроме некоторых случаев.
Таких случаев пока 1 - сочетание "ств" справа.
Кстати для вопроса Димы: варианты а) и в) получаются разрешенными.
Применение этого правила запрещает в некоторых случаях верные переносы, но зато резко сокращает ошибки.
Выкладываю свои правила на текущий момент:
/*
Правила работы поиска места переноса в слове:
Функция получает: слово и позицию, начиная с которой надо найти позицию правильного переноса в слове
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить".
2. Крайние символы самостоятельно не переносятся.
3. Оценивается наличие не более трех "знаков препинания" в правой стороне слова левее позиции переноса.
Для выполнения правила 2 справа.
4. Оценивается наличие не более трех "знаков препинания" в начале слова.
Для выполнения правила 2 слева.
Если слева или справа больше "знаков препинания" чем 3, то перенос этого слова не гарантирует
правильность.
-----------------------------------------------------------------------------------
Цикл (Сдвинуть место переноса левее (если слово кончилось, вернуть: "нельзя переносить" - конец функции))
5. Если найдено место переноса:
- (согласная ("ъ" или "ь") - гласная) или (гласная, затем "й" - гласная)
идём к 6.1 и последовательно ниже
- гласная - гласная (если левая гласная - это окончание приставки "при", "пре" или "про")
идём к 6.5
- гласная - согласная (если левая гласная - это окончание приставки "при", "пре" или "про")
идём к 6.5
- (гласная - согласная) или (согласная - согласная (если правая согласная не "ъ" или "ь")
идём к 6.1 и последовательно ниже
Если ничего по п.5 не подошло - перейти в начало цикла.
----------------------------------------------------------------------------------
6. Нельзя переносить (проверяется, для каждой найденной точки переноса по правилам п.5.)
6.1 - если правее, правой согласной буквы, стоит "ь";
6.2 - если слева или справа две одинаковых согласных;
6.3 - если слева или справа две одинаковых гласных;
6.4 - если правее правой согласной не гласная буква, за исключением буквосочетания "ств";
6.5 - если или слева или справа от предполагаемого места переноса нет гласной буквы (не непосредственно слева/справа, а в левой/правой части слова. Это запретит перенос слова из одного слога, например: "вдруг" или запретит например: "вд-ругой" или "упорядочи-ть".)
Если запретов не найдено вернуть позицию места переноса - конец функции.
При выполнении первого найденного запрета - перейти в начало цикла.
----------------------------------------------------------------------------------
Примечание: к "знаку препинания" относятся символы .,/()[]{}!"'№;\%:?*-+=<>
*/
К сожалению пришлось эти правила написать несколько в виде алгоритма, что - бы была видна вся картина действий.
Пока алгоритм не идеален и, в частности, хотелось бы найти ответы на следующие вопросы:
Ошибки:
спецп-рокуратурой, спецс-лужбой, предс-тавитель.
Новое правило запретило правильные переносы:
(хотя, повторяюсь, сильно сократило ошибки)
Вариант б) Димы: чувс-тво,
рас-стоянии, нер-вно, ме-ста, упу-стить, кре-стьянским, карель-ской, кон-кретного, не-много, рас-сказывал.
И вопрос стоящий с самого начала работы - как разрешить перенос гласная - гласная? В большинстве случаев это не правильный перенос, но например в нижеуказанных был - бы правильный:
кута-ясь, наде-ясь, засме-явшись, радио-обмен, вы-езжать, со-образительный, хво-инки, по-озирался, стреля-ют, Ге-оргий, специ-альной, не-обходимой, сто-яла.
Кое что уже несколько проясняется в описанных проблемах, но без набора б'ольшей статистики, я, как не специалист в вопрсах русского языка, не могу переносить в категорию "выводы".
На то, что получилось сейчас, я вышел понаблюдав как переносит WORD (и, естественно читая то, что "напереносила" моя программа) - оказалось, что WORD выполняет переносы в простых случаях (хотя утверждать не берусь, статистику не набирал).
Это натолкнуло меня на запрещающее правило - если справа от предполагаемого места переноса согласная, то следующая должна быть гласная, иначе перенос запрещен. Другими словами две согласных справа от переноса запрещено кроме некоторых случаев.
Таких случаев пока 1 - сочетание "ств" справа.
Кстати для вопроса Димы: варианты а) и в) получаются разрешенными.
Применение этого правила запрещает в некоторых случаях верные переносы, но зато резко сокращает ошибки.
Выкладываю свои правила на текущий момент:
/*
Правила работы поиска места переноса в слове:
Функция получает: слово и позицию, начиная с которой надо найти позицию правильного переноса в слове
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить".
2. Крайние символы самостоятельно не переносятся.
3. Оценивается наличие не более трех "знаков препинания" в правой стороне слова левее позиции переноса.
Для выполнения правила 2 справа.
4. Оценивается наличие не более трех "знаков препинания" в начале слова.
Для выполнения правила 2 слева.
Если слева или справа больше "знаков препинания" чем 3, то перенос этого слова не гарантирует
правильность.
-----------------------------------------------------------------------------------
Цикл (Сдвинуть место переноса левее (если слово кончилось, вернуть: "нельзя переносить" - конец функции))
5. Если найдено место переноса:
- (согласная ("ъ" или "ь") - гласная) или (гласная, затем "й" - гласная)
идём к 6.1 и последовательно ниже
- гласная - гласная (если левая гласная - это окончание приставки "при", "пре" или "про")
идём к 6.5
- гласная - согласная (если левая гласная - это окончание приставки "при", "пре" или "про")
идём к 6.5
- (гласная - согласная) или (согласная - согласная (если правая согласная не "ъ" или "ь")
идём к 6.1 и последовательно ниже
Если ничего по п.5 не подошло - перейти в начало цикла.
----------------------------------------------------------------------------------
6. Нельзя переносить (проверяется, для каждой найденной точки переноса по правилам п.5.)
6.1 - если правее, правой согласной буквы, стоит "ь";
6.2 - если слева или справа две одинаковых согласных;
6.3 - если слева или справа две одинаковых гласных;
6.4 - если правее правой согласной не гласная буква, за исключением буквосочетания "ств";
6.5 - если или слева или справа от предполагаемого места переноса нет гласной буквы (не непосредственно слева/справа, а в левой/правой части слова. Это запретит перенос слова из одного слога, например: "вдруг" или запретит например: "вд-ругой" или "упорядочи-ть".)
Если запретов не найдено вернуть позицию места переноса - конец функции.
При выполнении первого найденного запрета - перейти в начало цикла.
----------------------------------------------------------------------------------
Примечание: к "знаку препинания" относятся символы .,/()[]{}!"'№;\%:?*-+=<>
*/
К сожалению пришлось эти правила написать несколько в виде алгоритма, что - бы была видна вся картина действий.
Пока алгоритм не идеален и, в частности, хотелось бы найти ответы на следующие вопросы:
Ошибки:
спецп-рокуратурой, спецс-лужбой, предс-тавитель.
Новое правило запретило правильные переносы:
(хотя, повторяюсь, сильно сократило ошибки)
Вариант б) Димы: чувс-тво,
рас-стоянии, нер-вно, ме-ста, упу-стить, кре-стьянским, карель-ской, кон-кретного, не-много, рас-сказывал.
И вопрос стоящий с самого начала работы - как разрешить перенос гласная - гласная? В большинстве случаев это не правильный перенос, но например в нижеуказанных был - бы правильный:
кута-ясь, наде-ясь, засме-явшись, радио-обмен, вы-езжать, со-образительный, хво-инки, по-озирался, стреля-ют, Ге-оргий, специ-альной, не-обходимой, сто-яла.
Кое что уже несколько проясняется в описанных проблемах, но без набора б'ольшей статистики, я, как не специалист в вопрсах русского языка, не могу переносить в категорию "выводы".
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- заслуженный писатель форума
- Всего сообщений: 323
- Зарегистрирован: 01.07.2007
- Откуда: Москва
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Вместо двоеточия и знака вопроса влезла рожица - вот и пример курьеза в программировании. Надо отключать смайлики, но пусть будет.
Добавлено спустя 2 минуты 13 секунд:
Добавлено спустя 2 минуты 13 секунд:
Мыслите правильно - если в слове одна гласная или все гласные остались левее или правее места переноса, то это не правильный перенос.Хорхе7:Как же можно переносить, если нет гласных в обеих частях?Andrey:Вы неправильно поняли - это извращенная формулировка запрета на перенос
Вот уж теперь, действительно, не понял...
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Несколько погорячился выкладывая предыдущий большой пост и результат в виде файла.
Обнаружил ошибки, причем как в алгоритме, так и чисто программные, здесь не видимые.
Сегодня поработал, можно, как говориться поставить точку с запятой.
Что получилось выкладываю ниже.
/*
Правила работы поиска места переноса в слове:
Функция получает: слово и позицию, начиная с которой надо найти позицию правильного переноса в слове
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить".
2. Крайние символы самостоятельно не переносятся.
3. Оценивается наличие не более трех "знаков препинания" в правой стороне слова левее позиции переноса.
Для выполнения правила 2 справа.
4. Оценивается наличие не более трех "знаков препинания" в начале слова.
Для выполнения правила 2 слева.
Если слева или справа больше "знаков препинания" чем 3, то перенос этого слова не гарантирует правильность.
--------------------------------------------------------------------------------
Цикл (Сдвинуть место переноса левее (если слово кончилось, вернуть: "нельзя переносить" - конец функции))
5. Ищем место переноса:
5.1 - если (позиция переноса == 3) и (первые 4 буквы == "пред")
(здесь, предположительно, будет обращение к словарю с вопросом на запрет переноса "пред-...")
идём к 6.6 и последовательно ниже
5.2 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "при" или "про")
(здесь, предположительно будет обращение к словарю с вопросом на запрет переноса "при-...", "пре-...", "про-...")
5.2.1 если (буква 3 != "д") - перейти в начало цикла (здесь, предположительно, будет обращение к словарю с вопросом на разрешение переноса "пре-д...", "про-д...")
5.2.2 если (буква 3 != "й") - перейти в начало цикла
идём к 6.6 и последовательно ниже
5.3 - если (согласная ("ъ" или "ь") - гласная) или (гласная, затем "й" - гласная)
идём к 6.1 и последовательно ниже
5.4 - если (гласная - согласная) или (согласная - согласная (если правая согласная не "ъ" или "ь")
идём к 6.1 и последовательно ниже
Если ничего по п.5 не подошло - перейти в начало цикла.
----------------------------------------------------------------------------------
6. Нельзя переносить (проверяется, для найденной точки переноса по правилам п.5.)
6.1 - если правее, правой согласной буквы, стоит "ь";
6.2 - если правее правой согласной не гласная буква, за исключением буквосочетания "ств";
(здесь, предположительно, будет обращение к словарю с вопросом на разрешение переноса, если правее две согласных)
6.3 - если (позиция переноса == 4) и (первые 4 буквы == "пред")
6.4 - если (позиция переноса == 3) и (первые 3 буквы == "пре" или "при" или "про")
6.5 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "про") и (буква 3 == "д") (здесь, предположительно, будет обращение к словарю с вопросом на разрешение переноса "пре-д...", "про-д...")
6.6 - если слева или справа две одинаковых согласных;
6.7 - если слева или справа две одинаковых гласных;
6.8 - если или слева или справа от предполагаемого места переноса нет гласной буквы.
Если запретов не найдено вернуть позицию места переноса - конец функции.
При выполнении первого найденного запрета - перейти в начало цикла.
----------------------------------------------------------------------------------
Пояснения:
1. Может показаться, что проверка 6.5 лишняя, но дело в том, что может быть найдено место:
про-д (пре-д) по правилам п.5.4 - этот вариант надо запретить;
2. К "знаку препинания" относятся символы .,/()[]{}!"'№;\%:?*-+=<>
3. Позиции считаются начиная с нуля (количество считается как и обычно 1, 2, 3 и т. д.);
4. "перейти в начало цикла" означает, что в данной точке перенос не разрешен - проверяем сл. точку - левее;
5. Пока я упускаю правильную обработку слов написанных без пробелов через дефис, например: "Вообще-то".
*/
Добавлено спустя 7 минут 25 секунд:
Более ранние вопросы остаются в силе, к ним добавляется:
Ошибки:
пред-елах, пред-елами,
пред-упреждаю, пред-упрежден, пред-упредил, пред-упреждением, пред-упредили, пред-упредительно, пред-упредить, пред-упредила,
пред-атель, пред-ательства, пред-атели, пред-али, пред-аваться, пред-ательское,
пред-остаточно, пред-отвратить(ошибка?), пред-ыдущие,
пред-ъявить, при-нципиальности, при-нципе,
при-нтер, про-чный, про-звище, про-сьбе, про-бный,
про-нзительными, про-чности, про-шлая,
Мне кажется, хотя хотелось - бы ошибаться, что эти ошибки, написанные ранее, разрешение некоторых переносов с двумя согласными правее, разрешение некоторых переносов гласная - гласная - это уже вопросы словаря с соответствующими словами.
Пока до свидания на несколько месяцев (если не будет вопросов ко мне или комментариев).
Желающие могут ознакомиться с моей "точкой с запятой" ниже.
Обнаружил ошибки, причем как в алгоритме, так и чисто программные, здесь не видимые.
Сегодня поработал, можно, как говориться поставить точку с запятой.
Что получилось выкладываю ниже.
/*
Правила работы поиска места переноса в слове:
Функция получает: слово и позицию, начиная с которой надо найти позицию правильного переноса в слове
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить".
2. Крайние символы самостоятельно не переносятся.
3. Оценивается наличие не более трех "знаков препинания" в правой стороне слова левее позиции переноса.
Для выполнения правила 2 справа.
4. Оценивается наличие не более трех "знаков препинания" в начале слова.
Для выполнения правила 2 слева.
Если слева или справа больше "знаков препинания" чем 3, то перенос этого слова не гарантирует правильность.
--------------------------------------------------------------------------------
Цикл (Сдвинуть место переноса левее (если слово кончилось, вернуть: "нельзя переносить" - конец функции))
5. Ищем место переноса:
5.1 - если (позиция переноса == 3) и (первые 4 буквы == "пред")
(здесь, предположительно, будет обращение к словарю с вопросом на запрет переноса "пред-...")
идём к 6.6 и последовательно ниже
5.2 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "при" или "про")
(здесь, предположительно будет обращение к словарю с вопросом на запрет переноса "при-...", "пре-...", "про-...")
5.2.1 если (буква 3 != "д") - перейти в начало цикла (здесь, предположительно, будет обращение к словарю с вопросом на разрешение переноса "пре-д...", "про-д...")
5.2.2 если (буква 3 != "й") - перейти в начало цикла
идём к 6.6 и последовательно ниже
5.3 - если (согласная ("ъ" или "ь") - гласная) или (гласная, затем "й" - гласная)
идём к 6.1 и последовательно ниже
5.4 - если (гласная - согласная) или (согласная - согласная (если правая согласная не "ъ" или "ь")
идём к 6.1 и последовательно ниже
Если ничего по п.5 не подошло - перейти в начало цикла.
----------------------------------------------------------------------------------
6. Нельзя переносить (проверяется, для найденной точки переноса по правилам п.5.)
6.1 - если правее, правой согласной буквы, стоит "ь";
6.2 - если правее правой согласной не гласная буква, за исключением буквосочетания "ств";
(здесь, предположительно, будет обращение к словарю с вопросом на разрешение переноса, если правее две согласных)
6.3 - если (позиция переноса == 4) и (первые 4 буквы == "пред")
6.4 - если (позиция переноса == 3) и (первые 3 буквы == "пре" или "при" или "про")
6.5 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "про") и (буква 3 == "д") (здесь, предположительно, будет обращение к словарю с вопросом на разрешение переноса "пре-д...", "про-д...")
6.6 - если слева или справа две одинаковых согласных;
6.7 - если слева или справа две одинаковых гласных;
6.8 - если или слева или справа от предполагаемого места переноса нет гласной буквы.
Если запретов не найдено вернуть позицию места переноса - конец функции.
При выполнении первого найденного запрета - перейти в начало цикла.
----------------------------------------------------------------------------------
Пояснения:
1. Может показаться, что проверка 6.5 лишняя, но дело в том, что может быть найдено место:
про-д (пре-д) по правилам п.5.4 - этот вариант надо запретить;
2. К "знаку препинания" относятся символы .,/()[]{}!"'№;\%:?*-+=<>
3. Позиции считаются начиная с нуля (количество считается как и обычно 1, 2, 3 и т. д.);
4. "перейти в начало цикла" означает, что в данной точке перенос не разрешен - проверяем сл. точку - левее;
5. Пока я упускаю правильную обработку слов написанных без пробелов через дефис, например: "Вообще-то".
*/
Добавлено спустя 7 минут 25 секунд:
Более ранние вопросы остаются в силе, к ним добавляется:
Ошибки:
пред-елах, пред-елами,
пред-упреждаю, пред-упрежден, пред-упредил, пред-упреждением, пред-упредили, пред-упредительно, пред-упредить, пред-упредила,
пред-атель, пред-ательства, пред-атели, пред-али, пред-аваться, пред-ательское,
пред-остаточно, пред-отвратить(ошибка?), пред-ыдущие,
пред-ъявить, при-нципиальности, при-нципе,
при-нтер, про-чный, про-звище, про-сьбе, про-бный,
про-нзительными, про-чности, про-шлая,
Мне кажется, хотя хотелось - бы ошибаться, что эти ошибки, написанные ранее, разрешение некоторых переносов с двумя согласными правее, разрешение некоторых переносов гласная - гласная - это уже вопросы словаря с соответствующими словами.
Пока до свидания на несколько месяцев (если не будет вопросов ко мне или комментариев).
Желающие могут ознакомиться с моей "точкой с запятой" ниже.
-
Книги с переносами.rar
- Книги с переносами.
- (475.53 КБ) 809 скачиваний
-
Программа переноса слов.part2.rar
- Программа ч2 архива
- (430.73 КБ) 848 скачиваний
-
Программа переноса слов.part1.rar
- Программа ч1 архива
- (976.56 КБ) 1099 скачиваний
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- заслуженный писатель форума
- Всего сообщений: 323
- Зарегистрирован: 01.07.2007
- Откуда: Москва
Ну и что? Нужен вариант переноса, а не все варианты. По-моему.Дима:А как насчёт слова "чувство"
Прочёл алгоритм иочень удивлюсь, если он будет работать верно.
Не понял обращение к словарю. Это - возможно? Если так, то тогда задача перестала быть интересной. Я думал, что в том-то и соль вся - придумать общий алгоритм переноса, используя только общие нотации, правила. Выработать универсальный алгоритм. Он должен уметь перносить слово "кракозябра" etc.
А так...

-
- поэт-прозаик
- Всего сообщений: 235
- Зарегистрирован: 22.08.2007
- Откуда: Финляндия, Espoo
- Контактная информация:
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Хорхе7: А так...

Торопитесь с выводами господа.
Во первых я не представляю здесь свой труд, а пришел за советами, см. п."во вторых", плюс обобщаю и воплощаю свои мысли, наблюдения и, естественно, советы форумчан.
Во вторых, разработать такой алгоритм - задача не программиста, а специалиста в предметной области. Если будут дельные советы в дальнейшем, то с удовольствием их обобщу и воплощу.
В третьих текущий алгоритм без словаря уже правильно переносит подавляющее большинство слов, небольшую часть правильных переносов правда запрещает (но лучше немного запретить, чем делать кучу ошибок).
В четвертых словарь не должен содержать слова, как таковые, а должен содержать части слов (поясню ниже) и охватывать именно редкие случаи которые надо запретить из разрешенных или разрешить из запрещенных.
Создать программу, которая будет переносить пользуясь словарем, очень просто, НО:
оцените объем словаря со всеми вариантами переносов всех слов - раз, объем работы по созданию такого словаря - два и представьте, например Word, который (с включенной расстановкой переносов) после каждого ввода символа будет тормозить несколько секунд - расставляя переносы в абзаце - вам такой Word нужен?
Хотелось - бы не критики, а помощи (в максимальном отказе от словарей путём нахождения правил, которые будут разрешать/запрещать переносы и не будут плодить ошибок), и, в результате, надеюсь появится бесплатный алгоритм переносов слов для всех желающих.
P.S.
Кто смотрит работу программы - не обращайте внимание на неправильный перенос слов со знаками препинания справа - это программная ошибка - я её выявил и устранил.
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- заслуженный писатель форума
- Всего сообщений: 323
- Зарегистрирован: 01.07.2007
- Откуда: Москва
Це дiло!
Золотые слова!Andrey:лучше немного запретить, чем делать кучу ошибок
Вот где собака порылась! Это меняет картину. Я, видимо, просто не понял...Andrey:словарь не должен содержать слова, как таковые, а должен содержать части слов
Нет-нет! Такой Ворд нам не нужен!Andrey:вам такой Word нужен
Буду думать.Andrey:Хотелось - бы не критики, а помощи
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Все знают Word и насчет Word-а - это конечно просто пример - Word переносит нормально и быстро - иначе как бы MS требовал за свое детище кучу бабок.
Надо подразумевать приложение куда будет встраиваться наш алгоритм.
Как раз вчера, к слову "крякозябра" сказать
, написал в программу тестовую функцию которая выводит все варианты переноса для каждого слова в тексте.
Вот что получилось (это простое слово в плане переносов):
кра-козябра крако-зябра кракозяб-ра
Если нужен вариант "кракозя-бра", то его надо записать в словарь, например так: "озя-бра" или "за-бр" (хотя, повторюсь, создание такого словаря не совсем задача программиста).
Пока нового не буду ничего выкладывать подожду (более поздней версии программы
).
Насчет словаря на текущий момент получилось следующее:
1. Словарь дополнительных разрешений:
"ме-ста", "ме-сто", "упу-стить", "кре-стьян", "ин-стинкт", "пожалуй-ста", "легко-стью", "ко-ст", "уча-стник", "прог-рам", "нер-вно", "рель-ск", "кон-крет", "не-мн", "вен-ск", "спец-сл", "шес-тви", "вод-ск", "ос-тр", "рас-тр", "го-при", "ро-бло", "ек-тр", "но-сть", "прин-ци", "прин-те", "при-дет", "проч-н", "про-дав", "проб-к", "проб-н", "прон-з", "про-долж".
2. Словарь дополнительных запретов:
"спецп-рокур", "спецс-лужб", "присутст-ву", "неп-роявл", "благоп-рият", "фроб-ло", "пред-ел", "пред-упр", "пред-ат", "пред-ал", "пред-ав", "пред-ост", "пред-ы", "пред-ъ", "при-нци", "при-нт", "про-чн", "прод-ав", "про-сь", "про-бк", "про-бн", "про-нз", "прод-олж"
3. Словарь разрешения переносов гласная-гласная:
(вынес отдельно для ускорения работы прогриммы, входим в этот словарь только если гласная-гласная)
"та-ясь", "де-ясь", "сме-яв", "вы-езж", "во-ин", "ля-ют", "ге-ор", "во-их", "ци-аль", "не-об", "то-ял", "ро-ят", "сме-ял", "за-од", "ци-аль", "ри-ум", "на-еш"
Как вариант, когда эти словари разрастутся можно их проанализировать на предмет выявления правил переносов.
Но, думаю уже вряд-ли можно будет выявить правила охватывающие много однотипных случаев.
А вместо использования словарей плодить большое количество правил - то же не правильный путь ведущий к замедлению работы программы и еще к запутыванию исходного кода.
Надо подразумевать приложение куда будет встраиваться наш алгоритм.
Как раз вчера, к слову "крякозябра" сказать

Вот что получилось (это простое слово в плане переносов):
кра-козябра крако-зябра кракозяб-ра
Если нужен вариант "кракозя-бра", то его надо записать в словарь, например так: "озя-бра" или "за-бр" (хотя, повторюсь, создание такого словаря не совсем задача программиста).
Пока нового не буду ничего выкладывать подожду (более поздней версии программы

Насчет словаря на текущий момент получилось следующее:
1. Словарь дополнительных разрешений:
"ме-ста", "ме-сто", "упу-стить", "кре-стьян", "ин-стинкт", "пожалуй-ста", "легко-стью", "ко-ст", "уча-стник", "прог-рам", "нер-вно", "рель-ск", "кон-крет", "не-мн", "вен-ск", "спец-сл", "шес-тви", "вод-ск", "ос-тр", "рас-тр", "го-при", "ро-бло", "ек-тр", "но-сть", "прин-ци", "прин-те", "при-дет", "проч-н", "про-дав", "проб-к", "проб-н", "прон-з", "про-долж".
2. Словарь дополнительных запретов:
"спецп-рокур", "спецс-лужб", "присутст-ву", "неп-роявл", "благоп-рият", "фроб-ло", "пред-ел", "пред-упр", "пред-ат", "пред-ал", "пред-ав", "пред-ост", "пред-ы", "пред-ъ", "при-нци", "при-нт", "про-чн", "прод-ав", "про-сь", "про-бк", "про-бн", "про-нз", "прод-олж"
3. Словарь разрешения переносов гласная-гласная:
(вынес отдельно для ускорения работы прогриммы, входим в этот словарь только если гласная-гласная)
"та-ясь", "де-ясь", "сме-яв", "вы-езж", "во-ин", "ля-ют", "ге-ор", "во-их", "ци-аль", "не-об", "то-ял", "ро-ят", "сме-ял", "за-од", "ци-аль", "ри-ум", "на-еш"
Как вариант, когда эти словари разрастутся можно их проанализировать на предмет выявления правил переносов.
Но, думаю уже вряд-ли можно будет выявить правила охватывающие много однотипных случаев.
А вместо использования словарей плодить большое количество правил - то же не правильный путь ведущий к замедлению работы программы и еще к запутыванию исходного кода.
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- заслуженный писатель форума
- Всего сообщений: 481
- Зарегистрирован: 06.10.2006
- Откуда: Санкт-Петербург
- Возраст: 74
Насколько мне помнится, существует запрет при переносе отрывать первую букву от корня слова. Но как это реализовать программно - ума не приложу, если составлять словарь, то он будет громадный, а найти правило - сомневаюсь, что это возможно. Может быть, пойти от обратного и анализировать приставки, считая, что корень слова будет сразу после них?
Errare humanum est!
-
- заслуженный писатель форума
- Всего сообщений: 454
- Зарегистрирован: 21.11.2005
-
- поэт-прозаик
- Всего сообщений: 235
- Зарегистрирован: 22.08.2007
- Откуда: Финляндия, Espoo
- Контактная информация:
-
Автор темыAndrey
- дьяк
- Всего сообщений: 34
- Зарегистрирован: 09.09.2007
Поясняю:
по-давать - перенесет (гласная - согласная);
под-авать - не перенесет (нет правила согласная - гласная) если не открыть такой вариант в словаре(но зачем это делать
);
под-дать - перенесет (буква слева = букве справа);
по-ддать - не перенесет (с одной стороны две одинаковые буквы);
Выкладываю последний алгоритм, словарь выложил раньше, пока ничего в словарь не добавлял, при прочтении последней 1/5 части книги встретил только две ошибки: разведс-лужбы, разведс-труктуры и 2 слова не перенесла где хотелось-бы: концен-трации, от-хлебнул (подчиняется запрету на 2 согласных справа от переноса).
Словарь работает следующим образом:
в слово, в месте предполагаемого переноса вставляется символ "-", например: "про-давщица" каждое "слово" из словаря проверяется на вхождение в данное, см. словарь 1, там есть "про-дав", что является вхождением в слово "про-давщица" - т. к. словарь 1 - это словарь дополнительных разрешений - перенос разрешен.
Если - бы в словаре не было слова "про-дав", то перенос был-бы запрещен по п. 6.5 алгоритма.
Алгоритм:
/*
Правила работы поиска места переноса в слове:
Функция получает: слово и позицию, начиная с которой надо найти позицию правильного переноса в слове
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить".
2. Крайние символы самостоятельно не переносятся.
3. Оценивается наличие не более трех "знаков препинания" в правой стороне слова левее позиции переноса.
Для выполнения правила 2 справа.
4. Оценивается наличие не более трех "знаков препинания" в начале слова.
Для выполнения правила 2 слева.
Если слева или справа больше "знаков препинания" чем 3, то перенос этого слова не гарантирует
правильность.
----------------------------------------------------------------------------------
Цикл (Сдвинуть место переноса левее (если слово кончилось, вернуть: "нельзя переносить" - конец функции))
5. Ищем место переноса:
5.1 - проверка на разрешение переноса из словаря разрешений
если нашли идем к 6.8 и последовательно ниже
5.2 - если буква слева == букве справа
идем к 6.8 и последовательно ниже
5.3 - если (позиция переноса == 3) и (первые 4 буквы == "пред")
идём к 6.6 и последовательно ниже
5.4 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "при" или "про")
5.4.1 если (буква 3 != "д") - перейти в начало цикла
5.4.2 если (буква 3 != "й") - перейти в начало цикла
идём к 6.6 и последовательно ниже
5.5 - если (согласная ("ъ" или "ь") - гласная) или (гласная, затем "й" - гласная)
идём к 6.1 и последовательно ниже
5.6 - если (гласная - гласная) ищем в словаре дополнительных разрешений на перенос гласная - гласная
если нашли - идем к 6.8 и последовательно ниже
5.7 - если (гласная - согласная) или (согласная - согласная (если правая согласная не "ъ" или "ь")
идём к 6.1 и последовательно ниже
Если ничего по п.5 не подошло - перейти в начало цикла.
----------------------------------------------------------------------------------
6. Нельзя переносить (проверяется, для найденной точки переноса по правилам п.5.)
6.1 - если правее, правой согласной буквы, стоит "ь";
6.2 - если правее правой согласной не гласная буква, за исключением буквосочетания "ств";
6.3 - если (позиция переноса == 4) и (первые 4 буквы == "пред")
6.4 - если (позиция переноса == 3) и (первые 3 буквы == "пре" или "при" или "про")
6.5 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "про") и (буква 3 == "д")
6.6 - если слева или справа две одинаковых согласных;
6.7 - если слева или справа две одинаковых гласных;
6.8 - проверка на запрет из словаря запретов;
6.9 - если или слева или справа от предполагаемого места переноса нет гласной буквы.
Если запретов не найдено вернуть позицию места переноса - конец функции.
При выполнении первого найденного запрета - перейти в начало цикла.
----------------------------------------------------------------------------------
*/
Представленный алгоритм немного упрощен, чем реализовано в программе для ускорения её работы.
Добавлено спустя 5 минут 2 секунды:
Поможете со словарем приставок?
В алгоритме можно увидеть, что я уже анализирую приставки при, пре, про, пред и частично "прод" (кстати не ошибка ли это? см. п. алгоритма 6.5)
по-давать - перенесет (гласная - согласная);
под-авать - не перенесет (нет правила согласная - гласная) если не открыть такой вариант в словаре(но зачем это делать

под-дать - перенесет (буква слева = букве справа);
по-ддать - не перенесет (с одной стороны две одинаковые буквы);
Выкладываю последний алгоритм, словарь выложил раньше, пока ничего в словарь не добавлял, при прочтении последней 1/5 части книги встретил только две ошибки: разведс-лужбы, разведс-труктуры и 2 слова не перенесла где хотелось-бы: концен-трации, от-хлебнул (подчиняется запрету на 2 согласных справа от переноса).
Словарь работает следующим образом:
в слово, в месте предполагаемого переноса вставляется символ "-", например: "про-давщица" каждое "слово" из словаря проверяется на вхождение в данное, см. словарь 1, там есть "про-дав", что является вхождением в слово "про-давщица" - т. к. словарь 1 - это словарь дополнительных разрешений - перенос разрешен.
Если - бы в словаре не было слова "про-дав", то перенос был-бы запрещен по п. 6.5 алгоритма.
Алгоритм:
/*
Правила работы поиска места переноса в слове:
Функция получает: слово и позицию, начиная с которой надо найти позицию правильного переноса в слове
1. Алгоритм сдвигается по слову влево, пока не найдёт точку переноса или возвращает значение "нельзя переносить".
2. Крайние символы самостоятельно не переносятся.
3. Оценивается наличие не более трех "знаков препинания" в правой стороне слова левее позиции переноса.
Для выполнения правила 2 справа.
4. Оценивается наличие не более трех "знаков препинания" в начале слова.
Для выполнения правила 2 слева.
Если слева или справа больше "знаков препинания" чем 3, то перенос этого слова не гарантирует
правильность.
----------------------------------------------------------------------------------
Цикл (Сдвинуть место переноса левее (если слово кончилось, вернуть: "нельзя переносить" - конец функции))
5. Ищем место переноса:
5.1 - проверка на разрешение переноса из словаря разрешений
если нашли идем к 6.8 и последовательно ниже
5.2 - если буква слева == букве справа
идем к 6.8 и последовательно ниже
5.3 - если (позиция переноса == 3) и (первые 4 буквы == "пред")
идём к 6.6 и последовательно ниже
5.4 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "при" или "про")
5.4.1 если (буква 3 != "д") - перейти в начало цикла
5.4.2 если (буква 3 != "й") - перейти в начало цикла
идём к 6.6 и последовательно ниже
5.5 - если (согласная ("ъ" или "ь") - гласная) или (гласная, затем "й" - гласная)
идём к 6.1 и последовательно ниже
5.6 - если (гласная - гласная) ищем в словаре дополнительных разрешений на перенос гласная - гласная
если нашли - идем к 6.8 и последовательно ниже
5.7 - если (гласная - согласная) или (согласная - согласная (если правая согласная не "ъ" или "ь")
идём к 6.1 и последовательно ниже
Если ничего по п.5 не подошло - перейти в начало цикла.
----------------------------------------------------------------------------------
6. Нельзя переносить (проверяется, для найденной точки переноса по правилам п.5.)
6.1 - если правее, правой согласной буквы, стоит "ь";
6.2 - если правее правой согласной не гласная буква, за исключением буквосочетания "ств";
6.3 - если (позиция переноса == 4) и (первые 4 буквы == "пред")
6.4 - если (позиция переноса == 3) и (первые 3 буквы == "пре" или "при" или "про")
6.5 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "про") и (буква 3 == "д")
6.6 - если слева или справа две одинаковых согласных;
6.7 - если слева или справа две одинаковых гласных;
6.8 - проверка на запрет из словаря запретов;
6.9 - если или слева или справа от предполагаемого места переноса нет гласной буквы.
Если запретов не найдено вернуть позицию места переноса - конец функции.
При выполнении первого найденного запрета - перейти в начало цикла.
----------------------------------------------------------------------------------
*/
Представленный алгоритм немного упрощен, чем реализовано в программе для ускорения её работы.
Добавлено спустя 5 минут 2 секунды:
Хорошая идея.Вячеслав Кургин:Можно составить словарь приставок. Он будет существенно короче.
Поможете со словарем приставок?
В алгоритме можно увидеть, что я уже анализирую приставки при, пре, про, пред и частично "прод" (кстати не ошибка ли это? см. п. алгоритма 6.5)
-
Новая папка.part2.rar
- Программа ч.2
- (434.62 КБ) 589 скачиваний
-
Новая папка.part1.rar
- Программа ч.1
- (976.56 КБ) 555 скачиваний
Английский без зубрежки http://easy-study-english.blogspot.com/p/blog-page.html
-
- поэт-прозаик
- Всего сообщений: 235
- Зарегистрирован: 22.08.2007
- Откуда: Финляндия, Espoo
- Контактная информация:
Я похоже неясно выразился (или я чего-нибудь не понимаюAndrey:Поясняю:
по-давать - перенесет (гласная - согласная);
под-авать - не перенесет (нет правила согласная - гласная) если не открыть такой вариант в словаре(но зачем это делать Sad );
под-дать - перенесет (буква слева = букве справа);
по-ддать - не перенесет (с одной стороны две одинаковые буквы);

Если внести словарь приставок, то у программы будут проблемы. Например:
Слово постой программа переведёт как по-стой. Всё правильно.
Слово постом (от слова пост (чем? постом)) программа переведёт как по-стом. Неправильно.
Если не вносить словаря, то у программы всё рано будут проблемы:
Слово постой программа переведёт как пос-той.
Andrey:5.4 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "при" или "про")
5.4.1 если (буква 3 != "д") - перейти в начало цикла
5.4.2 если (буква 3 != "й") - перейти в начало цикла
Почему третья буква == "д"?Andrey:6.5 - если (позиция переноса == 2) и (первые 3 буквы == "пре" или "про") и (буква 3 == "д")
_____
_/ Дима )
`O------O'
_/ Дима )
`O------O'
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение