Метод кодирования и ввода китайских иероглифов, основанный на подсчёте типов черт

Метод кодирования и ввода китайских иероглифов, основанный на подсчёте типов черт

Метод кодирования и ввода китайских иероглифов, основанный на подсчёте типов черт

Здравствуйте уважаемые читатели «Магазеты». Позвольте представить вашему вниманию свой первый технически-публицистический опус на тему, связанную с информационными аспектами поддержки иероглифической письменности в компьютерных системах. Я хочу рассказать об интересном способе структурного кодирования китайских иероглифов, который недавно родился в моей голове, как плачевный результат многолетних диких «экспериментов» в попытке создания самодельной программы, типа: «Очередная OCR для кiтайскiхъ знаковъ». Но прежде, необходимо вспомнить, какие типы структурного кодирования китайского иероглифа можно выделить среди существующих IME :

A. Описание последовательности или множества графем в структуре знака;
B. Описание последовательности или множества типов черт в структуре знака;
С. Подсчет типов топологических соединений черт в знаке («крест», «угол», «стык» и т.п.);
D. Подсчет различных типов черт в структуре знака;
E. Сегментация знака на зоны (углы), и анализ наличия в зонах черты или графического элемента;
F. Классические ключевые знаки и декомпозиция.

Именно про способ типа D я буду рассказывать в этой статье. Описаний методов, основанных на подсчёте черт разного типа, я, к сожалению, находил очень мало. Найденные в Сети методы, довольно близкие к описываемому в этой статье способу подсчёта черт разного типа, представлены в патентах: US4758979, US20030020738.

Давайте представим себе новичка-китаиста, который преодолев священный ужас перед великими и бесконечными числом «ханьцзы», но все ещё со страхом в коленках, начал изучать великий и могучий язык Поднебесной. Конечно же, тут у него начинаются и учебники, и аудио курсы и т.п. Но рано или поздно, возникают проблемы чисто технического плана: «А как вообще вводить редкие и не очень знаки, и иероглифы вообще без звучаний на всевозможных PC, КПК и пр.?». Ну да, есть много всевозможных структурных IME. Но любой из них зачастую требует знания следующих пунктов:

— Последовательность классического начертания знака;

— Типы каллиграфических черт китайского иероглифа;

— Способы подсчёта черт в китайском иероглифе;

— Список базовых правил декомпозиции для каждого из современных методов ввода.

Да что там новичок, зачастую и матёрому китаеведу профессионалу иногда требуется ввести ну очень редкий знак, чтение которого либо забыто, либо утрачено, либо его вообще никогда не было. И что теперь, человеку из-за таких нечастых нужд нужно тратить своё время и осваивать один из методов структурного ввода: CangJie, WuBi или ещё что-то там с их правилами и многочисленными исключениями из правил? Нет, давайте что-нибудь придумаем более простое и очень удобное в освоении. Именно эту простоту обеспечивает подсчёт базовых графически примитивов китайского иероглифа – его черт.

Главным вопросом здесь является: «Что будем считать чертой?». Классическая китайская каллиграфия однозначно дает правила начертания и различные типы черт, многие из которых являются композиционно составленными даже из нескольких отрезков ломаных линий или кривых, что, конечно же, сложно для сегментации и распознавания знака. При базовом использовании принципов OCR естественно считать за черту прямолинейные отрезки или отрезки кривых до любого излома.

Давно, ещё в 2000 г., я пытался делать OCR для иероглифов, но всё благополучно оканчивалось подсчётом пикселов в вертикалях и горизонталях растра, и на подсчёте диагональных черт я, как и следовало ожидать, наглухо стопорился. Так вот, этот печальный опыт как раз недавно и напомнил мне, что, сколько бы ни придумывали в Юникоде базовых черт (теперь их вроде уже 36 или более), с точки зрения OCR черты ну очень надёжно можно разделить на вертикальные, горизонтальные и наклонные. Именно так воспринимает иероглиф человек, начинающий изучать китайскую иероглифическую письменность. Далее, для разнообразия добавим ещё изолированную наклонную, чаще всего её представляет черта – точка «дянь», особенно выгодно использовать этот тип черт для описания многочисленных знаков, содержащих элемент «огонь внизу, 4 точки – дянь». И, как самую иерархически крупную часть, добавим подсчёт числа элементов в виде замкнутого квадрата – «рот». И вот получилось 5 знакомест для результатов подсчёта черт разного типа – имеем новый способ кодирования!

