Мирский Христо : другие произведения.

04. Компьютерная программа для переноса слов разных языков

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Ссылки:
Школа кожевенного мастерства: сумки, ремни своими руками
 Ваша оценка:
  • Аннотация:
    Это грубое объяснение реализованной программы для чего сказано.
    Keywords: программирование, перенос слов, реализовано в ДОС-е, универсально, личная идея.




КОМПЬЮТЕРНАЯ ПРОГРАММА ДЛЯ ПЕРЕНОСА СЛОВ РАЗНЫХ ЯЗЫКОВ


     Эта не просто идея, она реализована мною, я применял её некоторое время и был вполне доволен ею, так что здесь существует прецедент, что существенно, ибо известно что это возможно, а не просто искать чего-то не зная можно ли его найти (как, например, обстоит вопрос с существованием Бога). Эта программа работала, но это было лет 20 тому назад (ну, хотя бы 15), и для ДОС-а, а с появлением Windows-а всё стало сложнее, и я отказался тратить силы (да и искать нужного софтвера задаром). И поскольку в новой платформе всё, так или иначе, нужно делать заново, и поскольку я имею право сохранить себе детали, да и я публикую это на популярном литературном сайте, не годится чтобы я стал давать фрагменты программ на алгоритмических языках, так по всем этим причинам я не буду делать усилия искать программу и смотреть точно на неё а буду рассказывать по памяти. Тем не менее я обычно подробен, так что если человек захочет, и если он профессиональный программист, то сможет "сварганить" что-то похожее, хотя в Windows-е всё сложнее, там нужно работать на уровне пикселей, не слов, нужно учитывать всякие шрифты и прочее, так что это будет и не так уж легко. Прочее, я вернусь на это к концу, ибо такая возможность просто обязательна для любого браузера или экрана мобильного компьютерного устройства (даже телефона, если в нём достаточно памяти).
     Что важно подчеркнуть, это то, что программа должна работать удовлетворительно хорошо (и оно так и было у меня) для смеси разных языков даже в одном файле, или для пары языков с которыми человек обычно работает, она должна допускать лёгкое настраивание, если в данных языках имеются противоречивые концепции на перенос слов, да и отражать личные предпочтения человека, должна проводить выравнивание по правому краю страницы (justification), и другие моменты. У меня был вариант который работал как отдельную (stand alone) программу, задавался входной файл (.txt), задавался выходной файл (.prt), программа преобразовала один в другой, и потом оставалось лишь распечатать последний файл. А, и я работал только на латинице и кириллице, если кто-то хочет делать перенос, скажем, и на арабском, то там могут быть свои трудности, но специально для греческого алфавита не должно быть особых проблем (с первого взгляда -- я этим не занимался). Вот, однако так как в разных языках мнение на перенос слов совершенно разные то я должен сначала сказать пару параграфов об этом.

