алгоритм переносов
|
|
electrik | Дата: Среда, 12.03.2014, 17:15 | Сообщение # 1 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| задумал я для наших ребят в издательстве текстовый редактор написать. все знают, что в наше время написать редактор особого ума не надо, а вот алгоритмы - ... вобщем, нужна реализация алгоритма расстановки переносов. предположим, в книге длина строки равна 30 символов и должно это выглядеть так:
Статья ]248. Плоды,продукция и доходы от использования иму- щества,находящегося в долевой собственности Плоды,продукция и доходы от использования имущества,нахо- дящегося в долевой собственно- сти,поступают в состав общего имущества и распределяются между участниками долевой соб- ственности соразмерно их до- лям,если иное не предусмотрено соглашением между ними.
знаю, есть алгоритм ляна-кнутта, вродь так называется, может кто-то это уже прошёл, уж не охото возиться с этим. я попробую конечно, но если поможете, будет классно. поповоду денег - думаю вряд ли мне за это заплатят, так как это моя инициатива. нафиг мне это надо. слепые работают под dos в лексиконе, жесть, а виндовые редакторы, либо не подходят требованиям, а специализированные громоздкие и стоят таких же денег. у нас требования просты, текст должен форматироваться по 30 символов в строке, текстовый редактор должен уметь расставлять переносы автоматически, и должен уметь сказать правильно ли написано слово(spellchecker). остальное, тут уже дело техники, макросы горячки поиск и т.д.
|
|
| |
haav | Дата: Среда, 12.03.2014, 18:10 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Серега! Вот здесь реферат с исходником на паскале:
http://xreferat.ru/33....ii.html
В самом реферате описан алгоритм. Сам исходник маленький, разобраться несложно. Как он в действии не знаю, надо конечно тестировать.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Четверг, 13.03.2014, 19:00 | Сообщение # 3 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| спасибо - это я уже видел, взял тож на заметку, но думаю, что оно слабовато будет. вот что нашёл: http://habrahabr.ru/post/138088/ алгоритм ляна-кнута, описание правил.
попробовал собрать на gcc - ух, библиотек таскать много надо! допилю - выложу. всё будет в виде dll. может потом, разобраться в c++ коде и на fb переписать. эт ладно, будет желание - займусь. главное есть алгоритм заголовки к fb и правила к этой штуке. хотя уже в правилах баг есть, слово интуиция - переносит и как интуици-я.
|
|
| |
haav | Дата: Четверг, 13.03.2014, 19:21 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| На хабре я видел, но че-то там мудрено больно. Хотя попробуешь и тот и другой алгоритм, потом не забудь отпишись. Меня больше интересует алгоритм из реферата, как он на деле.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Пятница, 14.03.2014, 19:09 | Сообщение # 5 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| ух, вот оно - hyphenator: ftp://el-zone.spb.ru/freebasic/libs/hyphenator.7z это по алгоритму ляна-кнута. недостатки - любит оставлять последние буквы, например, интуици-я, тре-ни-ро-воч-ны-й, пе-ре-но-си-мы-й. видимо, правила фиговые, хотя это стандартные правила tex. обязательно надо проверять, не остались ли одиночные буквы с переносом. считается, не идеальный алгоритм, но универсальный для всех языков. в архиве правила только для русского языка - patterns.bi. буду глядеть алгоритм из реферата. мож и вместе их скрестить, но эт ладно.
Добавлено (14.03.2014, 19:09) --------------------------------------------- вот и ссылка на правила: http://www.tug.org/tex-hyphen/#languages потом переложу архив с новыми правилами, как выяснилось, у меня старые - около 5000 записей, новый - 7000 с лишним. и английские тож подсуну. а вообще, потом можно будет переработать программу, чтоб не в бинарнике держать правила, а в tex файлах как есть. ну это уже пожеланию. я в редактор скрою, чтоб шаловливые ручки всё не попортили. глядел реферат, пока сильно не вник, идея ясна, всё-же пока на кнуте попробую. если уж совсем тяжко будет, займусь рефератом.
Сообщение отредактировал electrik - Пятница, 14.03.2014, 19:16 |
|
| |
haav | Дата: Суббота, 15.03.2014, 08:29 | Сообщение # 6 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Попробовал. Да действительно концы слов выходят с косяками. Использование из готового .bi файла неудобно. Конечно надо считывать из файла .tex Это избавит от необходимости дополнять BI файл , если обновится файл правил на оф. сайте.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Вторник, 18.03.2014, 11:44 | Сообщение # 7 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| вот, переложил файл. реализовал простое чтение данных из tex файла. обновил tex файл. английский сами пристроите, там все легко. мало что изменилось, всё-равно переносит последние гласные - тут можно самим навеску сделать. для тех кто не в курсе, и не ходил по приведённым выше ссылкам, про цитирую правила: При переносе слов нельзя ни оставлять в конце строки, ни переносить на другую сторону часть слова, не составляющую слога; например, нельзя переносить: просмо-тр, ст-рах Нельзя отделять согласную от следующей за ней гласной. Нельзя отрывать буквы ъ и ь от предшествующей согласной. Нельзя отрывать букву й от предшествующей гласной Нельзя оставлять в конце строки или переносить на другую строку одну букву При переносе слов с приставками нельзя разбивать односложную приставку, если за приставкой идёт согласный. При переносе слов с приставками нельзя оставлять в конце строки при приставке начальную часть корня, не составляющую слога. При переносе сложных слов нельзя оставлять в конце строки начальную часть второй основы, если эта часть не составляет слога Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными Нельзя разбивать переносом односложную часть сложносокращённого слова предыдущие
пока ещё руки до реферата не дошли, как только что-то сделаю, суда солью.
Сообщение отредактировал electrik - Вторник, 18.03.2014, 11:50 |
|
| |
haav | Дата: Четверг, 20.03.2014, 12:57 | Сообщение # 8 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Ну как с рефератами сделаешь, потом перемещу тему в раздел freebasic. Все таки данная тема полезна и больше относится к FB , чем к оффтопу.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Четверг, 07.04.2022, 22:43 | Сообщение # 9 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Так и не написал я редактор для издательства, но вспомнил про переносы. Да уж, написан там алгоритм жестячно, это я про математический вариант. По правилам Нельзя отделять согласную от следующей за ней гласной, интересно, а как же "Под-окон-ник"? И таких слов, думаю не мало. Ещё правило, Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными. А как же слова по-ссорился, и по-ссал?Добавлено (07.04.2022, 22:49) --------------------------------------------- Я до сих пор работаю в издательстве, и правим мы почти каждый день. Частая проблема при правке - это переносы. ДЛя школьных переносов, наверное математический алгоритм пойдёт, а для издательских точно нет. Добавлено (08.04.2022, 01:41) --------------------------------------------- Ох какая печалька... На гитхабе больше нет тех исходников которые я собирал в 2014 году. И кажется у меня их не осталось.
|
|
| |
DarkDemon | Дата: Пятница, 08.04.2022, 04:00 | Сообщение # 10 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| Вот вроде нормальные правила русского языка:
Цитата 1. Слова переносят по слогам: лам-па, пи-ра-ми-да, по-клон-ник, пей-заж, мо-но-лит-ный, гор-дость 2. Одну букву нельзя оставлять на строке и нельзя переносить на другую строку: Яма, ар-мия, Юлия, ель, стог 3. Буквы ъ, ь не отделяют от предыдущей согласной: паль-то, се-мья, объ-езд, конь-ки, подъ-емник, объ-ятия А букву й нельзя отделять от предшествующей гласной: вой-лок, бой-кот, дизай-нер, кофей-ник, злодей-ство, россий-ский 4. В словах с двойными согласными одну букву оставляют на строке, вторую переносят на другу строку: Ан-на, суб-бота 5. При переносе нельзя отрывать от приставки одну букву: Под-бросить, под-писать 6. Нельзя отрывать первую букву от корня: По-строить, при-учить, со-брать
А вот зацитирую один комментарий с хабра:
Цитата Если лень возится с Ляна-Кнутом, и требуется только русский язык, то можно воспользоваться алгоритмом П.Хpистова в модификации Дымченко и Ваpсанофьева.
Всего шесть правил:
«Х-» «Г-Г» «ГС-СГ» «СГ-СГ» «ГС-ССГ» «ГСС-ССГ»
Где: Г — гласная, С — согласная, Х — буква из набора «ьъй».
Элементарно реализуется на регекспах. Утверждается, что покрывает немалую часть правил русского языка. Вот по этой ссылке вышеозвученный алгоритм и тоже интересно почитать: https://sites.google.com/site/foliantapp/project-updates/hyphenation
Моё предположение: нужно найти приставку и корень слова, а далее перебирать все буквы слова, проверяя по шаблонам, можно ли в это место засунуть перенос, если можно, то заносить вариант слова в список(или массив). Далее нужен алгоритм который по корню и приставке(по озвученным выше правилам русского языка) - отсечёт неверные варианты из этого списка и совместит их в один вариант.
А как переносить: дойти до выхода за лимит(конец слова после 30 символов), выделить слово, провести анализ слова, про который писал выше, функция после анализа должна возвращать два значения: 0 - переносить всё слово, 1 - переносить часть слова. В случае с 1 нужно проверить по шаблону переноса(в слове после анализа должны стоять чёрточки где можно переносить), идти с конца слова и проверять укладывается ли обрезанное слово плюс чёрточка в лимит(30 символов). Если ни один перенос не укладывается - то переводить состояние в 0 (т.е. перенос всего слова).
Короче это очень геморройное дело, чтобы правильно сделать, очень многоэтапный алгоритм, где каждая часть важна. Думаю он вполне детерминируется, но это много времени на анализ логики.
Слоги и приставки, наверное, надо брать из словаря, т.к. есть, конечно, правила, но фонетики там грызутся меж собой:
Цитата Слова "разрубаются" на слоги после каждой гласной. Сколько гласных, столько слогов. НО: если после гласной стоят р, рь, л, ль, м, мь, н, нь и за ними есть еще парная согласная, они (сонорные и сонорные с ь) отходят к предыдущему слогу; если после й есть любой другой согласный, й отходит к предыдущему слогу.
Добавлено (08.04.2022, 11:29) ---------------------------------------------
Цитата electrik ( ) По правилам Нельзя отделять согласную от следующей за ней гласной, интересно, а как же "Под-окон-ник"? Под - приставка, окон - корень и нн - двойная согласная, которая бьётся пополам (правило 4 выше).
Состав: https://kartaslov.ru/разбор-слова-по-составу/подоконник Перенос: https://xn----8sbi5ahhceu.xn--p1ai/слово....кон-ник Слоги: https://slogi.su/подоконник
Сообщение отредактировал DarkDemon - Пятница, 08.04.2022, 11:41 |
|
| |
|