作为记录中文文字的初步, cjkv info 的数据集,于今天解除了私密状态。现已包含了来源数据 23 万条,字符轮廓 25 万条,输入法条目 9 万条。
cjkv_info 比 unicode 收录数量(14 万字符)更多的原因,是考虑到了异体,变体的收录。Unicode 将许多来源不同的字符编入了同一码位。于是在 cjkv_info 里,就用额外的来源数据将其区隔。
字符轮廓,是 unicode 标准未予收录的信息。它即是字形的核心,有了它,就能知道对应来源的文字的笔画,结构究竟如何。有了它,也能立即将其转化为字体文件在计算机上得以应用。
输入法的选择则是经过了一些考察,着重关注科学性与规律性。这样,就可以在收录新字,收录变体时减少争议,获得共识。也容易让人见到文字即可按图输入,无需考量无理码问题。因此,首先用了郑码的方案做了收录和记录。
授权方式
谈授权其实是多此一举。语言文字的使用,发展,传承,没有过授权的说法。cjkv info 的数据集,也是类似的情境。但现代社会,人们有了版权法规的预期,所以在数据集里置了一个版权文件,顺便也在此说明。
此数据集采用 CC BY-SA 授权条款。简单来讲。所有人都可以在任何媒介上以任何形式利用此数据集。任意创作,改写,发行。即使用它获得商业利益,也不需要付出版权费。但同样的条款也适用于所有创作,改写,使用者。任何人对其进行了二次创作,加工后,第三者仍然可以再次对新的数据进行使用,二次创作改写,自由将其用于商业活动。总的来说,只要保留原作者的署名,标识改动部分到历史记录,不对后来者施加额外的限制,想拿它干嘛就干嘛。
这个条款保证了 cjkv_info 数据集的公益性质,所有权属于所有的创作者,而使用权则属于所有人(如果狗狗在未来进化得特别聪明,能读能写,那么狗狗也能使用,改写它,利用它换取狗粮)。
使用示例
光是对着这么一堆干巴巴的数据集,是很无聊的事。因此这里做了几个示例。演示下对这个数据集的简单应用。
cjkv info 索引站 此站点是 cjkv info 数据集的展示工具。我们可以在其中浏览,查找各种汉字的图形,输入法信息。其首页的搜索框左边带有帮助按钮,有搜索方式介绍。
自定一个新字体。
流行的字体编辑软件 FontForge 支持 cjkv info 所记录的字体轮廓格式,并且开放有 python 的 API 接口。利用它来制作一个新字体,是非常容易的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# 读取命令行参数 opts= setup_opt() # 读取由命令行参数指定范围的 cjkv_info 数据集文件 src_files= glob.glob(os.path.join(opts.cjkv_info, "data", "*", "*.src")) src_files= filter(filter_src, src_files) # 新建字体文件 newfont= fontforge.font() newfont.em= 1024 newfont.fontname= opts.name # 对读取的每个来源数据: for src_file in src_files: # 取得 unicode code point code= get_code(src_file) # 新建字形 glyph= newfont.createChar(code) # 读取字体轮廓数据 (root, ext)= os.path.splitext(src_file) glyph.importOutlines(root + ".svg") # 微调 glyph.transform(psMat.translate(0, opts.adjust)) # 将新字体生成到目标位置 newfont.generate(os.path.join(opts.output[0], opts.output[1]))
以上是利用 FontForge 生成字体的源码的核心部分。比如,将其存为 gen.py 文件。于是
./gen.py --cjkv_info cjkv_info所在目录 --region China --start 4E00 --end 4E1F --output myfont.ttf
就将 cjkv_info 数据集中来源为中国的编码为 4E00 到 4E1F 的 32 个文字提取,制作成了名为 "myfont.ttf" 的 TrueType 字体文件,可以在我们的电脑,手机中使用了。
生成输入法码表。 按照上例,生成字体的源码所示。我们也能同样从数据集生成一个 Rime 输入法所用的码表文件。于是,我们就能自订自己的输入法了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 读取命令行参数 opts= setup_opt() # 读取由命令行参数指定范围的 cjkv_info 数据集文件 src_files= glob.glob(os.path.join(opts.cjkv_info, "data", "*", "*.src")) src_files= filter(filter_src, src_files) # 新建并打开码表文件 with open(os.path.join(opts.output_dir, "zhengma.dict.yaml"), "w") as output_file: output_file.write(rime_zhengma.header.format(opts.name, opts.version)) for src_file in src_files: # 得到 unicode code point code= get_code(src_file) # 从 cjkv info 数据集得到郑码 zhengma_l= get_zhengma(src_file) for zhengma in zhengma_l: # 写入码表文件 item= "{}\t{}\n".format(chr(code), zhengma) output_file.write(item)
如何获取
考虑到 cjkv info 数据集将以一个自由开放的方式供给所有人,而没有一个中心的,权威的主导者,所以其存储也应是非集中的,分布式的。所有人都可以是这个数据集的存储点,发布点。而它将被许许多多的人使用,改善,再创作,所以其版本更迭也是可预见的。
基于这两点考虑,我选用了 git 这一分布式版本管理工具。将其作为一个 git 库来发布。初步,它将发布在 https://github.com/smaji-org/cjkv_info
上述的几个示例程序,也可以在 https://github.com/smaji-org/cjkv_info_sample 里获取。
后续增补
上一篇文档里提到了为了让计算机得以更新中文处理能力所需做的准备。对于 cjkv info 数据集来说:
- 增加新字时按此种方案录入编码,变体选择子,入库字形信息。
- 对过去已混杂的文字的所有变体按上一条的处理方式增加信息。
- 编制附加信息表,理清变体之间的关系。
这些,就是接下来我们可以做的事儿啦。
然后呢
然后就是给 Unicode 提交新字,新数据。帮助它更好地发展呀。这样,大家之前的人力物力投入就不会浪费。然后所有使用者也可以平滑过度,无需为新系统的使用付出额外的成本了。
之后也可以发展发展编辑器,比如 Office 套件。发展下数据库支持,内置引擎,外挂索引等。相信都会有人做的。如果暂时没人做,我也会帮忙做一点呀。
Comments
comments powered by Disqus