目前,汉字输入方法多种多样,手写输入及语音输入已从实验室阶段进入了实用,然而,自然输入的方法由于其本身硬件与软件的特殊环境要求,仍然不能成为汉字输入法的主流。汉字输入的方法,仍然主要采用汉字编码输入法,即通过输入汉字的对应输入码达到输入汉字的目的。
我们可以将编码输入方法分为音码输入,形码输入和音形码输入,通常的输入法都提供字输入和词输入两种功能。不管是哪种输入法,都需要汉字与输入码的对照码本作为基础,在实际系统中,一般采用一个压缩过的字词对照二进制文件。因此需要采集、整理并对汉字进行编码,向输入系统提供正确、符合结构要求的码本。同时,为了输入法能被广泛使用,同期开发的用于辅助教学或字典软件等应用软件中,也都需要使用到码本的部分或全部数据。
目前,中文输入法的使用区域主要是华语地区,除了大陆,台湾、香港等地,还有新加坡及散布在世界各国的华人聚居区。主要采用的汉字字符集的标准有:大陆所采用的gb2312基本字符集和gbk字符集以及台湾所采用的big5字符集,另外,香港则采用扩充了香港政府颁布的香港政府通用字集的big5字符集。在使用汉字的中日韩等地,同一个汉字都有不同的内码表示。
汉字及编码信息的审定和校对是一个劳动力非常大的工作,如果对这些字符集中的每个汉字都进行一次编码,那将难以想象。所幸的是即使汉字所在的字符集不同,对于某一种固定的编码法相同形状的汉字应该具有相同的输入编码。
在windows98、NT及以后的系统平台都完全支持unicode。Unicode在基本多文种平面中包含的汉字字符个数为27487个,远远多于其他汉字字符集。但unicode在各个应用软件中并没有广泛的应用,所以,前期的处理工作会有一些麻烦,因此,在输入系统的底层,汉字采用unicode内码,而在码本的前期处理时,我们选取gbk字符集下的楷体字形来进行编码。
gbk字符集中含有21003个汉字,与gb2312完全兼容,包含绝大部分大陆的简体字和big5字符集下的全部繁体字,是除unicode以外的最大字符集。它在简体系统下广泛使用,因此,使用unicode-gbk内外层模式,尽管内码体系有多种多样,都同样可以完成汉字的输入。
1、汉字及对应输入码信息表srm.dbf
字段号 | 字段名 | 字段说明 |
1 | Hz | 汉字 |
2 | Srm | 输入码 |
3 | Zs1 | 输入码信息1 |
4 | Zs2 | 输入码信息2 |
5 | Zs3 | 输入码信息3 |
6 | Zs4 | 输入码信息4 |
7 | Rc | 容错码属性标记 |
8 | Jm | 简码属性标记 |
2、汉字信息表hz.dbf
字段号 | 字段名 | 字段说明 |
1 | Hz | 汉字 |
2 | Bh | 汉字笔划数 |
3 | Jg | 汉字结构信息 |
4 | Pri | 汉字频度信息 |
5 | Ab | 常用字集合标记 |
6 | Jf | 简繁标记 |
7 | Gb0 | Gb2312一级字标记 |
8 | Gb | Gb2312标记 |
9 | Gbkj | Gbk简体标记 |
10 | Gbkf | Gbk繁体标记 |
11 | Unicode | 该汉字的unicode内码 |
12 | Gbk_ex | 是否为gbk扩充字 |
3、码表数据的获得
输入码信息表和汉字信息表中,有部分信息是比较容易获得的。如汉字是否属于gb2312集合,汉字结构信息,汉字笔划数等信息。而另一部分信息没有现成资料,需要通过统计或额外处理。
1)汉字笔划数、结构信息的获取
汉字笔划数可由汉语字典查出,然后由人工输入。汉字结构信息也可根据字典的提示由人工确定并输入。
2)汉字所在字符集的标定
由于gb2312是gbk的子集,两者完全兼容,并且内码范围非常明显,gb2312的内码范围是:B0A1-FEFE,GB2312一级字的内码范围是:B0A1桪7FE。而unicode的获取则只需在windows2000系统环境下将hz.dbf中的hz这一列放在记事本中,然后将其存成unicode内码,在hz.dbf中写入对应的unicode字段即可。Unicode所公布的cjk unified ideograph中的汉字内码范围是4e00-9fa5,共有20902个汉字,超出此范围的共101个汉字将gbk_ex.标定为1。
3)输入码信息的获得
对gbk共21003个汉字进行编码的过程需要相当强度和精度,虽然,编码者是熟谙汉字编码的,但是向编码者提供一个清晰方便、人工校对与自动检查相结合的编码程序,尽一切可能使编码者在相对宽松的环境下完成此项工作是非常必要的。以下是编码及校对程序的主界面:
此程序的主要功能如下:
(1)对汉字进行输入码、输入码属性信息、容错信息的标定或校对。
(2)编码时显示此汉字的所有输入码。
(3)对疑义汉字做标记
(4)自动检查输入码与输入码属性信息是否配对。
(5)新增当前汉字的容错输入码。
4)汉字频度的获得
汉字的频度是汉字的一个非常重要的属性。它涉及到重码汉字的出字次序、简码汉字的确定等。而汉字的频度又不是一成不变的,它是根据不同的应用领域动态调整变化的。
因此,首要的任务是为每一个汉字获取一个比较合理、客观的初始频度。然后,根据具体的输入环境,手工或动态地调整频度。通常,可通过对大量的语料进行统计分析,计算每个汉字的使用次数来统计汉字的初始频度。可以编写统计程序或利用现存的搜索引擎,查找对应汉字的出现次数来计算汉字的初始频度。
至于动态调频,我本人认为,对于一些形码,本身的重码率比较低,重码数通常低于一屏,考虑到输入系统的总体效率,可以不必考虑这项功能,而对于拼音输入,本身重码率非常大,则使输入系统有一个自学习、自调频的功能是非常必要的。
5)汉字简繁的标定
简体与繁体字的分辨至今也没有很好的标准,虽然没有界限,但由于简体字的产生就是对部分繁体字进行简化的结果。所以我们可以这样来认定:凡是gb2312的字认为是简体字(gbkj=1),凡是在big5中有对应字形的汉字则认为是繁体字(gbkf=1)。这样,有些汉字既是繁体字,又是简体字。当然,还有部分汉字未被标定。对那些已被标定为繁体而未被标定为简体的字,也可能是简体字,而对那些未被标定的字,则既可能是简体字,又可能是繁体字。我们采用的方法是对这些汉字,也即非gb2312的字用word来进行简繁转换,如果转换出的内码结果跟原来一样,原字即为简体字,否则为繁体字。
四、词组码本数据库的设计与信息获取
1、词组码本数据库的结构
序号 | 字段名 | 字段说明 |
1 | Srm | 词组输入码 |
2 | Hz | 词组 |
3 | Pri | 频度 |
4 | Gbkj | 是否为简体词 |
5 | gbkf | 是否为繁体词 |
6 | Jm | 是否为简码 |
7 | Rc | 是否为容错码 |
2、词组码本管理功能
为了方便对词组的管理,在完成词组自动编码的基础上,必须完成词组的成批插入、删除、词组导出、属性标定等功能。据此,可以编制一个词组码本管理程序以完成以上功能。
1)词组的收集及添加
2)频度的获得
3)简繁的标定
4)容错信息的标定、简码的获取
五、字词压缩码本生成
1、压缩码本总体结构
码本共分成两个部分:
1)索引表部分(.idx文件)主要包括标识信息、长度信息、简体字索引表、简体词索引表、繁体字索引表、繁体字索引表、简体字联想索引表、繁体字联想索引表等。此文件常驻内存。
<索引文件>::=<标识信息><长度信息><索引表><长度信息>::=<字索引长度><词索引长度><词联想索引表长度><字码本长度><词码本长度>词联想表长度>
<索引表>::=<字索引表><词索引表> <词联想索引表>
<字索引表>::=<索引表项>[<索引表项>]
<词索引表>::=<索引表项>[<索引表项>]
<词联想索引表长度>::=<索引表项>[<索引表项>]
<索引表项>::=<对应索引项长度>
2)码表部分(.mb文件)主要包括简体字表、简体词表、繁体字表、繁体词表、简体联想表、繁体联想表等。可根据需要分别部分调入内存。其中简体和繁体的码表结构相同。
<字码本>::=<输入码字表项>[<输入码字表项>]
<词码本>::=<输入码词表项>[<输入码词表项>]
<词联想码本>::=<联想词表项>[<联想词表项>]
<输入码字表项>::=<3个字节的输入码的BCD码>+<具有相同输入码的字条项>+<标记1>
<具有相同输入码的字条项〉::=<字条>+<标记2>
<标记2>::=<字条属性1><全码频度 ><三码频度><四码频度><五码频度>
<标记1>::=0xffff
<输入码词表项>::=<3个字节的输入码的BCD码>+<具有相同输入码的词条项>+<标记1>
<具有相同输入码的词条项〉::=<词条>+<标记3>
<标记3>::=<词条属性1><0xff><频度属性 ><保留属性1>
<联想词表项>::=<去除词条中第一个汉字的所有汉字>+0xffff
3、压缩码表的制作原理
压缩码表的制作包括索引表和码表的制作。其中的关键在于如何设计索引表。
首先,索引表之所以存在的理由是:当输入系统在庞大的码本数据中搜寻对应输入码的汉字时能加快速度。所以,我们的设计目标是对具有共性的一些汉字或词组统计其在码表中的字节数。而在对应的码表中具有共性的汉字或词祖被组织在邻近的地方。
假设以数字输入法的字索引表为例:字表中以输入码排序,这样相同输入码的汉字都被排在一起。而每个索引项分别存放输入码前三位相同的所有字在字表中的字节数。在此三位输入码中,第一位依次可取值“0-9”,第二位依次可取“空格、0-9” 第三位依次也可取“空格、0-9”,这样索引表长度为10*11*11,每一表项设定为2字节。假设前三位为“000”的汉字在字表中共有100字节。则应在字索引表对应第(0*11*11+1*10+1*10)位置以2字节存放100。
词索引的设计原理可采用字索引表类似的方法。
词联想索引可使用下列策略:联想表中按照词组首字的unicode内码排序,但不需要存放此首字。每个索引项分别存放与此表项对应的首字开始的所有词条在词联想表中的字节数。unicode 内码范围为4e00-9fa5,则此索引表的长度为20902。其中第一项的内容即为unicode中的第一个汉字“一”开始的所有词条在联想码本中的字节数。