IME
01 Jan 2016 • Leave CommentsEmacs的chinese-pyim输入法已经越来越复杂,脱离了一个输入法插件的要求,不建议安装。Fcitx安装时去掉了默认的输入法(通过-table USE)。额外安装fcitx-rime包。最好的用户词库工具是深蓝词库转换,支持几乎所有的主流输入法词库。
# Fcitx基本概念
- 拼音文件 —— Pinyin File is a text file with pinyin and one character per line, separated with space (built-in gbkpy.org).
-
词库文件 —— Phrase File is a text file with full pinyin separated with
'
and the corresponding phrase (built-in pyPhrase.org).区分拼音文件和词库文件对于理解输入法非常重要。
-
Fcitx的安装不难。不过要用好的话,就应该设置好拼音文件文件和词库文件。
拼音文件基本不变。目前比较好的词库是来自搜狗拼音输入法,可以在官网免费下载 *.scel 结尾的词库文件
-
Fcitx和chinese-pyim无法直接使用搜狗拼音输入法的*.scel词库文件,需要经过工具转换为中间格式*.org格式。经过排序,去重后:
再将 *.org 格式转换成Fcitx的二进制*.mb格式;或转换成chinese-pyim的普通文本*.pyim格式。*.org格式既可以转成chinese-pyim的*.pyim格式,也可以转换成Fcitx的*.mb格式。可以维护一份共同的*.org中间格式词库文件。
-
在Linux上,所有的文件必需是UTF-8编码。用
enca/file test.org
列出文件编码,用enca -x UTF-8 test.org
把文件转换成UTF-8编码。如果编码非 UTF-8, 可能转换出错,即使转换成功,或者转换过程丢失很多词组。
- 虽然chinese-pyim (参考Emacs configuration文)和Fcitx都可以用*.org词库来转换,但有所不同:
- Fcitx词库拼音分隔符是单引号
'
,但是chinese-pyim则是除单引号'
之外的任何分隔符。 - chinese-pyim需要合并相同拼音前缀的行,还需要去除同一行相同的候选词。
- Fcitx词库拼音分隔符是单引号
Fcitx词库设置
Fcitx自带的拼音文件gbkpy.org可以直接使用,但自带的词库文件pyPhrase.org很差劲,根本没法用。
- 参考合并词库及方法步骤(2012-06-17 更新)和120余万的搜狗细胞词库.
- 去搜狗词库官网下载各种词库文件。譬如放到~/Downloads/scel/*.scel.
-
把*.scel文件转换成*.org文件:
~ $ cd Downloads ~ $ mkdir org ~ $ cd scel ~ $ find -L . -type f -iname '*.scel' -exec scel2org -o ../org/{}.org {} \; # or ~ $ for i in *.scel; do scel2org $i -o ../org/$i.org; done ~ $ cd .. ~ $ ls org
这个命来还会打印出所有被转换的词库名称。~/Downloads/org/下存放着转换后的*.scel.org文件,此文件是普通文本文件,可以用less明令查看。
-
合并所有的*.scel.org文件为一个单一的org文件。
~ $ mkdir dict ~ $ cd dict ~ $ cat ../org/*.scel.org > 1.org
得到1.org文件,合并词库文件,有利於提升输入法的性能。很明显从单个文件提词比从多个文件提词快。
到目前威治我们得了一个*.org格式的大词库文件。
-
从Fcitx源码包解压出~/Downloads/dict/pyPhrase.org - Fcitx默认自带的词库文件,很糟糕,我们把它合并到刚刚生成的1.org中。
~ $ tar xf fcitx-4.2.4.1_dict.tar.xz ~ $ tar xf fcitx-4.2.4.1_dict.tar.xz/data/pinyin.tar.gz ~ $ tar xf data/pinyin.tar.gz ~ $ cat pyPhrase.org >> 1.org # 合并 ~ $ sort 1.org > 2.org # 排序 ~ $ uniq 2.org > 3.org # 去掉重复
-
转换成Fcitx使用的*.mb格式。
从Fcitx源码包解压出~/Downloads/dict/gbkpy.org - Fcitx默认自带的拼音文件,生成*.mb词库需要拼音文件的辅助。
~ $ cp fcitx-4.2.4.1/data/gbkpy.org . ~ $ man createPYMB ~ $ createPYMB gbkpy.org 3.org
如果 3.org 文件非常大的话,可能需要10分钟左右,耐心等待。最后生成 4 个新文件:
dict/ ├── 3.org ├── gbkpy.org ├── pyERROR 词库中重复或有问题的词条,有兴趣可参考,可以直接忽略 ├── pyPhrase.ok 可以顺利转换的词条;和pyERROR一起就是3.org ├── pyphrase.mb 最终 Fcitx 使用的二进制词库,用它覆盖Fcitx原*pyphrase.mb*。 └── pybase.mb 二进制词库的配套字码库,用于覆盖原*pybase.mb*。
只需要用新转换得到的pybase.mb和pyphrase.mb文件复盖原文件即可。
-
复盖Fcitx原文件。
原文件一般位於系统路经 /usr/share/fcitx/{data,pinyin} 和个人用户目录~/.config/fcitx/{data,pinyin}。如果所在目录有原文件,就覆盖,没有的话就复制过去。
在我的Gentoo下,位於{/usr/share,~/.config}/fcitx/pinyin/目录下。最后选择放到个人用户目录下。
-
上面描述里从*.scel到*.org再到*. mb*格式的转换过程。
如果能从网上下载到比较好的*.org或*.mb会更省时(注意文件是否是UTF-8编码)。第四个参考链接里的sougou-phrases-full.7z或fcitx-sougou-phrase-full.7z不错。
chinese-pyim词库设置
- 上面得到的3.org经过转换也可以给chinese-pyim使用。
-
用sed命令把
'
替换成-
:~ $ sed -ibak "s/'/-/g" 3.org
-
用awk合并相同拼音前缀的行,也就是汉字的同音字/词。譬如gai-shan 改善和gai-shan 改删两行就需要合并成gai-shan 改善 改删,这是chinese-pyim的要求,Fcitx并没有此要求。
~ $ awk '{key=$1; $1=""; a[key]=a[key] $0}; END{ for (key in a) { print key a[key];}}' 3.org > 4.org
-
重新排序。经过awk合并后,顺序打乱了:
~ $ sort 4.org > 5.pyim
-
在同一行去重复。譬如a-ba 阿爸 阿坝 阿爸就需要去除多余的阿爸,这是由于第三步合并时,可能有两行里包含相同的词。
~ $ awk '{printf("%s",$1); for (i=2;i<=NF;++i) if (!a[$1" "$i]++) printf(" %s", $i); printf("\n");}' 5.pyim > pyim-dict.pyim
Rime词库
设置过程中参考Rime 定製指南.
基本介绍
- Rime比较好的地方是无广告、不联网、隐私高、定制性高。初期使用比较麻烦,好多概念不好理解。
- 添加用户自己的词库。
- 添加emoji输入。
- 同步用户定制。
- Fcitx Rime配置文件~/.config/fcitx/rime。
Windows
- 最好在创建好多用户后,在普通帐户下安卓小狼毫。
-
让多用户共享同一个用户文件夹。
虽然小狼毫自带的“小狼毫安装选项”可以更改用户文件夹,但是只对管理员账户有效。
打开注册表,
HKEY_CURRENT_USER\Software\Rime\Weasel
里面有一个string属性的RimeUserDir参数(普通账户没有此参数要新新建一个),把它设置成新的用户文件夹地址(可能要重启),这样不同的Windows账户可以共用同一套配置。一个更好的办法是从管理员账户注册表拷贝过来。
- Windows和Linux没法共用一套配置,因为词库二进制格式不兼容。
- Rime在Windows和Linux上不区分换行符,
\n
和\r\n
都支持。
简体配置
- Rime自带的5个默认输入方案,但是对与我来说,只需要使用其中的“朙月拼音·简化字”。
-
每一个输入方案对应的配置文件以.schema.yaml结尾。譬如“朙月拼音·简化字”对于的是luna_pinyin_simp.schema.yaml。
由一个特殊的default.yaml表示当前总配置,会随着用户其他配置的改变而改变。
-
用什么输入方案就修改对应的配置文件。可以直接编辑默认schema文件。但更好的方法是创建一个对应的custom配置文件,如default.custom.yaml:
patch: menu/page_size: 9 schema_list: - schema: luna_pinyin_simp
- patch表示对默认的配置default.yaml进行修改。
- 候选项由5个词条改成9个。
- 输入方案去掉其他4个不需要的,只加载简体方案。
emoji
让简体方案支持emoji表情输入。在default.custom.yaml / luna_pinyin_simp.custom.yaml加入:
engine/translators:
- punct_translator
- r10n_translator
- reverse_lookup_translator
recognizer/patterns/reverse_lookup: "`[a-z]*$"
schema/dependencies:
- emoji
abc_segmentor/extra_tags:
- reverse_lookup
reverse_lookup:
dictionary: emoji
enable_completion: false
prefix: "`"
tips: 〔表情〕
- 要输入表情,按"`",后接对应的表情字符串,具体参考rime emoji.
- 其中abc_segmentor/extra_tags在输入汉字时,表情包也显示在候选项中,特别是输入单个字母时(如'b'),候选项可能全是表情,可以注释掉。
词库
- 词库文件分两种。
- 用户输入累计,文件名带userdb。这个词库很小,基本不足为虑,可以随便编辑,甚至直接删除。
-
另一种就是我们要导入的大文本词库,文件名以.dict.yaml结尾。导入后,通过点击「重新部署/deploy」生成二进制格式词典以.table.bin结尾。
注意,重启Fcitx没有效果,必须「重新部署/deploy」。
-
文本词库.dict.yaml的格式:
```
Rime dictionary
encoding: utf-8
#
部署位置:
~/.config/fcitx/rime (Linux)
~/.config/ibus/rime (Linux)
~/Library/Rime (Mac OS)
%APPDATA%\Rime (Windows)
#
于「重新部署/deploy」后生效
#
name: luna_pinyin_simp.zh-cn version: "2016.03.02" sort: by_weight use_preset_vocabulary: true import_tables: - luna_pinyin …
啊啊 a a 啊啊叫 a a jiao 啊啊声 a a sheng 啊哎 a ai 阿巴 a ba 阿爸 a ba 阿坝 a ba
1. 前面几行'#'表示注释。
2. 三个连续的连接符'-'开始,后面紧跟文本词库的基本配置信息。
*name*是词库名,词库名加上*.dict.yaml*后缀就是词库文件名。上面例子中,词库名是*luna_pinyin_simp.zh-cn*,对应的词库文件名是*luna_pinyin_simp.zh-cn.dict.yaml*。
3. *import_tables* 表示导入其他词库。
一个文本词库文件可以不需要后面的码表,直接导入多个已经存在的基本词库,这个和C语言里面的`#include <stdio.h>`类似。
特别注意,*import_tables* 没法递归导入。被导入词库的码表部分会加到二进制词库里,开头部分信息(包括被导入词库的 *import_tables* 部分)。譬如 A 导入 B,B 导入了 C,但是最终生成的二进制 A 词库里只有 B 的码表内容,C 的码表内容并没有导入 A。正确的做法是 A 同时导入 B 和 C。
4. 三个连续的'.'后面紧接词库码表。
5. 上面码表的编码(拼音)可以省略,只剩字和词。因为在生成二进制词库时,Rime 库会依据输入方案的配置自动补齐编码(拼音)部分。
这样,拼音方案、五笔方案、双拼方案可以公用同一个文本词库,Rime 会根据方案的命令自动补齐对应的编码(全拼码,五笔码,双拼码)。
3. 简体方案词库配置
创建*luna_pinyin_simp.custom.yaml*:
patch: translator/dictionary: luna_pinyin_simp.zh-cn
*translator/dictionary*表示这个方案使用的词库名。默认简体方案使用自带的*luna_pinyin*词库,现在修改成用户自己的*luna_pinyin_simp.zh-cn*。注意新词库包含了默认词库。
4. 设置同步
同步用户配置以及词库本身,方便不同的机器共享。譬如可以同步到dropbox,这样不同的机器可以及时共享配置。
直接編輯用戶文件夾下的*installation.yaml*,添加:
sync_dir: "/home/username/workspace/rime" installation_id: "Rime"
默认的*installation_id*是一串字母数字,改成比较好认识的。最终同步到 *sync_dir/installation_id* 下面。注意*sync_dir*必须是绝对路径,不要用tilde。
同步分为两部分:
1. 配置文件的同步是单向的,即有Rime目录同步到到*sync_dir*。所以在新机器上部署时,配置文件需要拷贝到Rime目录。
2. 用户词库的同步是双向的,即在Rime目录和*sync_dir*之间双向同步。
5. 重新部署/deploy
Fcitx的图像界面就有*deploy*字样,点击即可。如果找不到图形设置选项,可以:
```bash
$ rm ~/.config/fcitx/rime/default.yaml
然后重启Fcitx。缺少default.yaml,Rime会触发重新部署deploy。
对于大的词库,可能需要等几分钟,Rime会根据文本词库生成对应的二进制词库.table.bin。
- 同步概要
- 在Rime设置里点击“同步”。
-
因为Rime默认不会同步一些依赖的配置文件。所以第一次同步,还需要手动复制一些额外配置到同步目录下:
~ $ cp -n ~/.config/fcitx/rime/*.yaml sync_dir/installation_id
-
OpenCC
Fcitx 和 Fcitx-rime 都会依赖 app-i18n/opencc 包。
简体繁体转换。opencc命令默认是转换成繁体,如果是繁体转换成简体,则需要参数-c,制定配置文件(/usr/share/opencc/*.ini)。
$ opencc -i input.file -o output.file [-c /usr/share/opencc/zhs2zht.ini]
重新部署
Rime把用户数据同步在sync_dir下。当需要在新机器上安装Rime时,就可以利用备份快速部署。
-
sync_dir:
# ~/opt/rime-fcitx/Rime-Fcitx default.custom.yaml default.yaml emoji.schema.yaml installation.yaml luna_pinyin.schema.yaml luna_pinyin.userdb.txt luna_pinyin_simp.big.dict.yaml luna_pinyin_simp.custom.yaml luna_pinyin_simp.fcitx.dict.yaml luna_pinyin_simp.schema.yaml luna_pinyin_simp.userdb.txt symbols.yaml
备份数据主要有两种格式,一种是Rime配置文件*.yaml,另一种是Rime根据用户日常输入习惯保存的小型词库*.txt。需要注意的是,这种个人习惯词库一般称为“词典”比较合适,它和上面我们提到导入的大词库在格式、加载速度上大不同。用户习惯词典是文本文件,数据量很小,加载速度慢;*.yaml词库在部署后会转成二进制*.bin文件,加载到内存,查找速度快。
-
导入配置文件
重点注意,虽然前面备份时,额外拷贝了诸如default.yaml之类的文件,但是导入时最好重新用官方的。因为拷贝的default.yaml可能含有多余的选项。
~ $ cp ~/opt/rime-fcitx/Rime-Fcitx/*.yaml ~/.config/fcitx/rime
前面说过,配置文件的同步是单向的,所以必须拷贝。
- 重新部署
- 同步词典
- 导入用户词典之前必须关闭Rime输入法,因为Rime运行时独享对用户习惯词典写权限。
- 必须在Rime目录下运行。
~ $ cd ~/.config/fcitx/rime ~ $ rime_dict_manager ~ $ rime_dict_manager -l ~ $ rime_dict_manager -i luna_pinyin_simp ~/opt/rime-fcitx/Rime-Fcitx/luna_pinyin_simp.userdb.txt # or ~ $ rime_dict_manager -s
启动Rime即可。