hoss
新手上路
新手上路
  • 社区居民
  • 忠实会员
阅读:248回复:5

小小秘笈㈠㊤:主码表编码唯一是无编码词条自动造词的充分条件

楼主#
更多 发布于:2019-09-03 20:18
小小秘笈㈠㊤:主码表编码唯一是无编码词条自动造词的充分条件
——码长对比可判断多码字来源为全码、简码或容错码

在以往Windows系统内置的传统输入法生成器(IMEgen.exe)中,除了将编码文本(以下简称“码本”)转换为系统输入法可识别的目标文件(*.ime和*.mb)外,还提供批量造词的功能(图1)。批量造词就是指用户导入一个词库文件,输入法生成器将自动把词库中的新词加入到指定的扩展词库文件(*.emb)中去。词库源文件要求为纯文本格式,每一个词条占用一行,词条可以不给出相应的编码。如果给出编码则须连续排放,而且词条与编码之间以及编码与编码之间不加空格。

描述:图1

图片:IMEgen.jpg

图1


通常码本都包含了构词规则,主要用于临时造词和批量造词中。临时造词可分为手工造词(有界面)和连线造词(无界面,按快捷键Ctrl+~开关),其中手工造词除了可以自定义新词,也可以对用户扩展词库进行维护操作(图2)。对于具有构词规则的输入法,系统自动编码,但人工可以干预,同时适用于手工造词和连线造词。对于没有构词规则的输入法,只能由人工进行编码,仅适用于手工造词,而不适用于连线造词。

描述:图2

图片:IMEgen2.jpg

图2


小小输入法平台与传统输入法生成器的最大不同,就是小小并非基于编译器的形式读入码本,然后输出可挂接系统的输入法码表与键盘布局。小小输入法平台的码本都是纯文本文件,只要在程序目录中配置好.yong/yong.ini的[IM]段和该输入法段的两处接口,即可完成输入法的挂接。因此,小小输入法平台并没有批量造词的特定手段,而是隐隐然在后台中实现。

默认情况下,小小输入法平台并未直接提供造词快捷键,用户可以自己设置,即在[key]段中添加add=CTRL_=(见帮助说明的入门指南)。然而小小批量添加无编码词条的自动造词功能,只是隐约在帮助说明中稍有提及。

在小小输入法平台的帮助说明中,“其他说明”一节提到“小小输入法的使用技巧”:
  • 关于造词的问题:自动造词,是在字库(意即单字码本)中找到第一个匹配的汉字,然后以这个汉字的编码进行自动编码;
  • 批量加词最简单的办法,就是把你的词一行一个放到用户词库中,然后启动输入法,进行一下码表归并即可;
  • 自动造词依主码表的;
  • 支持分词库,在码表头加一项dicts=mb/1.txt mb/2.txt,这些文件里的东西也会被自动加载。
综上所述,我们可以规定主码表仅收单字码本的唯一编码,通过分词库添加单字码本的简码、容错码和无编码词条,最终实现挂接任意词库。如果简码与单字码本的唯一编码构词时并无冲突,也可将简码收录主码表。下面是简体大易输入法的分词库示例:
dicts=mb/jtdy2.txt mb/jtdybox.txt
其中主码表jtdy.txt同时包含单字和简码,jtdy2.txt为主码表以外的容错码,而jtdybox.txt则为无编码词条。经实践证实,即使不经过码表归并(状态栏菜单>工具>合并用户码表),无编码词条还是可以根据构词规则有效输入。

其实主码表做到编码唯一只是充分条件,并非必要条件。即使原始码表未做到编码唯一,也可以实现无编码词条自动造词,只是难以保证全部词条编码是否根据全码构建,因为构词时可能优先匹配到与全码不一致的简码和容错码,这时用户根据正规取码输入词条时可能会出现无法输入已收录词条的情况。除非特别指定构词时的默认编码(即加前缀^或码表中排序靠前),否则用户输入的构词码难保与自动造词所匹配的构词码不会有出入。

如果有关输入法的单字码本只提供唯一编码,不含简码和容错码,当然理想不过(印象中来自台湾的仓颉输入法算是一例),立马即可实现无编码自动造词。然而大多数输入法都向现代字词典部首查字法所采用的“多开门”原则看齐,一般都会包含简码和容错码,那么原有的单字码本要如何筛选出正规取码的单字作为主码本(也可以理解为构词范本),并将简码、容错码作为分词库来挂接呢?