1. Основные понятия о слогах, типов букв, и универсальных правил переноса

     Здесь я не открываю Америку, но тем не менее имеется мой личный вклад в эту тему; я затрагиваю эти вопросы в моей идее об универсальном мировом алфавите, и их нужно иметь в виду, потому что, чётко выражаясь, универсальных правил для переноса слов во всех, хотя бы европейских, языках попросту нету! В русском вещи более или менее простые, но в английском это совсем не так, и там имеются словари где указан перенос для каждого слова, это в основном как бы из соображений слогов, но и здесь могут быть различные мнения. В немецком свои правила, обычно по слогам, но некоторые буквы разбивать совершенно некрасиво, а у них используются нормально по 2-3 знака для одной буквы, а то даже и четыре; в английском (и французском) с другой стороны совершенно некрасиво разбивать гласные, потому что они читаются вместе по несколько подряд. Поэтому я задал себе сначала вопрос: что такое слог, чем он характеризуется, как его отличить?
     Ну, выходит что он обычно, не всегда, но в большинстве случаев (скажем, в 90%), начинается согласной и кончается как получится, но благословлены те языки в которых гласные простые. И теперь приходим к моим взглядам о том какие виды гласных звуков вообще (в мире) существуют, потому что нужно как-то распознавать -- без словарей, разумеется, ведь не будут же использоваться словари для всех возможных мировых языков -- где гласная как бы одна (хотя их несколько), образует слог, и где это несколько отдельных гласных. Скажем: слово "пиано" имеет три слога для нас, но в английском оно имеет два, там "ia" нельзя разбивать, также как и в с слове "ready", или в "beauty". Поэтому я пришёл к выводу, что существуют три типа гласных (в основном, но это можно применить и к согласным), а именно: базисные, модифицированные, и дифтонги или комбинации гласных.
     Базисные гласные всего шесть, это: "е", "и", "о", "у", "а", и болгарское "ъ" (здесь не могу впускаться в детальные объяснения, они сделаны при алфавите, но это тот звук как в английском girl). Модифицированные это когда хочешь сказать одно, а говоришь другое, где типичный пример русское "е", которое, собственно говоря, 'ие' (спрашивайте украинцев, они наверное разъяснят вам почему говорят дивка, жинка, и т.д.), также как и русское "ы" это 'ъи' -- и я думаю что уже "усекли" почему я даю вторую гласную как суб-индекс -- а то ещё можно сказать что русское безударное "о" (как в начале "окно") это 'ъа', что встречается также и в английском but. Нет смысла углубляться здесь больше, ибо специально в этой программе я не занимаюсь таким анализом, но он объясняет почему я принял свою концепцию на перенос гласных, которую укажу ниже. И дифтонги, в моём понимании, ибо некоторые, и то лингвисты, называют, для примера, французское "ai", которое читается как 'e' -- и я думаю, что вы также замечаете, что я использую одиночные кавычки для указания того как буквы произносятся, в то время как двойные дают выписывание букв --, тоже дифтонгом, это такие комбинации гласных где их несколько, как в английском pear, 'пеъ', каких в русском нет, если не считать "ай", "ей", и прочее, но "й" не совсем гласная.
     Вот, так что теперь приходим к тому, что буквы нужно различать, нужно прикрепить в программе к каждой букве, для обеих алфавитов (а что будем делать с теми где всякие галочки сверху, тоже скажу что-то к концу), характеристику типа, и этих типов должно быть три! То есть, гласные, согласные, и неопределённые, но всё же буквы, а не другие знаки. Эти неопределённые буквы (если я не запамятовал что-то, но в любом случае этот вопрос нужно как-то третировать), скажем, "й", или латинское "h", а то и "w", играют роль модификаторов прежней буквы и должны прицепляться к прежней букве, или принимать ту же характеристику как у неё (но что делать если такой символ в начале слова не припоминаю точно, однако это не принципиально, ибо одна буква не должна оставаться на строчке).
     Когда слог более или менее правильно распознан то можно переходить к переносу слова, к отделению полновесного слога, на что остановимся в следующем пункте о моей реализации. Однако хочется подчеркнуть, что эта программа работает, как принято выражаться, эвристически, она даёт некоторое решение, которое достаточно хорошее, но не обязательно идеальное или грамматически правильное. (К примеру, выходит что латинское "ck" следует считать как "kk", и учитывать это при переносе слова оставляя на обе строчки по букве "k", но я думаю что это лишняя роскошь.)

2. Как я реализовал сам перенос слов

     Ну, значит, начинается с конца слова, которое не умещается при заданной длине строки, и работая только символами, идя с конца к началу слова, и следя за количеством знаков в обеих его частях, отделяется возможный слог (но могут быть несколько вариантов) и добавляя разделительную чёрточку проверяется можно ли разместить первую часть слова; если нельзя, то продолжается дальше, сначала не добавляя нового слога, а если нужно, то начиная формировать новый слог, когда проверяется опять можно ли провести разбиение, и так до достижения минимума допустимых знаков в начале слова (это 2, но можно требовать и 3, или чтобы слова меньше 5 букв не разбивались, я обычно разбиваю и 4-х буквенные) и тогда слово оставляется так и им начинается новая строчка. Когда слово обработано и найдено или нет разбиение, то раз что-то отнимается от первоначальной строки остаётся ещё растянуть её по правому концу добавляя по интервалу между словами опять идя сзади к началу строки.
     Разумеется здесь нужны и процедуры для распознавания окончания слова, в фонетическом смысле, такие как интервал, знаки препинания, другие символы; а также, думаю, и пропускать такие слова, которые не чистые слова, т.е. в них числа, или специальные символы, или перемешаны алфавиты -- они должны оставаться такими какие они есть, это может быть пароли, новые символы, и прочее. Разумеется также, что нужно задание длины строки, которую хотим получить (по умолчанию, кажется, 70), количество знаков которые можно оставлять в конце или начала строчки (и если слог налицо, ибо иначе продолжается дальше), и несколько других параметров программы. Но нужно и задание ещё нескольких важных вещей, потому что пока мы только указали на то, что не ясно нужно ли разбивать двое гласных (и пусть отмечаем это дальше только заглавной буквой Г), или можно ли прерывать последовательность согласных (тоже будем отмечать только буквой С) или нет, но не сказали как именно поступать, а ведь нельзя оставить программу стоят и думать как осёл Буридана с какого стога сена начать есть. Так что сейчас приступаем к этому.
     Здесь я ввёл такие эвристические правила: гласные как правило не разбиваются, если не допустим какого-то исключения, и тогда нужно вводить список исключений (кажется было так, но не уверен на все 100 процентов, может быть вводил список префиксов оканчивающихся на гласную); согласные как правило разбиваются, но нужно ввести список комбинаций согласных, которые нельзя разбивать (здесь уверен что это было); неопределённые символы (ни Г, ни С) должны идти с прежними символами, то есть разбиение только после них. Ввод в досовской программе список вещей которые нужно выполнять не так легко, но я это сделал (на худой конец нужно вводить это как варианты при декларации констант, и проводить новую трансляцию). Так что программе нужно задать список неразделимых комбинаций -- таких как немецкое "sch", также "ch", "ck", "sh", "ph", и прочее (10-15 комбинаций, не так уж и много) -- и список разделяемых комбинаций, в основном из гласных -- скажем "ea" в немецком допустимо разбивать (но "ae" по прежнему нельзя), или может быть хотим чтобы "eu" разбивалось, или "ia".
     Тогда последовательность работы программы такова: если нельзя разбивать то пропускаем и идём дальше (наперёд); если можно разбить (гласные) то разбиваем и заканчиваем; иначе (что случается чаще всего) разбиваем всегда одинаковые согласные (в некоторых языках это частое явление), разбиваем всегда Г-С, разбиваем иногда С-Г (но если раньше С имеется другая С разбиваем там), не разбиваем никогда перед неопределённой буквой (как сказал), и это вроде бы всё.
     Благо что в ДОС-е нет специальных галок поверх букв, и все буквы моноширинные. Но на экране, а и при печатании в Windows-е или в другой современной операционной системе, все эти проблемы существуют, так что нужно написать и следующий пункт.

