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