Лингвофорум

Теоретический раздел => Языки Дальнего Востока => Китайский язык => Тема начата: Alone Coder от мая 22, 2015, 15:31

Название: Рендеринг китайских иероглифов
Отправлено: Alone Coder от мая 22, 2015, 15:31
Как я понял, тексты на пиньине среди китайцев спросом не пользуются.

Какие есть решения для рендеринга китайских иероглифов в растр (допустим, 16x16 пикселей, 1 бит на пиксель) при ограниченном количестве памяти (допустим, 64 килобайта) и ограниченной скорости процессора?
Вопрос делится на несколько:
1. Какой набор иероглифов полностью достаточен для написания в принципе произвольных текстов?
2. Что делать с остальными иероглифами? Как принято поступать в таких случаях?
3. Реально ли сэкономить за счёт разделения иероглифов на элементы?
4. Реально ли сэкономить за счёт более мелких рисунков? (Мельче 12x12 не видел.)
(http://unifont.org/fontguide/images/wqy.png)

Уточню: кодировка текста может быть произвольной, как удобнее для экономии памяти.
Название: Рендеринг китайских иероглифов
Отправлено: Imp от мая 22, 2015, 17:47
Цитата: Alone Coder от мая 22, 2015, 15:31
Как я понял, тексты на пиньине среди китайцев спросом не пользуются.

Какие есть решения для рендеринга китайских иероглифов в растр (допустим, 16x16 пикселей, 1 бит на пиксель) при ограниченном количестве памяти (допустим, 64 килобайта) и ограниченной скорости процессора?
Вопрос делится на несколько:
1. Какой набор иероглифов полностью достаточен для написания в принципе произвольных текстов?
2. Что делать с остальными иероглифами? Как принято поступать в таких случаях?
3. Реально ли сэкономить за счёт разделения иероглифов на элементы?
4. Реально ли сэкономить за счёт более мелких рисунков? (Мельче 12x12 не видел.)
(http://unifont.org/fontguide/images/wqy.png)

Уточню: кодировка текста может быть произвольной, как удобнее для экономии памяти.
нужно примерно 5000 знаков для покрытия подавляющего большинства современных текстов на китайском, в большинстве используемых сейчас кодировок знаков даже несколько больше, от 6 до 7 с половиной тысяч (в кодировке для упрощённых и традиционных знаков соответственно).

Если попадается знак, которого нет в кодировке его заменяют изображением, но это делается крайне редко, потому что такие знаки встречаются только в старых текстах

Я не знаю, что такое растр и вообще не уверен, что вы именно это хотели услышать  :)
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от мая 22, 2015, 18:27
Раньше иногда практиковалось разбиение иероглифов пополам, и кодирование каждой половины, например в виде ячейке 8x16, отдельно. Так экономилась куча позиций. Но это далеко не панацея.
Название: Рендеринг китайских иероглифов
Отправлено: Alone Coder от мая 22, 2015, 20:20
Цитата: Imp от мая 22, 2015, 17:47
нужно примерно 5000 знаков для покрытия подавляющего большинства современных текстов на китайском, в большинстве используемых сейчас кодировок знаков даже несколько больше, от 6 до 7 с половиной тысяч (в кодировке для упрощённых и традиционных знаков соответственно).
А как найти эти списки?

5000 глифов 16x16 - это уже 160K графики...
Название: Рендеринг китайских иероглифов
Отправлено: Python от мая 22, 2015, 21:01
Порядок кодовых позиций иероглифов в юникоде — что он собой символизирует? Допустим, латинские буквы основного набора идут в алфавитном порядке (отдельными блоками для верхнего и нижнего регистра), то же касается букв русской кириллицы, греческого и пр.; цифры идут в порядке возрастания; символы катаканы и хираганы упорядочены по согласной и гласной; символы согласных в деванагари сгруппированы по фонетическим признакам. Какую информацию об иероглифе можно получить, зная лишь его код?
Название: Рендеринг китайских иероглифов
Отправлено: Toman от мая 22, 2015, 22:11
Цитата: Alone Coder от мая 22, 2015, 20:20
5000 глифов 16x16 - это уже 160K графики...
Интересно, насколько оно сжимается... А сырой векторный вид при таком разрешении будет ещё жирнее растра, увы (примерно раза в полтора, наверное).
Название: Рендеринг китайских иероглифов
Отправлено: Joris от мая 23, 2015, 01:25
Цитата: Python от мая 22, 2015, 21:01
Порядок кодовых позиций иероглифов в юникоде — что он собой символизирует?
По 214 ключам (у них у каждого есть порядковые номера), а в каждом ключе по количеству черт по возрастанию
Название: Рендеринг китайских иероглифов
Отправлено: Rwseg от мая 23, 2015, 05:45
Цитата: Alone Coder от мая 22, 2015, 20:20
А как найти эти списки?
Китайские иероглифы и статистика (http://lingvoforum.net/index.php/topic,58585.0.html)
http://www.lancs.ac.uk/fass/projects/corpus/data/top50000_Chinese_words.zip
http://www.lancs.ac.uk/fass/projects/corpus/data/Chinese_character_frquency_list.zip
http://www.lancaster.ac.uk/fass/projects/corpus/LCMC/
Название: Рендеринг китайских иероглифов
Отправлено: Alone Coder от мая 23, 2015, 09:36
Самые-самые частые иероглифы тут http://www.commonchinesecharacters.com/Lists/MostCommon2500ChineseCharacters
сильно отличаются от самых-самых частых тут: http://www.routledge.com/books/details/9780415455862/
Это очень странно.

Пока вырисовывается такой вариант: 2500 иероглифов иметь в шрифте (98% текста), остальные 2% текста картинками. При этом будет 80K графики и в среднем 2.6 байта на символ. Пока ещё не влезает в 64К.

Для сравнения, в 64K влезет текст из 2000 иероглифов, если весь текст хранить картинкой. Это тоже слишком мало.

Цитата: Toman от мая 22, 2015, 22:11
Интересно, насколько оно сжимается...
Надо ещё и разжимать на лету...

Цитата: Hellerick от мая 22, 2015, 18:27
Раньше иногда практиковалось разбиение иероглифов пополам, и кодирование каждой половины, например в виде ячейке 8x16, отдельно. Так экономилась куча позиций. Но это далеко не панацея.
Интересно, насколько помогает разбиение символов на левую и правую половины? Может, надо разбивать не прямо посередине, а одна часть перекрывает другую?
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от мая 23, 2015, 11:09
Вы сейчас пытаетесь вывести ZX Spectrum на китайский рынок?
Название: Рендеринг китайских иероглифов
Отправлено: Imp от мая 23, 2015, 11:41
Цитата: Alone Coder от мая 23, 2015, 09:36
Пока вырисовывается такой вариант: 2500 иероглифов иметь в шрифте (98% текста), остальные 2% текста картинками.
я бы сильно рекомендовал как минимум 3500 знаков в шрифте
Название: Рендеринг китайских иероглифов
Отправлено: Bhudh от мая 23, 2015, 12:23
Цитата: Alone Coder от мая 23, 2015, 09:36
Интересно, насколько помогает разбиение символов на левую и правую половины? Может, надо разбивать не прямо посередине, а одна часть перекрывает другую?
Если есть возможность, можно вообще сделать отдельные элементы и соединять их в иероглиф. Прямо по видам разбиения: (http://teilnehmer.somee.com/WpfTextImage/Make.ashx?src=W2Y9VW5pdmVyc2FsaWFd4r-w4r-x4r-y4r-z4r-04r-14r-24r-34r-44r-54r-64r-7Wy9mXQ).
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от мая 23, 2015, 12:30
Ну да, всё уже придумано до нас. По-хорошему, надо максимально полно Cangjie (https://en.wikipedia.org/wiki/Cangjie_input_method) воспроизводить.
Название: Рендеринг китайских иероглифов
Отправлено: Тайльнемер от июля 15, 2015, 08:27
Цитата: Bhudh от мая 23, 2015, 12:23
Если есть возможность, можно вообще сделать отдельные элементы и соединять их в иероглиф. Прямо по видам разбиения: (http://teilnehmer.somee.com/WpfTextImage/Make.ashx?src=W2Y9VW5pdmVyc2FsaWFd4r-w4r-x4r-y4r-z4r-04r-14r-24r-34r-44r-54r-64r-7Wy9mXQ).
А эти вот разбиения применяются рекурсивно или однократно к элементарным символам?
И сколько всего элементарных символов?
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от июля 15, 2015, 08:39
Цитата: https://en.wiktionary.org/wiki/鬱鬱 (radical 192 鬯+19, 29 strokes, cangjie input 木木月山竹 (DDBUH), four-corner 44722, composition ⿳⿲木缶木冖⿰鬯彡)
Название: Рендеринг китайских иероглифов
Отправлено: Тайльнемер от июля 15, 2015, 09:52
А, то есть, рекурсивно.
А вот эта жуть «鬯» — это элементарный символ? Его нельзя разложить?
Название: Рендеринг китайских иероглифов
Отправлено: Imp от июля 15, 2015, 10:11
Цитата: Тайльнемер от июля 15, 2015, 09:52
А, то есть, рекурсивно.
А вот эта жуть «鬯» — это элементарный символ? Его нельзя разложить?
можно, как минимум на два, по середине, но можно даже на четыре и даже на пять, при желании
Название: Рендеринг китайских иероглифов
Отправлено: Imp от июля 15, 2015, 10:13
Лучше объясните, что значит в данном случае рекурсивно, а то вот из этого мало что понятно:
Цитата: Тайльнемер от июля 15, 2015, 08:27
А эти вот разбиения применяются рекурсивно или однократно к элементарным символам?
Название: Рендеринг китайских иероглифов
Отправлено: Тайльнемер от июля 15, 2015, 10:34
Цитата: Imp от июля 15, 2015, 10:13
Лучше объясните, что значит в данном случае рекурсивно, а то вот из этого мало что понятно:
Под «рекурсивно» я имел в виду, что элементами разбиения могут быть не только элементарные символы, но и разбиения.

Цитата: Imp от июля 15, 2015, 10:11
можно, как минимум на два, по середине, но можно даже на четыре и даже на пять, при желании
А почему тогда в примере выше его не разбили?
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от июля 15, 2015, 10:39
Наверное, потому что логически это законченный элемент. Дальнейшее деление возможно только по формально-графическому принципу.

Цитировать鬯 (radical 192 鬯+0, 10 strokes, cangjie input 山戈心 (UIP), four-corner 22711, composition ⿱𠚍匕)

Цитировать𠚍 (radical 17 凵+6, 8 strokes, composition ⿶凵𠂭)
Название: Рендеринг китайских иероглифов
Отправлено: Тайльнемер от июля 15, 2015, 10:51
То есть, есть два принципа деления: логический и формально-графический?
Для проблемы, заявленной в первом сообщении темы, думаю, как раз формально-графический подойдёт.
鬱  =  ⿳⿲木缶木冖⿰⿱⿶凵𠂭匕彡
И сколько всего элементарных символов надо для представления любого иероглифа в таком виде?
Один и тот же символ в разных позициях отличается только масштабами по осям или может отличаться ещё чем-то?
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от июля 15, 2015, 10:59
Однозначный ответ найти будет трудно.

В любом случае сначала вам нужно составить список рендеруемых иероглифов. Это не так просто: в отличие от японцев китайцы не склонны составлять ограниченные списки своих иероглифов.
А уже потом надо выуживать базу данных по декомпозиции данных иероглифов. А там и практический ответ на ваш вопрос будет.
Название: Рендеринг китайских иероглифов
Отправлено: Тайльнемер от июля 15, 2015, 11:00
Цитата: Hellerick от июля 15, 2015, 10:59
А уже потом надо выуживать базу данных по декомпозиции данных иероглифов.
А в базе есть и логическое деление, и графическое?
Название: Рендеринг китайских иероглифов
Отправлено: Imp от июля 15, 2015, 11:38
Цитата: Hellerick от июля 15, 2015, 10:59
В любом случае сначала вам нужно составить список рендеруемых иероглифов. Это не так просто: в отличие от японцев китайцы не склонны составлять ограниченные списки своих иероглифов.
и для китайского, как традиционного, так и для упрощённого, такие списки есть. Есть списки самых используемых, есть списки используемых в современной печати, с разбивкой по частотности. Это как раз не проблема
Название: Рендеринг китайских иероглифов
Отправлено: Юрий Б. от июля 15, 2015, 11:56
Реальным режимом развлекаетесь?
Название: Рендеринг китайских иероглифов
Отправлено: Тайльнемер от июля 15, 2015, 12:06
Цитата: Юрий Б. от июля 15, 2015, 11:56
Реальным режимом развлекаетесь?
Скорее, «Спектрумом».
Название: Рендеринг китайских иероглифов
Отправлено: Rwseg от июля 17, 2015, 22:57
Цитата: Hellerick от июля 15, 2015, 08:39
Цитата: https://en.wiktionary.org/wiki/鬱鬱 (radical 192 鬯+19, 29 strokes, cangjie input 木木月山竹 (DDBUH), four-corner 44722, composition ⿳⿲木缶木冖⿰鬯彡)
Пришлось увеличить масштаб в браузере до 300%, чтобы рассмотреть первый и второй иероглифы. :fp: Как раз такие вещи от китайского и отталкивают. :(
Название: Рендеринг китайских иероглифов
Отправлено: Alone Coder от июля 18, 2015, 23:38
Единичные исключения можно рисовать картинкой. Тут бы найти простой и нежручий метод, который покрывает подавляющее большинство случаев.
Название: Рендеринг китайских иероглифов
Отправлено: Demetrius от июля 30, 2015, 02:17
Цитата: Alone Coder от мая 22, 2015, 15:31
1. Какой набор иероглифов полностью достаточен для написания в принципе произвольных текстов?
Никакой. Это открытая система. А вообще, иероглифы за пределами базовой плоскости уникода Уникода почти не встречаются.

Цитата: Alone Coder от мая 22, 2015, 15:31
2. Что делать с остальными иероглифами? Как принято поступать в таких случаях?
Я видел где-то в интернете Шаньхайцзин, где отсутствующие иероглифы заменялись на что-то типа [上X下Y]. Но это древний текст, где очень важно сохранить иероглиф. В обычных текстах вполне можно просто заменить омонимом (果 вместо 嗰), а то и вообще латиницей (D вместо 啲). В кантонском ещё компонент «рот» часто заменяют на o (o的 вместо 啲).

Цитата: Alone Coder от мая 22, 2015, 15:31
3. Реально ли сэкономить за счёт разделения иероглифов на элементы?
Да.

Цитата: Alone Coder от мая 22, 2015, 15:31
4. Реально ли сэкономить за счёт более мелких рисунков? (Мельче 12x12 не видел.)
Нет. Довольно быстро большинство иероглифов становятся нечитаемыми (http://www.spriters-resource.com/nes/cv3/sheet/67677/).

Цитата: Hellerick от мая 23, 2015, 12:30
Ну да, всё уже придумано до нас. По-хорошему, надо максимально полно Cangjie (https://en.wikipedia.org/wiki/Cangjie_input_method) воспроизводить.
Я бы не советовал. Цанцзе сильно привязан к тому, что это система ввода, и поэтому он больше оптимизирован для ввода, чем для программного вывода.

Цитата: Alone Coder от июля 18, 2015, 23:38
Тут бы найти простой и нежручий метод, который покрывает подавляющее большинство случаев.
Мне кажется, что имело бы смысл взять базу разбиений (тыц (http://cjkdecomp.codeplex.com/), тыц (https://commons.wikimedia.org/wiki/Commons:Chinese_characters_decomposition)) и написать скрипт, который найдёт максимально эффективное разбиение. Проблема в том, что разбиения не всегда в пропорции 1:1 (для самых частых компонентов это что-то типа 1:2).

Ещё мне кажется лишним кодировать сразу и упрощённые, и традиционные. Всё равно конкретный человек обычно предпочитает либо те, либо те. Поэтому брать те начертания, которые использует целевая аудитория.

Цитата: Тайльнемер от июля 15, 2015, 09:52
А, то есть, рекурсивно.
Оно рекурсивно только в одну сторону. При переходе от формы к коду мы разбиваем иероглиф рекурсивно. При рисовании знака по коду у нас рекурсии нет, нужно составлять таблицы.

Мы разбиваем основной иероглиф по основному разбиению (снаружи внутрь; если нельзя, то снизу вверх; если нельзя, то слева направо). Если разбиение даёт два компонента, то от первого берётся два знака, от второго — три (說 YRCRU/卜口金口山  = 言 Y[MM]R/卜[一一]口 + 兌 CR[H]U/金口[竹]山). Если есть три явных компонента, то 2 + 2 + 1 (謝 YRHHI = 言 Y[MM]R + 身 + H[X]H + 寸 [D]I). Если какой-то компонент сам по себе неделимый, то на другие будет больше места (как в случае с 鬱, где «крышка» между 木缶木 и 鬯彡 пишется одной буквой — B/月, поэтому имеем 2+1+2).

Таким образом, в вашем примере:
鬱 DDBUH = 木缶木 D[OJU]D + крышка B + 鬯彡 U[PHH]H
Иероглифа [鬯彡] нет, но если бы он был, он бы писался UPHHH = 鬯 UP + 彡 HHH
彡 естественным образом разбивается на HHH
鬯 UIP = обрамление снизу U  + I[???]I + ヒ P — тут я даже не знаю, как его разбить

Таким образом, при вводе в компьютер мы разбираем иероглифы рекурсивно. При выводе — не рекурсивно. Из DDBUH никак не узнаешь, что DD — это на самом деле DJOUD.
Название: Рендеринг китайских иероглифов
Отправлено: Alone Coder от октября 20, 2015, 10:04
Когда китайские иероглифы стали квадратными? Какой в этом был смысл до изобретения подвижных литер (по официальной истории в XI веке)?
Можно предположить, что иероглифы типа [12] слились в один до того, как стали квадратными. Так ли это?
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от октября 20, 2015, 10:15
Я так понимаю, иероглифы предназначены для рисования на бамбуковых дощечках.

(http://i.imgur.com/DVVOZEY.jpg)

Ширина дощечек определяет ширину иероглифа. Высота иероглифа была стандартизирована, чтобы четче понимать, где кончается один, и начинается другой иероглиф. Ну а потом просто для того, чтобы красивше было.
Название: Рендеринг китайских иероглифов
Отправлено: Alone Coder от октября 20, 2015, 10:21
Однако египтяне, которые тоже писали на тростнике, имели неквадратные иероглифы. И монголы, которые тоже писали вертикально, не старались отделять символы или делать их одной высоты...
Название: Рендеринг китайских иероглифов
Отправлено: Hellerick от октября 20, 2015, 10:25
У египтян был папирус без особых ограничений по площади.
У монголов была алфавитная письменность. Если символов не так много, то в них труднее запутаться.
Название: Рендеринг китайских иероглифов
Отправлено: mnashe от октября 20, 2015, 10:35
Цитата: Hellerick от мая 22, 2015, 18:27
Раньше иногда практиковалось разбиение иероглифов пополам, и кодирование каждой половины, например в виде ячейке 8x16, отдельно. Так экономилась куча позиций.
Может, это делалось не столько для экономии позиций, сколько для вписывания в удобный технический стандарт (по одному байту на строку растра)?
Я понимаю, что текстовый режим всё равно неприменим (в 512 позиций никак не впишешься), но думаю, что и в графических режимах до появления Windows старались использовать восьмипиксельные символы.
Название: Рендеринг китайских иероглифов
Отправлено: Demetrius от октября 20, 2015, 11:40
Цитата: Alone Coder от октября 20, 2015, 10:04
Когда китайские иероглифы стали квадратными? Какой в этом был смысл до изобретения подвижных литер (по официальной истории в XI веке)?
Зависит от того, что Вы понимаете под «квадратными».

— Если общую тенденцию к прямоугольным линиям и избеганию кругов, то это, действительно, было в письме 隸書 dàisyū (лишу; clerical script), которое действительно связывают с появлением бамбуковых дощечек.

— Если под «квадратными» понимается вписанность в квадрат, то в дайсю они ещё были вписаны не в квадрат, а в прямоугольник (высота была меньшей, чем ширина; это экономило место на бамбуковых дощечках). В более поздних стилях они квадратные, но и в более ранних, наверное, можно найти такие, пропорции которых стремились к квадрату.

— Если имеется в виду вписанность иероглифа в прямоугольник, при котором сравнительно легко выделить границы символов, то что-то такое можно найти уже в чжоуских гадательных надписях (пусть и не очень аккуратно):
(http://simplified-traditional.com/wp-content/uploads/2010/06/Jiaguwen.jpg)

Цитата: Alone Coder от октября 20, 2015, 10:04
Можно предположить, что иероглифы типа [12] слились в один до того, как стали квадратными. Так ли это?
Насколько я понимаю, нет. Иероглифы типа [12] в древнейших надписях писались обычно только с фонетическим компонентом, т.е. вместо [12] писали 2 (или 1), а добавление семантических компонентов происходило позже для уточнения, и с сохранением вписанности в прямоугольник.

Цитата: Alone Coder от октября 20, 2015, 10:21
Однако египтяне, которые тоже писали на тростнике, имели неквадратные иероглифы.
У них язык был другой. У египтян слова часто были в несколько слогов, тогда как у китайцев почти всегда в один (сейчас, правда, говорят о полутораслогах, т.е. были слова в два слога, где первый редуцированный, но это картины не меняет). В результате у египтян не было соответствия «один знак — один слог [или полутораслог]» и не было нужды, добавляя новые детерминативы, вписывать их внутрь существующего символа.

Цитата: Alone Coder от октября 20, 2015, 10:21
И монголы, которые тоже писали вертикально, не старались отделять символы или делать их одной высоты...
У этих письменность вообще по другому принципу построена.
Название: Рендеринг китайских иероглифов
Отправлено: Demetrius от октября 20, 2015, 11:57
Цитата: Demetrius от октября 20, 2015, 11:40
Насколько я понимаю, нет.
Я зря тут дал ответ «нет», т.к. неясно, что вы понимаете под квадратностью. Но о слиянии речь не идёт, т.к. «неслитых» форм в принципе не было, НЯП.