3. Что делать если буквы бывают разных шрифтов, типов, и фонтов?

     Здесь я в основном буду гадать, так как у меня нет опыта в программировании в другой операционной среде, но думаю, что буду правильно угадывать, т.е. там просто должны существовать специальные процедуры, которые будут делать работу за вас, ибо вы все прекрасно знаете, что когда набираете что-то на файле то пишете на данной строчке пока можно, а когда уже нельзя то автоматично оказываетесь на другой строчке. Вот так-то. Но каковы эти процедуры, где они и как написаны (скорее всего на Visual Basic), как их вызывать (т.е. их имена и параметры) мне не известно, по простой причине, что теперь нужно за всё платить, не важно делаешь ли что-то полезное для других, или хочешь заработать что-то только для себя. Я привык работать для других, но раз с приходом демократии мне пришлось работать только для себя, то я и перестал работать для других, и стал писать всякие вещи per il mio diletto (в своё удовольствие, по итальянски), ведь так?
     Да ладно, так и быть, скажу, всё таки, своё мнение и в связи с этими вопросами. Программу нужно будет вызывать нажатием какой-то кнопки на панели редактора или браузера, должна быть возможность для её настройки, введением новых неразбиваемых последовательностей, также новых разбиваемых гласных (или префиксов, слогов), а то и новых гласных или согласных, так как могут быть разные алфавиты. Так что мы пришли к тому что делать с буквами у которых что-то сверху или снизу: программа должна распознавать также и эти буквы, как много бы их и ни было (и они, по идее, распознаются давно, потому что при изготовлении индексов в Word-е они обрабатываются правильно), и то для каждого алфавита. Наверное нужно для каждой буквы поддерживать и принадлежность к алфавиту, чтобы различать смешанные слова; но может быть оставить это, ибо существует куча языков где имеются по паре символов в добавлении к основным (скажем, "i" в украинском). Тогда при встрече непонятной буквы (но не любого символа), программа должна обрабатывать её как неопределённую букву и допускать перенос только после неё.
     Касательно всяких шрифтов и возможностей приукрашивания букв, что меняет их размер, то за это должна отвечать сама операционная система, с помощью вызова какой-то функции (скажем, DoesFitInLine (string, linelength) : Boolean). Но чтобы человек мог корригировать то что программа сделала, должна быть возможность вызывать её только для маркированной области, если таковая имеется, при условий на экране (т.е. продолжение параграфа) и понимать все параметры для неё которые должны браться из текущего параграфа (т.е. здесь нужны вызовы других служебных функций и процедур операционной системы или браузера). А, тексты и в таблицах должны быть тоже обработаны в соответствии с их параметрами для параграфов.
     Но, обратите внимание, что какой бы и несовершенной ни была такая программа, то она всё же была бы лучше теперешнего положения вещей, на что остановимся в следующем пункте. А если кто-то захочет возразить, что в реальном времени, и когда человек может нажатием одной клавиши (или с помощью мыши) изменить ширину окна и это вызовет переформатирование целого документа, то я отвечу коротко: это вовсе не существенно для современных компьютеров. Я (до 2015 года) работаю на компьютере где только 256 МВ оперативной памяти, не могу смотреть никаких movies, на диске у меня всего лишь 10 ГВ, из которых я держу 1/3 свободными, скорость процессора около 600 МГц, и при этом положении, при редактировании целой книги, примерно из 200 страниц, я могу выполнять грамматическую проверку (spell checking) за пару секунд, а это, положительно сложнее моей программе для переноса слов. Да и даже если на такую обработку нужно время, то если речь идёт о печати это не принципиально, а если для показа на экран, то достаточно обработать первую пару тысяч символов пока заполнится экран, и дальше проводить обработку в фоновом режиме; а к тому же можно спокойно держать пари что современные компьютеры хотя бы на порядок быстрее этого моего. Так что дело не в замедлении, а в нежелании, в необращении внимания на эту проблему.

