Пару лет назад я написал демонстрационный пример / демонстрацию, который создал алфавит и словарь для семического письма. Для NaNoGenMo 2017: Я модифицировал его, чтобы использовать PIL вместо turtle, использовать цепочки Маркова (вместо выбора случайных слов) и писать в изображение страницы размером A1.

Я хотел бы сделать пару заметок о том, что здесь происходит под капотом.

Сначала я создаю набор символов.

Каждый символ - это серия штрихов, разделенных сменой угла. Первоначально эта логика предназначалась для системы pyturtle на основе пера, которая имела большой смысл для имитации почерка. Итак, росчерк переходит в следующий - любой символ можно нарисовать, не отрывая пера, за исключением акцентов. (Персонаж может иметь одну или две точки или серьезные / острые акценты - если у персонажа две точки, это умляут, а если у персонажа есть и острый, и серьезный акцент, у него есть карат.)

Каждый элемент иероглифа, за исключением ударения, на самом деле фонетический: каждый тип штриха - это согласный звук, а каждое изменение угла - это гласный звук. (Это навеяно хангылем, где то, что кажется логограммой, на самом деле представляет собой группу из трех фонетических символов.) В этом случае у нас есть до пяти пар штрих-угол. Эти фонетические чтения не используются, но в исходной версии скрипта они присутствовали при отладке.

Штрихи могут быть как полной, так и половинной длины, и они могут быть как линиями, так и полукругами. Изменение угла ограничено интервалами в 45 градусов (то есть 45, 90, 180, -45 и -90). Эти ограничения призваны имитировать виды различий, которые могут действительно работать в рукописном языке - между отдельными символами должен быть большой порог, иначе его легко будет неправильно прочитать.

Набор символов составляет от 20 до 36 символов - примерно такой же диапазон, как в действительности для одно- или двухзвенных символов в фонетических системах письма. Поскольку в нашем на самом деле до пяти слогов на символ, нам действительно должно быть намного больше, но это неприятно.

Затем я создаю словарь, комбинируя случайные символы. Изначально у меня была предвзятость к коротким словам, и я привязал эту предвзятость к частоте слов, но я больше этого не делаю, потому что у меня были проблемы с выводом. Словарь должен содержать около 300 слов, от одного до пяти символов.

Когда у меня появляется словарный запас, я создаю нечто похожее на грамматику, создавая набор предложений, марковская модель которых будет напоминать марковскую модель реального языка. По сути, я создаю пул предложений и накапливаю случайно выбранные слова из словаря в случайно выбранные части пула при наращивании пула. В результате у некоторых слов будут значительно более сильные ассоциации, поэтому, как только мы создадим марковскую модель, распределение материала, полученного в результате цепочки из этой модели, будет zipf - я думаю. На самом деле я не рассчитал это должным образом, поэтому могу полностью ошибаться.

Я создаю изображение для каждого слова в словаре, а затем связываю и отображаю результат на страницах. У меня было много строк из одного слова, поэтому я создал фильтр, который объединял строки в 98% случаев, что привело к уменьшению количества страниц до чего-то более разумного.

В моем первом pdf символы немного трудно разглядеть, так как базовая единица штриха очень мала (5 пикселей). Итак, я создал второй с базовой длиной штриха 10 пикселей.

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

Все они содержат 50 тысяч или более «слов».