Skip to content

Commit

Permalink
更新文章「常见输入法重码数据」
Browse files Browse the repository at this point in the history
  • Loading branch information
forFudan committed Jun 1, 2023
1 parent 3e265cb commit 1645668
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 50 deletions.
183 changes: 135 additions & 48 deletions docs/articles/statistics.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
---
title: 常见输入法重码对比
title: 常见输入法重码数据
layout: default
parent: 研究文章
nav_order: 2
---

<!-- omit in toc -->
# 常见输入法重码数据对比
# 常见输入法重码数据
{: .no_toc }

梦泽闲客 写于二零二三年六月一日

<details open markdown="block">
<summary>
目录
Expand All @@ -18,21 +20,11 @@ nav_order: 2
{:toc}
</details>

## 重码数据

这里将世面上可见的各类形码输入法的重码数据(全码)进行对比,统计其在不同汉字字符集下的单字全码的重码数量。其中:

- 「通规一二级」是指大陆《通用规范汉字表》中的 6500 个简化汉字。测试输入法**简化字确定性**
- 「国字」是指台湾《常用国字标准字体表》中的 4808 个繁体汉字。测试输入法**繁体字确定性**
- 「常用繁简」是指大陆《通用规范汉字表》一二级的6500个汉字、台湾《常用国字标准字体表》中的 4888个汉字、以及《古籍印刷通用规范》中的125个大陆繁体字形。总共为8390个常用繁简汉字。测试输入法**繁简混合文本下的确定性**
- GB2312 是大陆信息技术简化字集,共有简化汉字 6764 个。
- GBK 是大陆的信息技术大字集,共有繁简汉字 21003 个。
- **静态重码数**指的是一个字集范围内,编码相同的汉字的绝对数量,反映出了输入法在检字方面的确定性。
- **动态选重率**指的是用字频数据对重码汉字进行加权。因为存在五码自动顶一选,只有在二选或三选时才需要选重。这个指标更能反映实际的输入体验。
- 注意,动态重码率基于字频数据,不同的字频统计会产生不同结果。我采用的字频数据,简体来自北京师范大学邢红兵的[《25亿字语料汉字字频表》](https://faculty.blcu.edu.cn/xinghb/zh_CN/article/167473/content/1437.htm),繁体来自"繁体字频表.txt"。

注意:此处只呈现客观的重码数据,不能用来代表此输入方案优秀与否。评判一个输入方案,应该综合攷量以下因素:
这里将世面上可见的各类形码输入法的重码数据(全码)进行对比,统计其在不同汉字字符集下的重码数量。

{: .important}
>本文只是呈现客观的重码数据,不能用来作为此输入方案是否优秀的唯一评价标准。评判一个输入方案,应该综合考量以下因素:
>
- 在不同字集/使用环境下的重码率。
- 规则复杂度。
- 字根记忆难度。
Expand All @@ -42,36 +34,22 @@ nav_order: 2
- 人体工学性。
- 平台通用性。

表格按输入法的性质排列:
## 单字重码数据

### 定义

| 形码方案 | GB2312 | 通规一二级 | 国字常用 | 常用繁简 | GBK | 简体选重率 | 繁体选重率 | 繁简混合文本选重率 |
| :---------------------- | -----: | ---------: | -------: | -------: | ----: | :--------- | :--------- | :----------------- |
| **四码定长** | | | | | | | | **字根单编码** |
| 五笔86 | 537 | 452 | 357 | 1685 | 6582 | 34.2‱ | 79.0‱ | 226.4‱ |
| 五笔98 | 515 | 452 | 329 | 1623 | 6368 | 38.1‱ | 78.0‱ | 230.1‱ |
| 五笔06·新世纪 | 532 | 488 | 387 | 1690 | 6610 | 31.8‱ | 81.8‱ | 223.6‱ |
| 张码 | 110 | 84 | 113 | 1138 | 4646 | 154.9‱ | 181.1‱ | 265.6‱ |
| 蓝宝石 | 388 | 358 | 284 | 713 | 5082 | 21.6‱ | 57.6‱ | 58.9‱ |
| **四码定长 字根双编码** | | | | | | | | **繁简同根** |
| 郑码 | 563 | 533 | 311 | 1779 | 6590 | 59.9‱ | 63.3‱ | 267.1‱ |
| 真码 | 422 | 366 | 238 | 1833 | 6670 | 13.8‱ | 41.9‱ | 269.1‱ |
| **四码定长 字根双编码** | | | | | | | | **繁简通打** |
| 徐码13 | 324 | 288 | 125 | 462 | 2872 | 10.4‱ | 23.0‱ | 24.8‱ |
| 徐码23 | 318 | 278 | 127 | 453 | 2902 | 10.7‱ | 21.8‱ | 25.1‱ |
| 宇浩·正式版 | 313 | 271 | 214 | 583 | 5015 | 5.5‱ | 15.6‱ | 17.7‱ |
| 宇浩·發燒版 | 312 | 267 | 212 | 590 | 5144 | 5.2‱ | 15.4‱ | 17.0‱ |
| **五码定长** | | | | | | | | **繁简通打** |
| 仓颉五代 | 422 | 367 | 164 | 585 | 2893 | 88.8‱ | 48.9‱ | 104.7‱ |
| **不定长** |
| 山人全息 | 194 | 168 | 84 | 1455 | 3952 | 6.4‱ | 7.5‱ | 233.7‱ |
| **选重方案** |
| 五笔092 | 1876 | 1569 | 798 | 2034 | 11418 | 315.3‱ | 268.1‱ | 317.6‱ |
| **三码定长** | | | | | | | | **出简不出全** |
| 三码郑码 | 2700 | 2551 | - | - | - | 51.8‱ | - | - |
| **音形方案** | | | | | | | | **简体方案** |
| 小鹤音形 | 730 | 725 | - | - | - | 85.3‱ | - | - |

## 公式化表达
表格中的各项名称定义如下:

- 「通规一二级」是指大陆《通用规范汉字表》中的 6500 个简化汉字。测试输入法**简化字确定性**
- 「国字」是指台湾《常用国字标准字体表》中的 4808 个繁体汉字。测试输入法**繁体字确定性**
- 「常用繁简」是指大陆《通用规范汉字表》一二级的6500个汉字、台湾《常用国字标准字体表》中的 4888个汉字、以及《古籍印刷通用规范》中的125个大陆繁体字形[^mainland_shape]。总共为8390个常用繁简汉字。测试输入法**繁简混合文本下的确定性**
- GB2312 是大陆信息技术简化字集,共有简化汉字 6764 个。
- GBK 是大陆的信息技术大字集,共有繁简汉字 21003 个。
- **静态重码数**指的是一个字集范围内,编码相同的汉字的绝对数量,反映出了输入法在检字方面的确定性。
- **动态选重率**指的是用字频数据对重码汉字进行加权。因为存在五码自动顶一选,只有在二选或三选时才需要选重。这个指标更能反映实际的输入体验。
- 注意,动态重码率基于字频数据,不同的字频统计会产生不同结果。我采用的字频数据,简体来自北京师范大学邢红兵的[《25亿字语料汉字字频表》](https://faculty.blcu.edu.cn/xinghb/zh_CN/article/167473/content/1437.htm),繁体来自"繁体字频表.txt"。

### 计算公式

假设 $$Z$$ 为一个汉字的集合, $$M$$ 为一个编码的集合, $$p:Z\rightarrow [0,1]$$ 为汉字到某文本状态下单字频率的映射.

Expand All @@ -85,6 +63,117 @@ $$N_{s} = \mid \{z_{ia}, z_{ib} \text{ if } M(z_{ia}) = M(z_{ib}) \text{ for al

$$N_{d} = \sum\limits_{i \in I, j \in J_i/\{1\}} p(z_{ij}).$$

### 结果

表格按输入法的性质排列:

| 形码方案 | GB2312 | 通规一二级 | 国字常用 | 常用繁简 | GBK | 简体选重率 | 繁体选重率 | 繁简混合文本选重率 |
| :------------ | -----: | ---------: | -------: | -------: | ----: | :--------- | :--------- | :----------------- |
| **四码定长** | | | | | | | | **字根单编码** |
| 五笔86 | 537 | 452 | 357 | 1685 | 6582 | 34.2‱ | 79.0‱ | 226.4‱ |
| 五笔98 | 515 | 452 | 329 | 1623 | 6368 | 38.1‱ | 78.0‱ | 230.1‱ |
| 五笔06·新世纪 | 532 | 488 | 387 | 1690 | 6610 | 31.8‱ | 81.8‱ | 223.6‱ |
| 张码 | 110 | 84 | 113 | 1138 | 4646 | 154.9‱ | 181.1‱ | 265.6‱ |
| 蓝宝石 | 388 | 358 | 284 | 713 | 5082 | 21.6‱ | 57.6‱ | 58.9‱ |
| **四码定长** | | | | | | | | **字根双编码** |
| 郑码 | 563 | 533 | 311 | 1779 | 6590 | 59.9‱ | 63.3‱ | 267.1‱ |
| 真码 | 422 | 366 | 238 | 1833 | 6670 | 13.8‱ | 41.9‱ | 269.1‱ |
| 徐码13 | 324 | 288 | 125 | 462 | 2872 | 10.4‱ | 23.0‱ | 24.8‱ |
| 徐码23 | 318 | 278 | 127 | 453 | 2902 | 10.7‱ | 21.8‱ | 25.1‱ |
| 宇浩·v1.4.3 | 313 | 271 | 214 | 583 | 5015 | 5.5‱ | 15.6‱ | 17.7‱ |
| 宇浩·v2.0.0 | 312 | 267 | 212 | 590 | 5144 | 5.2‱ | 15.4‱ | 17.0‱ |
| **五码定长** | | | | | | | | 字根单编码 |
| 仓颉五代 | 422 | 367 | 164 | 585 | 2893 | 88.8‱ | 48.9‱ | 104.7‱ |
| **不定长** |
| 山人全息 | 194 | 168 | 84 | 1455 | 3952 | 6.4‱ | 7.5‱ | 233.7‱ |
| **选重方案** |
| 五笔092 | 1876 | 1569 | 798 | 2034 | 11418 | 315.3‱ | 268.1‱ | 317.6‱ |
| **三码定长** | | | | | | | | **出简不出全** |
| 三码郑码 | 2700 | 2551 | - | - | - | 51.8‱ | - | - |
| **音形方案** | | | | | | | | **简体方案** |
| 小鹤音形 | 730 | 725 | - | - | - | 85.3‱ | - | - |

## 词语重码数据

### 定义

表格中的各项名称定义如下:

- **词语完美动态选重率**指的是用词频数据对重码词语(包括单字词和多字词)进行加权后得到的选重的频率。
- **单字动态选重率**指的是使用极端保守的分词法,即所有多字词全部视作单字词输入时选重的频率。
- **实际动态选重率**指的是在实际输入过程中,因为用户分词和字频表分词的差异造成的偏差所造成的选重率。介于「单字动态选重率」(极端保守分词)和「词语完美动态选重率」(完美分词)之间。因为用户输入了词库中不存在的词而导致的回删,不算如此内。
- 因为存在五码自动顶一选,只有在二选或三选时才需要选重。
- 动态重码率对词频数据的依赖度极高,不同的词频统计会产生不同结果。本文采用的词频数据,来自《现代汉语语料库分词类词频表》。

{: .example}
>这里给出对于「词语完美动态选重率」的一个直观解释。假设存在这样一个句子:
>
>「请用大约十句话来描述你所居住城市的历史的来龙去脉。」
>
>如果词库为**中等大小**,换言之,分词比较适中,我们对这句话进行如下分割:
>
>「请·用·大约·十句·话·来·描述·你·所·居住·城市·历史·的·来龙去脉。」
>
>我们得到了 14 个词语,也就是说,用户要输入 14 次全码。假设「请」和「描述」发生了重码,那么我们输入这 14 个词,就要选重一次。这句话的词语动态选重率就是 1 / 13 = 7.1%。
>
>如果词库为**超大词库**,换言之,分词比较激进,我们对这句话进行如下分割:
>
>「请用·大约·十句话·来·描述·你所·居住·城市·历史的·来龙去脉。」
>
>我们得到了 10 个词语,也就是说,用户要输入 10 次全码。假设「请用」和「描述」发生了重码,那么我们输入这 10 个词,就要选重一次。这句话的词语动态选重率就是 1 / 10 = 10.0%。
>
>如果词库为**精简词库**,换言之,分词比较保守,我们对这句话进行如下分割:
>
>「请·用·大约·十·句·话·来·描述·你·所·居住·城市·历史·的·来·龙·去·脉。」
>
>我们得到了 18 个词语,也就是说,用户要输入 18 次全码。假设「请」和「描述」发生了重码,那么我们输入这 18 个词,就要选重一次。这句话的词语动态选重率就是 1 / 18 = 5.56%。
>
> 一个基本的经验时:分词越激进,词库越大,那么「词语完美动态选重率」就越高,同时平均码长也越短。
{: .important}
>从上例可以看出,词语的重码数据,极度依赖于用户的「人工分词」和统计数据中的词语的一致性。只有在以下条件**全部**满足时,数据才会比较准确:
>
>- 用户只打词频表中出现的词。如:词频表中若无「我们」,那么用户只打「我·们」。
>- 用户必定打长度较长的词。如:出现「电视机」时,必定打「电视机」,而不是「电视·机」或「电·视·机」。这一条也意味着,一个多字词若在字频表中,那么用户绝对不会打成单字。
>
>因为这两个条件过于完美,实际使用时对用户的分词压力高,所以一般不会实现。很多时候,用户会将某些词频表中的多字词分为单字词输入,这意味着:
>
>实际输入时的动态选重率,应介于「单字动态选重率」和「词语完美动态选重率」之间。依照用户习惯:
>
>- 如果一个人偏好打单字,那么动态选重率更偏向「单字动态选重率」(更低)。
>- 如果一个人偏好打词语,那么动态选重率更偏向「词语动态选重率」(更高)。
>
>因此,**精简词库配合单字输入**,是平衡码长(效率)和选重(确定性)的一个解决方案,适合新手。而**背诵字词简码和选重位置**也是提高确定性的一种方式,适合老手。

### 计算公式

假设$$W$$为一个词语的集合,词长大于等于1。 $$M$$ 为一个编码的集合。一段文本$$T$$可以被贪婪地分割为$$W$$的组合。统计每一个词语的概率,定义$$p:W\rightarrow [0,1]$$ 为词语到其出现频率的映射.

用编码和频率对词语排序, 使词语 $$w_{ij}$$ 是编码为 $$m_i$$ 的第 $$j$$ 个项目, $$i \in I$$, $$j \in J_i$$, 且满足 $$a\geq b$$ 时, $$f(w_{ia})\geq f(w_{ib})$$.

那么,词语完美动态选重率可以表达为:

$$N_{d} = \sum\limits_{i \in I, j \in J_i/\{1\}} p(w_{ij}).$$

### 结果

表格按输入法的性质排列。实际动态选重率,应介于「单字动态选重率」(极端保守分词)和「词语完美动态选重率」(完美分词)之间。

| 形码方案 | 简体词语完美动态选重率 | 简体单字动态选重率 |
| :------------ | ---------------------: | -----------------: |
| **四码定长** | | **字根单编码** |
| 五筆86 | 192.0‱ | 34.2‱ |
| 五筆98 | 201.8‱ | 38.1‱ |
| 五笔06·新世纪 | 204.9‱ | 31.8‱ |
| 张码 | 168.0‱ | 154.9‱ |
| 蓝宝石 | 45.5‱ | 21.6‱ |
| **四码定长** | | **字根双编码** |
| 徐码13 | 113.3‱ | 10.4‱ |
| 徐码23 | 109.4‱ | 10.7‱ |
| 宇浩·v1.4.3 | 119.6‱ | 5.5‱ |
| 宇浩·v2.0.0 | 116.1‱ | 5.2‱ |

## 码表来源

码表数据基于:
Expand All @@ -100,6 +189,4 @@ $$N_{d} = \sum\limits_{i \in I, j \in J_i/\{1\}} p(z_{ij}).$$
- [092五笔]<https://github.com/lvxingjia/092r>
- [小鹤]<https://github.com/cubercsl/rime-flypy>

## 125个大陆繁体字形

蟶衆螄斕綉覈飆淩轆癡刴戩糉㨃擡佈圇箇絝啓廡儕槪顴躋鉅鋭鎚牀廏衹朶讞噁瑋旣蓽嬡僞蹟癟艶淼㑚紈餚攢樑噠繮曬崗壎濕竈殞揹瓚鵰痠鈺巘裏曁皁奬諏孃贇閆跥歎産顔頽摻爲絶昇繳躱薦閲謔卽纔剮闕暘屌勳覷伲崟蹌饋駡曇躥翀熒鹵説唄龕裋衊㞞〇誒侷玅薈齶燼嬈鉢檯喫摳鶩縐滷襬麪
[^mainland_shape]: 蟶衆螄斕綉覈飆淩轆癡刴戩糉㨃擡佈圇箇絝啓廡儕槪顴躋鉅鋭鎚牀廏衹朶讞噁瑋旣蓽嬡僞蹟癟艶淼㑚紈餚攢樑噠繮曬崗壎濕竈殞揹瓚鵰痠鈺巘裏曁皁奬諏孃贇閆跥歎産顔頽摻爲絶昇繳躱薦閲謔卽纔剮闕暘屌勳覷伲崟蹌饋駡曇躥翀熒鹵説唄龕裋衊㞞〇誒侷玅薈齶燼嬈鉢檯喫摳鶩縐滷襬麪
4 changes: 2 additions & 2 deletions docs/beta/beta.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ has_children: true

## 單字編碼

v1 版中,爲了減少全碼碼長,宇浩輸入法在每個大碼上設置了一個小碼爲 v 的字根,如果两根字末尾是 v,則可以省略這個 v。這個規則遭到了很大的詬病。根据反饋,在測試版中,單字編碼規則簡化如下:
單字編碼規則簡化如下:

1. 依次取一、二、三、末根大碼。
2. 不足四碼時,補上末根小碼。
3. 仍然不足四碼时,補上首根小碼。

## 字根編碼

字根字編碼,在 v1 版中,代表字根加f,附屬字根加 ff。這對 f 鍵不够友善。故而在测试版方案中改爲
字根字編碼改爲

- 代表字根:全碼爲三碼,重複小碼,Aaa
- 附屬字根:全碼爲四碼,重複小碼,Aaaa
Expand Down

0 comments on commit 1645668

Please sign in to comment.