4. А стоит ли морочить себе головы этим?

     Разумеется что стоит, ибо при всей фантастической мощи современных компьютеров и программных продуктов, без такой программы мы как будто находимся в ... каменной эре, или хотя бы пару тысячелетий раньше Христа, где люди выдалбливали на камнях букву за буквой, не признавая ни интервалов, ни знаков препинания, ни параграфов и страниц! Оно ведь в самом деле так. Даже когда высылают сообщения на мобильные телефоны их располагают точно так, и разбивают слова где попадётся без никакого дефиса (скажем, я спокойно мог получить такое сообщение по телефону: "Господин Мирск|ий, у вас имее|тся фактура дл|я использованн|ых услуг на ст|оимость в 12.3|4 левов" ... и так далее). Ведь, даже и без такой программы, нужно только узаконение одного символа как "опциональный дефис" и его правильное интерпретирование любым терминальным устройством, и все сообщения писать вставляя его везде где он может понадобиться -- да ничего подобного нет и по сей день.
     Ну, здесь всё пошло с английского, где, и условия для переноса сложные и не каждому средне взятому человеку ясные, и слова значительно (наверное на 3-4 символа) короче чем в русском или в немецком, но это просто некрасиво, а и процентов на 10 лишнее расхищение бумаги, если тексты действительно печатаются. Но я подозреваю, что налицо и другая причина: люди в коммерции привыкли к перфекции, и раз трудно ею добиться, то, давайте без неё (что, по мне, рассуждение на уровне детского сада). Даже простой перенос после последней из низа гласных (т.е. перед согласной) и разбиение некоторых согласных был бы довольно приемлемым.
     А возможен и альтернативный подход, который состоит в том, что нужно запускать грамматический анализ, где для каждого слова поддерживается его полное разбиение. Но это не только потребует работу для каждого языка в отдельности, что вовсе не универсально, а я люблю универсальность, да и вряд ли будет быстрее, грамматика куда более сложная, по моему. Или тогда пропускать каждый файл через программу (однократно, и вне реального времени), которая на базе полного словаря всех возможных слов и их вариантов (из за падежей, чисел, родов) добавляла бы все возможные опциональные дефисы и тогда от браузеров требуется только не показывать те из них, на которых строчка не будет оканчиваться. Это тоже очень хороший вариант, хотя бы для официальных документов, как законы и прочее распоряжения, но почему-то "интернетчики" решили отменить этот специальный знак, наряду с концом страницы или секции и прочее. Стали бы браузеры позволять хотя бы это, то тогда написание словаря с переносами было бы только нудным но не трудным заданием. Да хоть что-нибудь да делали, а не так сидеть и довольствоваться, хотя бы в некоторых отношениях, возможностями stone age.

     Ну, господа, как хотите. Я подал пример, сделал приличную программу, а кто-то если хочет осовременить идею для любого редактора или браузера пусть попытается. Я лично уже не собираюсь заниматься программированием, по простой причине, что не имею никакого времени -- коротко выражаясь: меня мало читают, и поэтому я стал переводиться, сначала на русский, потом (в процессе) на английский, собираюсь частично переводиться и на немецкий, и к тому же у меня намечена работа хотя бы на следующие 5 (а то и все 10) лет, а по статистике мне остаётся жить ещё примерно лет пять. Вот так-то. Но если какая-то фирма думает заняться этим, то пусть сначала вышлет мне 1,000 евро, для круглого счёта, только для подачи этой вполне реализуемой идеи, а там уж подумаем что ещё могут требовать и что я смогу предложить взамен и при каких условиях.

     11.2014





 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"