Ещё один важный вопрос: «Что взять за шрифтово-каллиграфическую основу при кодировании иероглифических знаков?». Разумеется, это должны быть не Лишу, и даже не Кайшу и им подобные стили. Это должны быть стили, удобно ориентированные на алгоритмы OCR. Т. е. должны быть чётко выделены прямые вертикальные и горизонтальные черты. Тут тогда остаются только три варианта ответа: Хэй, Сун или Мин. Для меня наиболее однозначными, подробным в плане изображения черт, и внутренне логичными, конечно же, являются иероглифы из шрифтов, выполненных в стиле Мин (MingLiU, PMingLiU и др.). Стиль Сун имеет уже некие свои упрощающие отступления от классики стиля Мин. А квадратно-рубленный грубый стиль Хэй – я не думаю, что стоит его знаки брать за основу при кодировании подсчёта именно типов черт, хотя чисто для задач OCR он, наверное, подходит больше.

Собственно, способ кодирования

Теперь подробнее о способе кодирования. Итак, имеем 5 жёстко фиксированных знакомест. В порядке возрастания значимости записываем справа налево:

1) Количество прямых горизонтальных черт;

2) Количество прямых вертикальных черт;

3) Количество любых наклонных черт, пересекающихся или соединяющихся с какой-либо другой чертой;

4) Количество изолированных наклонных черт;

5) Количество строго или почти изолированных обрамлений в форме квадратных (прямоугольных) элементов «рот» (а также его производных – «день», «глаз» и др.), не связанных вертикальной, горизонтальной или наклонной линиями, проходящими вдоль по одной или нескольким сторонам квадрата (прямоугольника). Пример: 尸– «рта» нет, 侣 – «рты» есть; 侶 – «рты» есть; 佀 – «ртов» нет.

Количество черт каждого типа записывается одной цифрой либо в десятичном (1..9), либо в шестнадцатеричном (0,1,2..F) варианте записи. Если число черт данного типа более, чем 9 или F (это в десятичной системе равно 15), то число ограничивается соответственно до 9 или F, в зависимости от выбранной системы счисления для представления числа в разряде кода. Например, для известного иероглифа в 36 черт [nang4], который по какому-то недоразумению, всё-таки пролез в книгу рекордов Гиннеса (вообще-то, в Юникоде есть знаки и по 64 черты и более), вполне хватает без переполнения разряда десятичной записи.

Метод кодирования и ввода китайских иероглифов, основанный на подсчёте типов черт

В общем, выбор десятичного или шестнадцатеричного вариантов записи числа будет диктоваться используемым для ввода набором символов. Ясно, что для ввода, например, всех 42710 редких знаков из Unicode CJK Extension B, скорее всего, больше подойдёт шестнадцатиричный вариант записи числа в каждом разряде.

Вертикальная или горизонтальная черта, даже если она рассекается несколькими перпендикулярными ей чертами, всё равно считается одной. Другими словами, с позиций классификации топологических связей, границами черты нужно считать либо «углы» (точка и два примыкания), либо «стыки» (точка и три примыкания), но никак не «кресты» – пересечения (точка и четыре примыкания).

Теперь основные спорные моменты способа кодирования сосредоточены вокруг типов черт «изолированная наклонная» и «наклонная». Именно здесь возможны шрифтовые и каллиграфические неоднозначности: в одном шрифте наклонная черта может примыкать к другой черте, а в другом стиле шрифта она может быть изолирована. Ещё такие же вопросы может вызывать очень небольшой наклон явно вертикальной черты, не позволяющий считать её вертикальной в некоторых иероглифах. Вот следующий перечень базовых положений и исключений при кодировании. Повторю, все выкладки ориентированы на стиль начертания Мин.

Определяющие правила при кодировании типов строк:

— В элементе入[ru4] небольшую горизонтальную линию (начертание Ming) вверху не считать. (入=00200);

— Вертикальную черту 亅с крючком внизу считать просто вертикальной, (亅=00010);

— Точечный элемент сверху в ключе宀 нужно рассматривать как вертикальную черту, а элементы сбоку – как наклонные, (宀=00211);

— Черту 乚 рассматривать как одну наклонную, несмотря на всю её угловатость, (乚=00100), аналогично (匸=00101);

— В элементах типа 广, 亠 верхнюю точку считать за вертикальную, а в 户 – как наклонную, (广=00111, 亠=00011, 户=00212, что аналогично родительскому варианту 戶=00212);

— Большую «несущую» квазивертикальную черту, как в знаках 五, 丑, считать наклонной, (五=00113, 丑=00203);

— Черту 丿считать наклонной, (丿=00100);

— В элементах типа 力,刀,勹 квазивертикальную часть завершающей классической черты с крючком считать наклонной, (力=00201, 力=00201, 勹=00201);

— Черту 乀 считать одной наклонной, несмотря на небольшой «хвостик»,(交=02211);

— В элементе弓 квазивертикальную черту считать наклонной, (弓= 00213);

— В элементах冫и 氵, несмотря на небольшой излом, главную черту считать одной изолированной наклонной. Обобщенно, всё, что генетически происходит от элемента 冫, следует и далее считать двумя изолированными наклонными;

