汉字输入教学系统中词组切分方法的设计
朱晓旭
苏州大学计算机工程系 苏州大学纵横汉字信息技术研究所
【摘 要】词组切分是现代中文信息处理的基础,是汉语自然语言理解与处理、机器翻译、智能检索、电子词典等信息处理的前提。本文分析了汉字输入训练中词组切分的特点,介绍了汉字输入训练中词组切分方法的具体设计以及切分词典的组织与检索上的一些方法和技巧。
【关键词】词组切分 歧义切分 汉字内码
一、引言
汉字输入的速度主要取决于以下几个因素:①所用汉字输入法的平均码长与重码情况;②输入人员的击键速度;③输入人员对所用汉字输入法的熟练程度。第一个因素属于输入法的性能指标范畴,对于每一种确定的输入法它是一个不可改变的因素。而第二个因素具有极限性,每位输入人员的击键速度在达到一定程度后难以再提高。第三个因素却具有很大的可开发性。基于单字输入一段文本和基于词组输入同样的一段文本,速度会大相径庭。例如:“汉字输入的速度”,以“汉字”、“输入”、“的”、“速度”这样三个词组加一个单字的形式输入速度就大大的快于以七个单字形式输入。
可见,提高一个输入人员根据所使用汉字输入法提供的词组的所输入文章的分词能力,是提高中文输入速度的关键。然而汉字输入时的词组切分与我们语法意义上的词组切分又不完全一样,存在明显区别,因为汉字输入法所提供的词组不是严格的语法意义上的词组,例如:许多输入法中提供“我们的”这样的词组,所以依靠输入人员自己按照语法切分,就可能不能充分利用输入法的词组优点。因此,选择一个适当的词组切分方法,正确地对中文文章按照对应输入法的词组集合进行词组切分,是科学地辅助中文输入人员提高汉字输入速度的有效途径。所以我们开发了一个可以按照输入法词库进行词组切分的汉字输入教学系统。本文就切分方法的选择与词典的组织与检索进行介绍。
二、词组切分方法的选择
现有的词组切分方法可以分成三大类:基于字符串匹配的词组切分方法,基于理解的词组切分方法和基于统计的词组切分方法。这些不同的词组切分方法,满足了不同的词组切分需求,应用于不同用途的中文信息处理系统。
在开发实现汉字输入教学系统时,我们应该选择什么样的词组切分方法?汉字输入教学系统对词组切分的需求有如下三个特点,第一,不同的汉字输入法所提供的词组数量不同,有的一万多条,有的十多万条,词组切分所依据的词典差别很大。第二,许多汉字输入法提供了词组自定义的功能(即用户自己造词),报社的输入人员可能会将“阿拉法特”定义一个词组加快输入,所以,用于词组切分的词典应该是一个开放的集合。第三,在许多汉字输入法中,为了方便输入,许多从语法意义上不是词组的字的搭配也可以作为词组输入,例如“每一”、“咱们的”等,甚至会有“维生素C”这样的词组,所以词典所含的词组可能不是较严格的词组,而是输入单位。考虑到这些需求特点,在开发实现汉字输入教学系统时,我们选择基于字符串匹配的词组切分方法,对应输入法的所有词条构成字符串匹配的词典。
基于字符串匹配的词组切分方法中用的最多算法是最大匹配检索法,其基本过程大致如下:(1)从被处理文本中的起点取出不超过词典最大长度的汉字串作为匹配字段;(2)在词典中查找该匹配字段;(3)如果找到该匹配字段,则切分出一条词,设长度为n,并后移n个字作为下一次分词的起点,再转到步骤(1);(4)如果未找到该匹配字段,则去除匹配字段的最后一个字,作为新的匹配字段,并转到步骤(2);
以上是正向最大匹配检索法。如果从被处理文本的尾部向前处理,匹配不成功时去除前面一个字,就是逆向最大匹配检索法。如果同时使用两种最大匹配检索法,就构成了双向最大匹配检索法。
由于自然语言书面表达有时会出现二义性,在词组切分时,必然遇到的一个问题是切分歧义问题。目前通常把歧义字段从构成形式上分成两类:①集型歧义字段。比如切分字段ABC,可以分成AB/C,又可以分成A/BC。②组合型歧义字段。切分字段AB,其中不仅AB是词组,而且A、B也分别是词组。
在用户实际输入的过程中,对于组合型歧义字段,作为一个整体输入明显快于分成两个词组输入。由于采用最大化匹配,所以在系统中对于组合型歧义字段被统一切分成AB,而不是A和B两个词。例如“程序设计”在智能ABC输入法中是一个词组,“程序”与“设计”也是词组,直接输入“程序设计”明显要更方便。
有资料表明[1],大约90%以上的歧义字段都是交集型歧义,所以我们主要需要解决交集型歧义字段切分的问题。目前常用的交集型歧义字段的采集方法是双向最大匹配检索法和正向最大匹配检索与逐词扫描相结合的方法(简称逐词扫描的最大匹配法)。通过分析可知,采用前者可以检查出大多数的交集型歧义字段,而后者可以识别全部的交集型歧义字段。因此我们采用逐词扫描的最大匹配法,其基本过程大致如下:①从被处理文本中的起点取出不超过词典最大长度的汉字串作为匹配字段;②在词典中查找该匹配字段;③如果未找到该匹配字段,则去除匹配字段的最后一个汉字,作为新的匹配字段,并转到步骤(2);④如果找到该匹配字段,则切分出一条词,同时与最近切分的词的做比较;⑤如果二者是交集型歧义字段,根据作出交集型歧义字段的标记,并转到(8);⑥如果二者是组合型歧义字段,则直接转(8);⑦如果二者无歧义关系,则作出词组的标记,并转到(8);⑧后移一个字作为下一次分词的起点,再转到步骤(1)。
在逐词扫描的最大匹配法中,因为每个字都有被作为词的首字进行匹配的过程,所以可以找出所有的交集型歧义字段。如何将找出的交集型歧义字段,进行正确切分,是一个与上下文相关的复杂问题,同样的交集型歧义字段在不同的文章中正确的切分结果可能不同。但有统计表明[2]交集型歧义字段在语料中出现的次数和语料中所含汉字总数之比为0.766%,所以在系统中,我们通过逐词扫描的最大匹配法找出所有的交集型歧义字段,用特殊颜色显示,提供人机界面,由用户人工干预切分这少量数据,人工切分结果可以保存,如果用户不愿干预,则以最大匹配检索法的结果为准。
三、词典的组织与检索
最大匹配检索法在匹配词组时,因为词典数据量大,大量耗时操作是在在词典中查找该匹配字段是否存在, 所以尽量缩小每一次的查找范围,是提高查询速度、保证系统高效的关键。
下面以正向最大匹配检索法的词典的组织与索引的建立为例进行说明。假设所有的词组保存在一张名为CiList的Access数据表中,该表的字段如表1所示。
对最大匹配检索法分析可知,当在匹配以字A开头的词组时,只需要在词典中所有以字A开头的数据中查询,无需遍历整个词典,可见,数据的组织要便于每一次精确地缩小查询范围,所以在CiList中以同一个汉字开头的词组应该相邻排列。
表1:词典表CiList结构
字段名称 | 字段类型 | 说明 |
CiZu | 文本型 | 词组的内容 |
InputCode | 文本型 | 对应词组的 输入码,为 系统提供输 入码实时帮 助服务 |
表2:词典索引表CiIdx结构
字段名称 | 字段类型 | 说明 |
HanZi | 文本型 | 汉字 |
CiCount | 整型 | 描述在词 典表中以此汉字开头的词组的总数 |
同时,因为词典索引表CiIdx要放下所有的汉字,所以它也是一个数据量上万的表,每次在其中查询字A所在的记录也是一个费时操作,而且在系统中需要大量查询索引表。因此如果能够加快在查询词典索引表CiIdx中的查询速度,也可以大大提高系统词组切分的效率。在这里我们使用的方法是,化查询为直接存取。
对于GB2312、GBK、Unicode等字符编码而言,中文内码的分布都有一定的区间,因此通过对内码分布区间进行分析,可以建立一个从汉字的内码到唯一汉字序号的函数。以Unicode为例,编码位置从 4E00 ~ 9FFF,共 20992 个字位。对于Unicode字符中汉字由内码到序号的函数用C语言实现如下:
int convert_unicode_to_serial(unsigned char * lpf)
{
unsigned char highbyte,lowbyte;
highbyte = *lpf;
lowbyte = *(lpf+1);
return (highbyte -0x4e) *256+ lowbyte;
}
说明:1. 函数的形式参数为指向汉字字符串的指针,返回值为序号。
2. 此函数对于内码相对小的汉字此函数的返回值也相对小。Unicode中第一个汉字的返回值为0。
因为如前所述,在词典索引表CiIdx中记录是按照汉字的内码排序,这样我们就可以通过汉字内码,无需查询,直接计算出字A在词典索引表CiIdx中对应的记录号,从而进一步取存取词典表CiList。因为此时词典索引表CiIdx中只有CiCount字段发挥作用,在实际实现中,我们可以将词典索引表CiIdx转为用一个二进制文件存放,把每条记录的CiCount字段的值用两个字节在文件中按照上述函数计算出的值顺序排放,这样通过计算出汉字的序号就可以直接取出文件中指定的字节去定位词典表CiList中的范围,且此文件在系统运行一开始调入内存。这样查索引表变成了一个通过计算后直接存取内存的过程,明显提高了性能。
此外,为了保证最大化切分,在词典表CiList中,对于首汉字相同的词组,是按照词组的长度从大到小排列,在词组匹配时一旦匹配成功就可以返回。本系统对于组合型歧义字段(AB成词,A与B也单独成词的情况)被统一切分成AB,而不是A和B两个词。
四、结束语
因为,不同的中文输入法所用词组码本不尽相同,为了提高软件的通用性,可以以任何一种中文输入法所提供的词组作为分词词典进行分词,在具体实现中,将解析中文输入法码本与将数据组织成所需形式的功能通过DLL形式实现,因此通过编写不同的解析码本与组织数据的DLL,本系统可以对任何一种提供词组功能的中文输入法进行词组切分辅助训练。
因为有了词组切分的基础,在数据表中添加存储对应字与词的输入码的字段,就可以在用户使用软件的时候提供在线的输入码提示,帮助用户学习,而且可以计算出一篇文章理论上的击键次数,通过对相应消息的捕获与处理,程序中也可以对用户实际击键次数进行统计,从而可以让用户可以量化地了解自己的水平。
计算机词组切分是现代中文信息处理的重要组成部分,是汉语自然语言理解与处理、机器翻译、智能检索、电子词典等信息处理中最基础的工作。目前还没有一个能够系统的、完全的解决切分歧义问题的方法,所以选择不同词组切分方法也要与应用相结合,要在满足具体应用的需求与系统的代价之间找出一个完美的结合点。
参考文献:
[1.] 亢临生,张永奎 利用分词属性解决歧义问题 电脑开发与应用 1994.4:2~5
[2.] 辛春生,孙玉芳 汉语简繁体转换与词语切分. 小型微型计算机系统. 2000.9:982~985
[3.] 路志英,林孔元等 中文切分词典的最大化匹配索引法. 天津大学学报. 1999.5:599~602