发信人: shi (石头), 信区: Linux 标 题: pyinput输入法的设计思想(1) 发信站: BBS 水木清华站 (Wed Jan 20 23:09:24 1999) 为了大家能利用pyinput,完善pyinput,我把该输入法的设计思想 总结一下,如果有那写得不明白,欢迎提问. 今天晚上先写了一部分. 1 首先根据table文件生成拼音字典. 按照table文件中的拼音顺序为每个拼音分配一个key, 例如: a=1, ai=2, an=3, ang=4, ... 即填充好InputModule的pytab. 然后把table文件中每个拼音后的所有的汉字填充到 InputModule的hztab中. 这样就可以根据每个拼音的key来找到相对应的所有的汉字. 即pytab与hztab通过key相联系. 这一步是通过HZassoc.c中的LoadTable()来完成的. 2 加载系统词库和用户词库. 首先讲一下词库的结构: 系统词库和用户词库的结构完全一样.词库的结构如下: 第一个字节是词的长度len,下面的len+1个字节是词的拼音 的key,再下面的2*len个字节是词的汉字,即表示一个词需要 1+(len+1)+2*len个字节. 因为汉字拼音的总数大于256个小于512,这样每个拼音的key 需要9位来表示,也就是说用一个字节来表示少了,但用两个字节 来表示就浪费了第二个字节的7位,只利用了其中的1位,为了节约 内存空间,我是这样表示每个词的key的,把每个key的低8位截取下 来存放,把所有key的第9位截取下来集中放在一个字节中,这样每 个词最多只能有8个字.说了这么多,还是举一个例子来看看. 例如:"好朋友"怎么来表示呢? 首先根据table文件可以知道每个字的key. "好"的拼音是hao, 查table得hao的key是113, 113的二进制表示是01110001 "朋"的拼音是peng, 查table得peng的key是240, 240的二进制表示是11110000 "友"的拼音是you, 查table得you的key是366, 366的二进制表示是101101110 分别截取113,240,366的低8位得:01110001,11110000,01101110,用3个字节 来存放,而113,240,366的第九位分别为0,0,1,把它们按照由低到高的顺序合并 为一个字节得:00000100,把这个字节放在最前面,得到一个四个字节的序列. 00000100,01110001,11110000,01101110.这就是这个词的拼音表示. 所以"好朋友"这个词的长度为3,需要用3+1个字节来表示它的拼音的key,2*3个 字节来表示这个词的汉字,具体就是: 00000011,00000100,01110001,11110000,01101110,10111010,11000011, 11000101,11110011,11010011,11010001, 用16进制表示为:03,04,71,F0,6E,BA,C3,C5,F3,D3,D1. 也就是"好朋友"这个词需要1+(3+1)+2*3=11个字节来表示. 整个词库就是这样的字节流.所以词库里即包含了拼音信息,又包含了汉字信息. 本输入法附带的工具里面的sim2lib.c就是把形如: 好朋友 hao peng you 我们 wo men 这样的普通文件转换成词库. 附带的sim2lib1.c可以把形如: 好朋友 我们 这样的普通文件转换成词库,但因为有的字是多音字,所以无法转换,例如: "着急"的"着"有好几个发音,所以无法转换. 而lib2sim.c可以把词库转换成普通文件. 注意的是单个字也可以看作一个词,以加载到词库文件中,我在libphrase中 加了一些这样的单字词,但不是很多,大家可以把一些常用的单字词自己加进去. 知道了词库的结构,就可以根据词库文件libphrase和usrphrase把词库加载 到内存中,即填充InputModule的phtab,phtab是一个二维数组,phtab[0]是 用户词库,phtab[1]是系统词库,phtab[0]和phtab[1]是都是动态链表,结构如下: phtab[][1]=词的拼音key(KeyPhrase)->符合该key的词的汉字(HzPhrase)->HzPhrase-> ... || \/ 词的拼音key(KeyPhrase)->符合该key的词的汉字(HzPhrase)->HzPhrase-> ... || \/ .... phtab[][2]=词的拼音key(KeyPhrase)->符合该key的词的汉字(HzPhrase)->HzPhrase-> ... || \/ 词的拼音key(KeyPhrase)->符合该key的词的汉字(HzPhrase)->HzPhrase-> ... || \/ .... phtab[][3]=词的拼音key(KeyPhrase)->符合该key的词的汉字(HzPhrase)->HzPhrase-> ... || \/ 词的拼音key(KeyPhrase)->符合该key的词的汉字(HzPhrase)->HzPhrase-> ... || \/ .... ....... 其中phtab的下标1,2,3...是由词的第一个字的拼音key决定的. 这是通过HZassoc.c中的LoadPhrase()来完成的. 先写这些,以后会陆续写完.