— И напоследок, если ситуация с касаниями наклонных очень спорная, то кроме явной генетической связи с 丶,丷 или 冫, в остальных случаях следует стремиться уменьшать число в разряде «изолированных наклонных». Примеры кодирования особых случаев неявных касаний почти изолированных наклонных черт, в знаках: 丬=02010, 夕=01201, 氺=02210, 兆=02400, 刅=刅=02201 (аналогично刃=01201), 疒=02111, 癶=01401, 立=02012, 火=01300, 糸=02510, 羊=02013, 羽=04022, 丫=01110, 冫=02000, аналогично氵=03000, но 下=00111, 不=00211, 飞=00301. Ещё примеры на рисунках ниже.

Метод кодирования и ввода китайских иероглифов, основанный на подсчёте типов черт Метод кодирования и ввода китайских иероглифов, основанный на подсчёте типов черт

Теперь расскажу об одном очень интересном свойстве «изобретённого» кода. Прежде всего, при таком способе, коды близких по начертанию знаков оказываются очень близки в пятимерном кодовом пространстве. Т. е. расстояние Хаффмана между ними минимально. Действительно, гибкий и «многоепрощающий» способ. Это будет удобно при обработке ошибок кодирования ввода иероглифов, особенно с разными вариантами начертания. Например: в составе сложного знака встретился вариант 戸радикала戶. Но (戸=00113), а (戶=00212). Т. е. из одного разряда убрали единичку и перекинули в другой разряд, и всё. Так можно облегчать ввод, делая поиск графических вариантов (±1,2…черты) по заранее выбранным схемам замены вариантов типа черты в соответствующих разрядах кода: «наклонная»–«горизонтальная», «наклонная»–«изолированная наклонная». Элементы, содержащие «рот» сюда не попадают, поскольку его спутать с вариантами других типов черт невозможно, поэтому размытый поиск ±1,2… должен будет рассматриваться только в одном из четырёх младших разрядов. Это же свойство также будет полезно и в OCR технологиях распознавания. Т.е. результаты данного способа кодирования могут быть одинаково успешно использованы как для систем ввода, так и для систем OCR.

Еще одно полезное свойство – начинающий китаист прямо из кода приближённо сможет узнать количество «классических» строк, для того же иероглифа 齉– число строк 36, подсчитаем теперь по разрядам из соответствующего рисунка выше, не забыв умножить на 3 самый старший разряд (догадайтесь почему). Получилось 3*5+0+8+6+9=38, что очень даже близко к результатам классического подсчёта.

Информационная ёмкость кодирования: в десятичном варианте (0,1,2..9) равна 10^5=100 000, а в шестнадцатеричном варианте представления кода (0,1,2…F) ёмкость равна 16^5=2^20=1048576=1 M. Этого вполне хватает, чтобы закодировать все ханьцзы Юникода. Также не случайно я иерархически расположил разряды кода. Если фиксировано закрепить при вводе все 5 разрядов, то для одного знака необходимо будет всегда 5 нажатий, но если ввод реализовать, например так: 00324=324+пробел, то вместо 5 нажатий на ввод одного знака понадобится меньше (я предполагаю, что в среднем для 3000 наиболее часто встречаемых знаков будет около 4 нажатий/знак). Это выгодно приближает описываемый метод к «рекордсменам» по однозначности кодирования и скорости ввода китайского текста: УБи (3,5 нажатия/знак и ЦанЦзе – 4 нажатия/знак).

В заключение хочу сказать, что я никоим образом не претендую на новизну описываемого метода. Более того, было бы неплохо провести дополнительное исследование еще и патентов КНР, Тайваня и Гонконга. Ведь методов кодирования и ввода китайских иероглифов было придумано за 60 лет превеликое множество. И, очень вероятно, что полный аналог описанного метода кодирования существует. Может кто-то из читателей встречал что-то подобное? Да и сама эта идея довольно экзотична: «Ведь новый метод ввода и кодирования китайских иероглифов может родиться не только в Поднебесной, но и в России!».

Благодарю за внимание.
WERTA, 2012/06/24

P.S. В следующей статье я расскажу вам о вопросах численного кодирования и фонетической унификации разнообразных диалектных чтений иероглифов.

Фото аватара

Автор: WERTA

Фанат грамоты на кiтайскiхъ знакахъ. Родился в 1977 г. Проживаю в РФ. Интерес к китайскому я зыку и культуре внезапно проснулся в 1997 г. Особенно интересует меня все, что касается: международных стандартов CJKV унификации, кодировок, методов ввода, схем романизации и общей фонологии основных кит. диалектных групп. За границей не был, КНР не посещал. Опыта языкового общения с носителями китайского языка не имею. Перевел в 2011 г. c традиционного китайского на русский язык компьютерную игру 殖民計劃 — Colonial Project (DOS, RTS, 1996, T-Time Corp.).