一直以来,字频对于码表排序的作用不会引起输入法制作者的多大重视,原因是大部分形码本来就以低重码率为目标,偶有重码时发现重码字的先后次序不理想才凭主观印象稍作调整。反观早已摆脱纯码表形式的拼音输入法一贯强调智能调整字词频度,由周有光提出的“高频先见,用过提前”即高度概括了拼音输入法在这方面的表现。“高频先见”是指事先根据现代汉语字词频度安排的静态次序,“用过提前”则是根据用户在输入过程中选择的累计次数动态调整次序。
然而使用数字小键盘输入的形码如五笔画和四角号码都面对大量重码,因此根据字频的高低对码表的重码字排序就显得意义重大了。我曾根据龙文输入法平台所提供的四角号码码表按字频筛选出多级简码,当时并未意识到整理出来的码表已暗含字频排序,倒是发现龙文本身就有一套字频和词频数据,其中规定词频小于10初次不能用形码输入,待完成逐字输入后由系统通知自动加词。
码表格式
在进入根据字频调整码表之前……实际上,早在Windows 95中文版问世以前,由当时新天地(中文之星)专门为Windows 3.2中文版开发的输入法生成器首创汉字在先编码在后的码表格式,一反当时沿用DOS中文平台的编码在先汉字在后的码表格式,令人耳目一新。如今很多输入法工具提供所谓的Win码表和极点码表的格式转换,指的就是上述两种码表格式,但何者为优,相信即使开发者也说不出更多的道理来。印象中xml00大师曾论证过从码表文件大小来讲,编码在先汉字在后的极点码表格式占有优势,原因是同码字可归并于同一行。故极点中文平台另提供码表优化工具,专门用于归并同码字。反观汉字在先编码在后的Win码表格式不具备归并同码字的特性,倒是允许可有可无的构词码。
经过多年的实践,我终于发现汉字在先编码在后的Win码表格式具备了按字频排序的特性,这无疑比编码在先汉字在后的极点码表格式仅仅节省文件大小空间的优势更重要。由于Win码表格式单字成行,因此易于标注其字频,并根据字频排序结果输出,可直接用于码表。极点码表格式在解除优化后虽然同样可以标注字频,但输出结果不能直接用于码表,其最终码表也不能直观看出字频排序的作用。这是由码表以编码为主轴的格式所决定的,作为编码对象的字词条无法集中体现本身的序性,只能在“字里行间”窥出端倪。
综合字频我曾经在网上搜集了五份字频表,当时并没有比较它们的不同,只选择了一份最全的GBK字频表作为参考。这次重新打开这五份字频表,竟然发现其中三份GB2312字频表是相同的,而且都是源自那一份GBK字频表。较后更发现龙文输入法平台的字频数据也与此同源(难道“天下字频一大抄”?),不禁感叹兜了一大圈子,要找的字频表早已存在电脑中。唯独一份7000字字频表属于完全独立的字频统计数据,其参考价值也更高。
我在
《经修订完整四角号码问世 采用龙文平台含简码词汇·关于简码及词汇》一文中曾指出,“经过实践反馈,其中三个一级简码做了调整:业→这、国→是、人→个……”显然,当时所用的GBK字频表存在误差,于是找出7000字字频表来对照,正好印证了上述调整的合理性。这三组字在GBK字频表与7000字字频表的序号如下:
| GBK字频表 | 7000字字频表 |
业/这 | 20/25 | 310/10 |
国/是 | 2/12 | 95/3 |
人/个 | 3/23 | 9/8 |
当我进一步把这两份字频表用于大易三码码表排序时,发现所有GBK字频表不理想之处在7000字字频表都有了合理的安排。以下是3500常用字范围的GBK字频表与7000字字频表的序号对比:
| GBK字频表 | 7000字字频表 |
资/次 | 91/115 | 567/156 |
邀/迫 | 1101/1446 | 1572/1176 |
诣/谐 | 2336/2381 | 3172/2509 |
评/讲 | 546/662 | 1044/552 |
覆/飘 | 1574/1762 | 1496/1484 |
璞/瑛 | 1764/3086 | 3469/3347 |
米/八 | 309/536 | 891/376 |
鳖/爹 | 2560/2850 | 3729/1833 |
跻/蹄 | 2532/2888 | 3736/2692 |
企/促 | 174/795 | 1261/1190 |
贷/俩/侠 | 986/2031/2789 | 2307/1673/2120 |
例/倒 | 729/1007 | 877/505 |
售/倍 | 646/1065 | 1768/1361 |
估/舍 | 1245/1280 | 1628/1048 |
晖/晕 | 2146/2275 | 2731/2181 |
运/远 | 258/520 | 416/317 |
扩/扎 | 882/1522 | 1638/1340 |
励/厉 | 856/1802 | 1816/1304 |
厕/刷 | 1584/1627 | 2775/1756 |
衷/哀 | 1804/1818 | 1959/1615 |
竞/祝/亮 | 834/903/1015 | 1384/1362/683 |
敦/敲 | 1487/1959 | 1870/1657 |
辨/辩 | 1919/2104 | 1724/1617 |
娅/妍 | 2834/3184 | 3440/3301 |
窜/帘 | 2941/3223 | 2518/2111 |
赠/宿/赌 | 1360/1631/2219 | 2009/1413/1737 |
贬/赈/账 | 2271/2355/2533 | 2795/3742/2340 |
宵/霄 | 2256/3433 | 2738/2652 |
鱼/刀 | 892/1567 | 1059/934 |
饥/饶 | 2562/2611 | 2267/2099 |
饺/馒 | 2791/2959 | 3861/3353 |
弦/弥 | 2132/2320 | 2106/1762 |
录/攻 | 592/853 | 1023/973 |
支/友 | 381/568 | 497/401 |
党/觉 | 604/815 | 830/312 |
菌/茵 | 1518/2415 | 2886/2571 |
薪/蒂 | 1543/2471 | 2440/1723 |
莘/萃 | 2441/2534 | 4036/3221 |
苦/若 | 883/1053 | 543/432 |
水/又 | 131/292 | 167/125 |
沪/鸡 | 1130/1184 | 3316/1391 |
沈/沉 | 1081/1187 | 1207/742 |
涨/艰 | 1181/1330 | 1961/1689 |
熔/炯 | 3170/3172 | 3405/2890 |
即使3500常用字范围以外的字,7000字字频表似乎也比GBK字频表更合理:
| GBK字频表 | 7000字字频表 |
簟/睾 | 6067/6180 | 5180/4997 |
簋/箧 | 6069/6082 | 5640/4808 |
蟑/蟀 | 4056/4590 | 4836/4368 |
珩/珂 | 3460/3661 | 4310/3526 |
胰/胯 | 3083/4991 | 4452/4204 |
馑/馐 | 5422/5423 | 5511/4806 |
饕/囔 | 5429/6703 | 4952/4378 |
嗲/吩 | 3895/4302 | 5005/2598 |
喱/喔 | 4292/6726 | 5895/3387 |
嗨/咚 | 3795/3802 | 3830/3154 |
匝/帚 | 3901/4738 | 3864/3805 |
颟/荚 | 4528/4613 | 6118/4711 |
憩/舔 | 2921/3734 | 3850/3783 |
汨/汩 | 4097/6381 | 4703/4014 |
潢/滇 | 2873/3175 | 4028/3619 |
熵/焙 | 6316/6321 | 4674/4535 |
至此,我们可以确定7000字字频表优于GBK字频表,那么要怎样综合利用这两份字频表呢?理想的字频表应该是以7000字字频表为主,再把GBK字频表中与7000字字频表交集的字删掉,然后把其补集与7000字字频表合并,这样就得到一份具有代表性的GBK字集综合频度表了。
在TextPro中可以这样处理:首先要把表中的序号和频度数据删除,其中GBK字频表还混合了部分全角符号,一概都要删除,然后设置“自定义替换表”,把7000字字频表选中,打开GBK字频表,通过如下替换得到其补集:
查找:(\c)
替换:\T{\1}
再把空行删除(查找“^$”替换为空),把补集合并到7000字字频表后面,加上序号,也就完成了GBK字集综合频度表。
标注字频有了上次利用Excel按字频筛选各级简码的经验,这次当然也是想到利用Excel的VLookup函数对码表单字标注字频。这时候刚好看到五笔爱好者论坛有一位Vu大师提出
TextPro可标注字频,正好启发了我利用TextPro解决字频标注问题。其实解决这个问题的方案,TextPro的自定义替换表比Excel的VLookup函数更容易理解。且让我们比较两者的不同之处:
TextPro通过设置“自定义替换表”把字频作为要替换汉字的数据,其格式安排如下:
的 1
一 2
是 3
了 4
不 5
在 6
有 7
个 8
人 9
这 10
……
接下来,打开输入法单字码表,通过替换对话框输入正则表达式如下:
查找:(\c)\~f+
替换:&\t\T{\1}
完成替换后,码表的单字和编码后面就附上了字频数据,中间用跳格符隔开。这比Excel在A列贴出按字频排列的汉字,B列贴出码表的汉字,C列贴出编码,然后D列使用函数:
=vlookup(a1,b:c,2,false)
从A列字频找出B列汉字并贴出C列编码,明显干净利落多了。
这项工作的最后目标是码表单字按字频排序,可惜TextPro不具备排序功能,当然交给Excel处理最好不过了。如果没有Excel,我们还可以用Word来排序:在Word打开经过TextPro标注字频的输入法单字码表,选择全文,选择表格中的“文字转换成表格”,最后选中第二列进行排序,并将“表格转换成文字”即可。如果机器条件较差,“文字转换成表格”可能需时较久,但排序往往是十几秒的事。如果发生内存不足,建议重启系统完成上述工作。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。