LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1892|回复: 1

标题: 分享我在ubuntu 9.10下编译ibus二笔输入法词库的过程,希望对大家有用

[复制链接]
发表于 2010-2-6 23:11:50 | 显示全部楼层 |阅读模式
一、起因
在windows环境下,笔者一直使用极点平台下的“的卢”26键二笔输入法,前一段时间安装了ubuntu9.1,使用系统自带的ibus拼音输入法,感觉不习惯,于是上网搜索linux下使用的二笔输入法,发现linux下使用的ibus二笔输入法以及二笔青松输入法是传统的30键二笔输入法,编码方案和“的卢”26键二笔输入法相差较远,也不符合使用习惯,于是萌生了把26键输入法码表移植到ibus输入平台下的想法。
二、尝试
1.从网上下载ibus二笔输入法的安装包:
http://ibus.googlecode.com/files/ibu...0090901.tar.gz
2.解压下载回来的压缩包:
tar -zxf ibus-table-erbi-1.2.0.20090901.tar.gz
3.解压后在当前目录生成一个名为ibus-table-erbi-1.2.0.20090901的目录,打开 ibus-table-erbi-1.2.0.20090901/tables 目录下的 erbi.txt,修改如下内容:

第一个需要修改的地方:

### Valid input chars.
VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyz,./;

上面的两行是三十键二笔输入法的编码方案的所有字符,二十六个英文字母加上四个标点符号,我用的二十六键二笔输入法编码方案输入字符只有二十六个字母按键,所以要修改为如下内容(去掉四个标点符号):

### Valid input chars.
VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyz

第二个需要修改的地方:
### Define the prompts of each valid input char.
BEGIN_CHAR_PROMPTS_DEFINITION
a 安
b 不
c 产
d 的
e 而
f 分
g 个
h 和
i 有
j 就
k 可
l 了
m 们
n 你
o 哦
p 平
q 起
r 人
s 是
t 他
u 大
v 这
w 为
x 学
y 一
z 在
, ,
. 。
/ 、
; ;
END_CHAR_PROMPTS_DEFINITION

上面的内容是一级简码,也就是只要一个字母就能打出来的字,因为采用二十六键二笔输入法的编码方案,所以最下面的四行要去掉

第三个需要修改的地方,也是最重要的地方,码表:

### Begin Table data.
BEGIN_TABLE
/ 、 0
/, Ⅲ 0
/. Ⅳ 0
// Ⅴ 0
/; 拾 3454
/a 壹 94
/b ⑸ 0
/c ⑶ 0
/d 叁 578
/e ③ 0
/f 肆 1399
...
...
...
...
...
...
...
uzuo 琢 995
uzuo 嘬 69
uzuo 笮 0
uzuo 酢 19
uzuo 柞 51
END_TABLE

以上是ibus二笔输入法的码表节选,我使用的是的卢二笔的二十六键码表,内容如下:

[Text]
a 安

aadb 嗷嗷待哺

aajj 安安静静

aaww 安安稳稳

abbd 按兵不动

abdc 安步当车

abjb 按部就班

abss 爱不释手

abzb 阿布扎比

ac 嫒
...
...
...
...
...
...
...
zzzq 铸造 镇长

zzzs 自作自受

zzzt 战争状态

zzzu 针扎

zzzw 针织物

zzzx 沾沾自喜 只争朝夕

zzzy 种族主义

zzzz 自作主张 重中之重

最初的想法比较简单,只是把我的码表部分(去掉"[Text]")复制到 ibus 码表部分覆盖掉原来的码表,于是码表变成了下面的样子:

BEGIN_TABLE
a 安

aadb 嗷嗷待哺

aajj 安安静静

aaww 安安稳稳

abbd 按兵不动

abdc 安步当车

abjb 按部就班

abss 爱不释手

abzb 阿布扎比

ac 嫒
...
...
...
...
...
...
...
zzzq 铸造 镇长

zzzs 自作自受

zzzt 战争状态

zzzu 针扎

zzzw 针织物

zzzx 沾沾自喜 只争朝夕

zzzy 种族主义

zzzz 自作主张 重中之重
END_TABLE

当然这只是尝试,经过编译测试失败!

后来上网搜索得知,ibus的码表中第三列的数字是“词频”,并且ibus码表有严格的要求,参见这个帖子:

http://code.google.com/p/ibus/issues/detail?id=94

该帖子中相关内容如下:
----------------------------------
* 每列之间必须使用tab(\t)分割,而不能空格
* 每个词条必须要有一个词频,或者说必须有两个tab分开的三部分。
----------------------------------

参考ibus-table-erbi-1.2.0.20090901/tables/template.txt,另外我又总结了两条:

* 重码部分用两行或多行表示,而不是的卢码表的一行多个编码
* 文件保存格式必须采用UTF-8方案

我搜索了很多网站,没找到关于词频的详细定义和相关算法,实在没有办法生成这个词频字段,有的网友是采用全部置0或1的方法解决的,我经过综合考虑,另外采用了一个方案:

* 对于的卢码表中在ibus码表中存在的词条,采用ibus码表的词频
* 对于的量码表中在ibus码表中不存在的词条,其词频置0

剩下的就是怎样实现上面的方案了,我采用了比较熟悉的C语言来解决问题,实现思路是这样的:

从的卢码表中读取一行(编码及词条),然后从ibus码表中检索是否存在该词条,如果有该词条则将的卢码表中的编码及词条加上ibus码表中的相应词条后面的词频写到一个新文件中去;如果在ibus码表中没有该词条则将的卢码表中的编码及词条加上“0”写到上述的新文件中,最后生成的文件就是符合ibus 要求的二十六键二笔输入法的码表了。

最后编译码表:

/usr/bin/ibus-table-createdb -n erbi.db -s erbi.txt

将生成的码表文件和相关的图标文件复制到相关目录:

cp ibus-table-erbi-1.2.0.20090901/tables/erbi.db /usr/share/ibus-table/tables/
cp ibus-table-erbi-1.2.0.20090901/icons/erbi.png /usr/share/ibus-table/icons/

注销并重新登录,就可以在ibus中添加新的二笔输入法了
发表于 2010-2-7 09:16:51 | 显示全部楼层
Post by qingzhu;2067867
从的卢码表中读取一行(编码及词条),然后从ibus码表中检索是否存在该词条,如果有该词条则将的卢码表中的编码及词条加上ibus码表中的相应词条后面的词频写到一个新文件中去;如果在ibus码表中没有该词条则将的卢码表中的编码及词条加上“0”写到上述的新文件中,最后生成的文件就是符合ibus 要求的二十六键二笔输入法的码表了。


词频决定的是顺序。你需要确定的也只是顺序。全部置 0 并不合适。

对于原码表中的词条,你保持原有的顺序,对于你新增的词条,你要根据顺序设置词频。

就假如说,你新增的词条,前面是A字,后面是B字。
查 ibus 发现 A 字的词频是 200,B 字的词频是 100 的话,你新增的字设置为  150 即可。这个就是针对同码的情况。

如果是唯一码,那么词频信息可能意义不大。当然如果希望简码输入的时候,词频信息也有用:例如,如果希望输入 abc 的时候,就把 abca, abcb, abcc 都显示出来,那么针对后面三者的词频统计就有价值了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表