首先我们必须解除码表优化。所谓码表优化,就是同样编码的候选都列在同一行上,用意是尽量压缩码表所占空间。像极点五笔就提供码表优化工具,小小输入法平台则是通过状态栏菜单的工具或命令行实现,但几乎没见过反向操作的工具。下面我们利用TextPro的正则表达式通过替换解决:
查找:(\a*)( \c*)( \c*.)
替换:\1\2\n\1\3

上述替换须重复操作至状态栏出现“找不到字符串”为止。以小小的五笔码表为例,有多达13个重码字的编码,则须重复操作至少12遍:
fpgc 彀 觳 嗀 殼 瑴 皼 瞉 穀 糓 縠 豰 轂 嗀

完成后,我们还要进一步去除二字词以上的词条:
查找:\a* \c\c+
替换:\d

如此,我们就获得约两万多字的纯单字码本,但其中包含了许多多码字,所以还要进一步去芜存菁。由于TextPro只适用于单行字符串处理,接下来我们转用可以跨行字符串处理的Excel来操作多码字码表。当纯单字码本转贴到Excel表单后,我们可以对单字栏排序(其实新版TextPro也可按行排序,但只能根据行首排序),即选中B栏后进行A到Z排序,这时系统警示是否扩展选择范围,确认后完成单字栏排序(图3)。在C2项输入公式:  
=OR(B2=B1,B3=B2)

描述:图3

图片:五笔单字.jpg

图3

接着双击C2项右下角的黑色小方块,C2列以下自动开始生成公式结果。再选择过滤结果为TRUE,这就是我们要处理的多码字(约一万多字)。对于五笔码本,大部分多码字来源于二三级简码,因为它们和全码的构词码是一致的,不会造成冲突,可以继续保留在主码本。将多码字码表转贴至全新表单,在C1项输入TRUE,接着在C2项输入公式(图4):
=IF(LEN(A2)=1,"一级简码",IF(B2=B3,IF(AND(LEN(A2)<LEN(A3),A2=LEFT(A3,LEN(A2))),"二三级简码","容错码"),IF(C1="容错码","容错码","全码")))

描述:图4

图片:全码、简码和容错码判定流程图.jpg

图4


接着双击C2项右下角的黑色小方块,C2列以下自动开始生成公式结果(图5)。再选择过滤结果为“一级简码”和“容错码”,这就是最后剩下的多码字(去掉第一行后,约900余字)(图6)。一级简码之所以被排除在外,原因是它们只有一位码,不足以形成构词码,对自动造词可能会带来干扰(二字词和三字词都需要至少两位构词码),更有少数几个非正规取码的一级简码(“不发有”)影响了排序导致对应的全码被误为容错码,需要手动纠正(图7)。另一方面,不难发现绝大部分容错码来源于五笔86和五笔18030对繁体字和异体字因字根范围不同而出现取码分歧,不涉及正规码和容错码之分,加上这些繁体字和异体字原本就不应出现在现代汉语词汇中,所以一律排除在外。与此同时,码表中还发现六个冗余字(如“裏凉隣”)和一个形近字(“郎—郎”)。这些冗余字尽管字形一样,实际码位并不同,它们源自于早期GBK收纳的21个中日韩兼容汉字(码位F900-FAFF)。此外,意外发现小小的五笔码表有一项错误:“纛”三级简码gxf应改为gxg(对照全码gxgi)。修正后,两者原为“容错码”关系恢复为“二三级简码”和“全码”关系。

描述:图5

图片:五笔多码字.jpg

图5


描述:图6

图片:一级简码和容错码.jpg

图6


描述:图7

图片:容错码改全码.jpg

图7


从码表中移出这些内容后,我们就得到一份干净的主码本,可供小小输入法平台实现无编码词条自动造词。最终我们的目标是提供一份不含冗余码的主码本,在表头指定再挂接一级简码、容错码的多码字码本和无编码词条的分词库,就可实现与原有五笔输入法的同样效果。有关分词库的挂接如下:  
dicts=mb/wbx2.txt mb/wozy.txt
其中wbx2.txt为那900多字的多码字码表,而wozy.txt则是五笔86极爽词库6.0标准版的无编码词库。要验证上述改造是否有效,我们只需在.yong目录下建立mb目录,将改造后的主码表wbx.txt、含一级简码和容错码的wbx2.txt、源自极爽词库的wozy.txt放在.yong/mb目录下,就可在不修改源码表及设置文件情况下进行测试。

