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水木清华站∶精华区