Автоматическая расстановка переносов
Расставить переносы в вашем слове или тексте вы можете на странице тестирования алгоритма
Переносы в словах нужны для того, чтобы текст выглядел более привлекательно. При выравнивании по обеим сторонам размеры пробелов увеличиваются не так заметно, как в тексте без переносов, а при выравнивании по левому краю правая граница будет более ровной. Это вызвано тем, что в тексте с переносами имеется больше мест для разбиения строки́.
Для автоматической расстановки переносов в русскоязычных текстах я реализовал на PHP быстрый и качественный алгоритм, который идентичен тому, что используется в системе TeX. Авторы алгоритма — Дональд Кнут и Франк Лянг.
Здесь вы можете скачать диссертацию Франка Лянга по расстановке переносов: http://www.tug.org/docs/liang/.
Несмотря на то, что алгоритм был разработан 25 лет назад, он до сих пор актуален, и его не удалось превзойти. Впрочем, это касается всего, к чему приложил руку Дональд Кнут.
Я снабдил алгоритм примерно 5000 правилами переносов, собранных из различных дистрибутивов LaTeX и из просторов Интернета. Противоречивые правила были проверены вручную. Специальные структуры данных, используемые в алгоритме, позволяют достичь быстродействия, не зависящего от количества применяемых правил переноса.
Проверим алгоритм на следующем тексте:
Алисе наскучило сидеть с сестрой без дела на берегу реки; разок-другой она заглянула в книжку, которую читала сестра, но там не было ни картинок, ни разговоров.
— Что толку в книжке, — подумала Алиса, — если в ней нет ни картинок, ни разговоров?
Она сидела и размышляла, не встать ли ей и не нарвать ли цветов для венка; мысли ее текли медленно и несвязно — от жары ее клонило в сон. Конечно, сплести венок было бы очень приятно, но стоит ли ради этого подыматься?
Вдруг мимо пробежал белый кролик с красными глазами.
Конечно, ничего удивительного в этом не было. Правда, Кролик на бегу говорил:
— Ах, боже мой, боже мой! Я опаздываю.Но и это не показалось Алисе особенно странным. (Вспоминая об этом позже, она подумала, что ей следовало бы удивиться, однако в тот миг все казалось ей вполне естественным.) Но, когда Кролик вдруг вынул часы из жилетного кармана и, взглянув на них, помчался дальше, Алиса вскочила на ноги. Ее тут осенило: ведь никогда раньше она не видела кролика с часами, да еще с жилетным карманом в придачу! Сгорая от любопытства, она побежала за ним по полю и только-только успела заметить, что он юркнул в нору под изгородью.
В тот же миг Алиса юркнула за ним следом, не думая о том, как же она будет выбираться обратно.
Вот результат. Алгоритм обрабатывает все слова длиннее трёх букв; такие слова помечены жирным шрифтом. Возможные места переносов показаны сменой цвета с бардового на зелёный и обратно. Подразумевается, что каждое слово будет перенесено не более чем в одном месте:
Алисе наскучило сидеть с сестрой без дела на берегу реки; разок-другой она заглянула в книжку, которую читала сестра, но там не было ни картинок, ни разговоров.
— Что толку в книжке, — подумала Алиса, — если в ней нет ни картинок, ни разговоров?
Она сидела и размышляла, не встать ли ей и не нарвать ли цветов для венка; мысли ее текли медленно и несвязно — от жары ее клонило в сон. Конечно, сплести венок было бы очень приятно, но стоит ли ради этого подыматься?
Вдруг мимо пробежал белый кролик с красными глазами.
Конечно, ничего удивительного в этом не было. Правда, Кролик на бегу говорил:
— Ах, боже мой, боже мой! Я опаздываю.Но и это не показалось Алисе особенно странным. (Вспоминая об этом позже, она подумала, что ей следовало бы удивиться, однако в тот миг все казалось ей вполне естественным.) Но, когда Кролик вдруг вынул часы из жилетного кармана и, взглянув на них, помчался дальше, Алиса вскочила на ноги. Ее тут осенило: ведь никогда раньше она не видела кролика с часами, да еще с жилетным карманом в придачу! Сгорая от любопытства, она побежала за ним по полю и только-только успела заметить, что он юркнул в нору под изгородью.
В тот же миг Алиса юркнула за ним следом, не думая о том, как же она будет выбираться обратно.
Напоминаю, что места возможной расстановки переносов в русском языке не всегда совпадают с границами слогов.
Алгоритм достаточно мощный, чтобы обработать самые сложные слова (кое-где недостаёт возможных переносов, я знаю):
Бодр-ство-вать Мудр-ство-вать
Быст-ро-вы-зы-вае-мый
Адъ-юнкт-ство Бур-го-мистр-ство
Контр-стра-те-гия
Пред-праздн-ство Рот-мистр-ство
Сверх-встре-во-жен-ный
Взблеск Вспласт Всплеск Вспрыск
Фельдъ-егерь
Те-ле-грам-ма-ап-па-рат
Ме-ток-си-хлор-ди-этилами-но-ме-тил-бу-тилами-ноак-ри-дин
Че-ты-рёх-сот-вось-ми-де-ся-ти-че-ты-рёх-мил-ли-грам-мо-вый
Рент-ге-но-элек-тро-кар-дио-гра-фи-че-ско-го
Пре-вы-со-ко-мно-го-рас-смот-ри-тель-ствую-щий
Част-но-пред-при-ни-матель-ский
Са-мо-но-со-ро-го-по-доб-ность
Зря-че-ню-хо-слы-ша-щий
Ра-зум По-душ-ка
Проверить алгоритм расстановки переносов на своём тексте вы можете здесь.
О правилах переноса в русском языке можно почитать здесь: http://www.rusyaz.ru/pr/opp.html
P.S.
Замечу, что эта разработка — не первая в Интернете.
Рекомендую посетить сайт Игоря Батова, посвящёный, в основном, автоматической расстановке переносов. Там же можно протестировать его алгоритмы и алгоритмы конкурентов.
Большинство остальных подходов основаны на использовании нескольких простых правил, что выглядит смешно для «Великого и Могучего», например: http://xpoint.ru/know-how/VebAlgoritmyi/RabotaSTekstami/RasstanovkaPerenosov.
Вот интересный подход, основанный на использовании расстановщика переносов на стороне клиента (JavaScript): http://snusmumrik.org.ru/ru/hyph/
Восемь отзывов на запись «Автоматическая расстановка переносов»
Автор: Денис. Дата: 24-го апреля 2009 г. Время: 03:53.
Я заметил, когда копировал в doc алгоритм для сортировки кучу ¬ символов. Здорово!
Автор: кто-то. Дата: 16-го марта 2010 г. Время: 12:18.
Отстой.
«что-бы текст выглядел более привлекатель-но» — думаете текст набитый дефисами и/или shy’ями кто-то будет цитировать?
И толку от таких расперенесённых во все стороны текстов?
Другой подход нужен.
Автор: Антон. Дата: 16-го марта 2010 г. Время: 14:01.
Я не утверждаю, что переносы красивы сами по себе. Я говорю, что они позволяют сделать более равные пробелы в тексте (при выравнивании по обеим сторонам).
Что вы предлагаете?
Автор: Lazer. Дата: 4-го апреля 2010 г. Время: 15:39.
Не переживай (на ты — на вы?), все нормально, отличный алгоритм! Мне нравится!
Автор: Lavir the Whiolet. Дата: 7-го апреля 2010 г. Время: 14:26.
Здравствуйте! А можно у вас попросить набор правил, который вы погрузили в алгоритм?
Автор: Павел. Дата: 26-го июля 2010 г. Время: 12:32.
Действительно, а как избавиться от символов мягкого переноса при копировании?
Я думаю обработчик вешать в JS. Например как на коммерсанте высплывающее окно показывать с textarea, в котором будет тот же текст уже без мягких переносов.
Либо где-то рядом со статьей делать ссылку, показывающую скрытый слой, в котором то же текст без переносов.
Либо редиректить на страницу «Для копипаста» (аналогия «Страница для печати»)
Автор: Vovk. Дата: 10-го ноября 2010 г. Время: 12:10.
Алгоритм не раскрыт. О чем статья вообще получилась?
Автор: Антон. Дата: 10-го ноября 2010 г. Время: 20:27.
Согласен. Нужно будет переписать.