为了区别于改造前的词库,我们特意在wozy.txt添加一行源词库未收词条:
小小输入法平台
这时输入iilc即可验收改造成果。

经过上述成功改造,我们可以归纳如下几点心得:
  • 小小输入法平台通过构词规则和分词库,即可实现无编码词条自动造词。尤其是无编码词条的分词库自动造词不只让用户省下为词库编码的烦恼,最大的好处是用户可以自由挂接任意词库,如采用早期《GB/T 15732-1995汉字键盘输入用通用词语集》(4.3万词条)和近期《现代汉语常用词表(草案)》(不含单字词有5.2万词条)等权威词语规范成果来取代极爽词库。
  • 多年来,基于多码字来源分类的码表制作从未获得重视,原因可能是一般输入法平台不提供多于一个码表的处理机制,导致码表普遍存在单码字与多码字混杂以及单字与词条混杂的“大杂烩”情况。小小输入法平台的分词库机制,不仅提供了多达10个不同词库的挂接,也方便了对多码字来源进行分门别类的管理,使原始码表可作为正规码本(全码和简码)和非正规码本(容错码)供用户随时查阅。
  • 长久以来,码表在经年累月的修改和使用过程中可能连发明人和用户自己都分不清码表中多码字到底是来自全码、简码还是容错码。如今通过TextPro和Excel对码表的一系列操作,我们终于可以在多码字来源分类的基础上对码表做系统性整理,使发明人和用户对整体码表有更全面的了解和更深入的掌握。
  • 判断多码字为全码、简码或容错码的公式只适用于五笔码表,并非所有形码都适用。其他形码需要结合其自身简码和容错码的具体情况并根据构词规则加以调整。由于五笔安排相对较多的简码和容错码,相信该公式的适用性对其他形码具有极大参考价值。
  • 必须承认小小输入法平台的无编码词条自动造词功能对拼音类输入法作用不大,最大原因是拼音的一字多音问题。不像形码的编码可以定于一尊,多音字并无客观规律可循,无法光靠几个公式覆盖所有多音字情况。要解决拼音的多音字问题,不妨改变思路,通过“例外词”穷举法来解决,如多年前大师级人物Ahman和xml00(徐梦罗)等前辈在论坛提出的“阿门拼码器”就是完整解决方案之一。
关于五笔的容错码:五笔的容错码是指容易编错的码和允许编错的码。这两种编码都让用户按编错的码输入,就是所谓的“容错码”。王码五笔中的容错码超过500个,包含了“拆分容错”、“字型容错”、“方案版本容错”和“定义后缀”(尾码l)。但在实际应用中,由于容错码打破了编码的唯一性,使人难以认清正确的编码,形成最终提高速度的障碍,所以现在的五笔输入法中都去掉了容错码,只保留唯一的正确编码。真正的容错码如dddl“靥”(全码dddd与键名字“大”冲突)、apfl“蔻”(全码apfc与高频词“劳动”冲突)因码表未收录全码,只保留容错码,所以可以省下对几个容错码验明正身(找出正规码)的工夫。
(打开附件

最新喜欢:

xuxuezengxuxuez...
fzydxx
新手上路
新手上路
沙发#
发布于:2019-09-13 18:37
没看到什么秘笈啊
hoss
新手上路
新手上路
  • 社区居民
  • 忠实会员
板凳#
发布于:2019-09-10 19:11
eikeen:收藏

下会说什么诀窍啊
回到原帖
小小秘笈㈠还有下篇,敬请期待。

本系列预计共有四篇,其中秘笈㈠分上下篇。
eikeen
新手上路
新手上路
地板#
发布于:2019-09-10 17:29
收藏

下会说什么诀窍啊
4楼#
发布于:2019-09-05 10:22
码表中可以指定某字自动造词时使用的造词码——编码前加^符号。
^ma 字
hhs214
新手上路
新手上路
  • 社区居民
  • 忠实会员
5楼#
发布于:2019-09-04 11:57
好帖啊,收藏研究。
游客

返回顶部