拆分表的定量评价
引言
给定一张码表,可以用各种方法来评测码表的性质;但是,给定一张由各个编码对象的元素构成的序列表,却很少有定量的手段来评估序列表的性质。本文中将讨论几个能够定量计算的序列表指标。
数学标记
我们记 为待编码对象的集合, 为元素的集合。在编码的规则确定了以后,存在一个「序列映射」把一个待编码对象 映射为最长不超过 个元素的序列。为了处理那些长度小于 的序列,我们向这些序列后面增加符号 直到长度达到 ,这样所有的序列就都是长度 的了,并且我们把 视为 的一部分,即 。这样,这个序列映射可以表示为
若符号映射也确定了,则可以把每个元素指定到一个符号,从而完成编码及输入。设可用的符号集是 ,为了方便分析我们也可以引入一个空符号 让 那么符号映射可以写作 。编码映射是序列映射和符号 映射的复合,即
离散性指标
编码的第一要义就是能把编码对象离散开,如果编码对象的元素序列相同,那么最终编码也一定相同。因此我们此前提出了「零阶重码(原始重码)」的概念,即假设 在映射 下的像是 ,那么 就是零阶选重数。相应的,如果 在编码映射 下的像是 ,那么 就是实际选重数。但是,这个指标还比较粗糙,因为零阶选重数往往远小于实际选重数,所以不能很好地解释为什么其他对象发生重码。
所以接下来我们定义一阶、二阶、三阶甚至更高阶的重码。给定一个符号映射 ,检视由其生成的编码映射 产生的实际重码。当 和 重码时,
- 如果它们的序列完全相同,那么就是零阶重码;
- 如果它们的序列有一个不同,那么就是一阶重码;
- 如果它们的序列有最多两个不同,那么就是二阶重码;
- 如果它们的序列有最多三个不同,那么就是三阶重码;
- ……
也就是说,零阶、一阶、二阶和三阶重码是定义在 上的二元关系,,它们具有反身性、交换性,但是除了零阶重码外不具有传递性,所以不是等价关系。
在符号映射还不存在的情况下,如何对一阶、二阶甚至更高阶的重码进行估计呢?这就需要我们引入一个新的概念,就是序列空间上的边际分布。考虑一个序列 ,可能有零个、一个或者多个编码对象对应这个序列,我们把这个定义为序列空间上的数分布,即
显然,如果 ,就发生了零阶重码。下面我们考虑一个三码方案,令第一、第二元素的边际分布为
可以想见,如果对于某个特定的 , 的数值很大,那么即使不存在零阶重码,也非常容易产生一阶重码。在极端情况下,如果 ,那么根据抽屉原理可知,一定会存在一阶重码。所以,我们得到了以下的重要观察:
序列空间上的边际分布反映了非零阶重码的信息。
对于这个三码方案而言,存在两类可以计算的边际分布:
- 二元边际分布 : 即消除掉一个元素后的边际分布
- 一元边际分布 : 即消除掉两个元素后的边际分布
在零阶重码一样的情况下,如果边际分布均匀,那么非零阶重码往往比较少;如果边际分布不均匀,那么非零阶重码往往比较多。
那么,怎么衡量边际分布是否均匀呢?我们可以采用重码估计方法。注意到,前两码为 的字能利用的空间总量为 ,那么由此产生的重码数量估计为 。因此,一阶重码的估计值为
同理,二阶重码的估计值为
而「三阶重码」也就自然退化为了整体重码估计,验证了本理论的有效性。
下面用这个理论来分析 c42 和易码的重码情况,其中 c42 为 27 键方案,易码为 26 键方案,字集为通用规范汉字(8105)和 GB2312(6763)的交集,共 6638 字:
指标 | c42 | 易码 | 奕码 |
---|---|---|---|
零阶重码 | 25 | 56 | 19 |
一阶重码估计 | 930 | 1418 | 1395 |
一阶重码实际 | 299 | 488 | 397 |
二阶重码估计 | 1049 | 1304 | 1205 |
二阶重码实际 | 624 | 749 | 661 |
整体重码估计 | 1119 | 1254 | 1254 |
整体重码实际 | 849 | 942 | 870 |
可以看到,考虑上用键数的差异之后(将易码的重码水平乘以 ),两者实际重码几乎完全一致(849 : 841),但是在一阶和二阶和三阶上的分布以及理论预测值非常不同。(此处我们忽略零阶重码的差异,因为形音码显然更容易做到零阶重码少,而且零阶也不是本文的重点)
- c42 是二阶重码占主导(),易码是一阶重码占主导();这主要是因为后者是乱序方案,当两个序列有 2 处不同的时候更容易通过排布的方式化解重码;
- 只看一阶重码,无论是估计还是实际值,c42 都有巨大的优势,也就是说 c42 的序列中前两元都相同的字数不会太多,第一元和第三元相同的字数不会太多,第二元和第三元相同的字数也不会太多
- 由于在实际的方案设计中都会考虑到尽可能规避重码,因此所有的估计数据都高于实际数据,也即前者可以认为是后者的一个上界;其中,一阶的估计离实际最远,整体的离实际最近,这主要是因为一阶重码比较有规律,可以通过合理放置元素来规避(例如,合理安排构字能力强的大部首就可以规避掉大部分一阶重码),整体重码的规律性就比较弱,接近估计时使用的随机极限
- 从三阶到一阶,c42 的重码估计是递减的,说明每增加一个元素,对字的分离程度比按键的数量(27)更加显著,因此说明拆分的质量比较高。
不过,c42 是用未归并的 400 根参与计算的,易码是归并后的 300 根,导致估计值严重偏低,需要重新归并才能确认上述结论。尽管如此,上述讨论还是给设计高离散性能的拆分打开了新的思路。
递归性指标
汉字本身具有递归的性质 ,例如在形声字、会意字中一个字可以作为另一个字的构成部分。下面我们分别称为部分字和整体字。那么,一个自然的问题就是,部分字和整体字的编码之间是否有关系?
我们记具有构字能力的字的集合为 。对于其中的每个字 ,我们可以找到它所构 成的字(假设共有 个),并用一个函数表示它,des 表示 descendants:
如果 构成字 ,我们记 或者 。
完美递归
完美递归是指,若 ,那么 的元素序列完整包含了 的元素序列。例如,「笔画输入法」的元素序列就是依笔顺排列的各个笔画,在绝大多数情况下都满足完美递归。一些基于双编码的纯形码方案,往往也在一些情况下能满足这个条件
但是,这个标准比较严苛,不适用于单编码形码、形音码等有补码的情形。另外,在 的元素序列没有完整包含了 的元素序列的时候,这个标准不能给出比较合理的中间结果。
不完美递归
在上面这个条件不完全满足的情况下,我们希望找到一个 的元素序列 的一个子序列 ,使得这个子序列被更多的 的后代所包含,并且这个子序列还要尽量长,也就是转化为下式的极大化问题:
我们把找到的这个 称为 的最佳子序列,相应的 称为 的递归得分。这样,我们可以进一步计算在整个具有构字能力的字的集合 上的递归得分之和: