BBS水木清华站∶精华区

发信人: 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()来完成的. 
 
  先写这些,以后会陆续写完. 
 
-- 
※ 修改:·shi 於 Jan 20 23:11:20 修改本文·[FROM:   159.226.65.19] 
※ 修改:·shi 於 Jan 20 23:11:59 修改本文·[FROM:   159.226.65.19] 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 159.226.65.19] 

BBS水木清华站∶精华区