ZNHOO Whatever you are, be a good one!

IME

Emacs的chinese-pyim输入法已经越来越复杂,脱离了一个输入法插件的要求,不建议安装。Fcitx安装时去掉了默认的输入法(通过-table USE)。额外安装fcitx-rime包。最好的用户词库工具是深蓝词库转换,支持几乎所有的主流输入法词库。

# Fcitx基本概念

  1. 拼音文件 —— Pinyin File is a text file with pinyin and one character per line, separated with space (built-in gbkpy.org).
  2. 词库文件 —— Phrase File is a text file with full pinyin separated with ' and the corresponding phrase (built-in pyPhrase.org).

    区分拼音文件和词库文件对于理解输入法非常重要。

  3. Fcitx的安装不难。不过要用好的话,就应该设置好拼音文件文件和词库文件。

    拼音文件基本不变。目前比较好的词库是来自搜狗拼音输入法,可以在官网免费下载 *.scel 结尾的词库文件

  4. Fcitx和chinese-pyim无法直接使用搜狗拼音输入法的*.scel词库文件,需要经过工具转换为中间格式*.org格式。经过排序,去重后:

    再将 *.org 格式转换成Fcitx的二进制*.mb格式;或转换成chinese-pyim的普通文本*.pyim格式。*.org格式既可以转成chinese-pyim*.pyim格式,也可以转换成Fcitx的*.mb格式。可以维护一份共同的*.org中间格式词库文件。

  5. 在Linux上,所有的文件必需是UTF-8编码。用enca/file test.org列出文件编码,用enca -x UTF-8 test.org把文件转换成UTF-8编码。

    如果编码非 UTF-8, 可能转换出错,即使转换成功,或者转换过程丢失很多词组。

  6. 虽然chinese-pyim (参考Emacs configuration文)和Fcitx都可以用*.org词库来转换,但有所不同:
    1. Fcitx词库拼音分隔符是单引号',但是chinese-pyim则是除单引号'之外的任何分隔符。
    2. chinese-pyim需要合并相同拼音前缀的行,还需要去除同一行相同的候选词。

Fcitx词库设置

Fcitx自带的拼音文件gbkpy.org可以直接使用,但自带的词库文件pyPhrase.org很差劲,根本没法用。

  1. 参考合并词库及方法步骤(2012-06-17 更新)120余万的搜狗细胞词库.
  2. 搜狗词库官网下载各种词库文件。譬如放到~/Downloads/scel/*.scel.
  3. *.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明令查看。

  4. 合并所有的*.scel.org文件为一个单一的org文件。

    ~ $ mkdir dict
    ~ $ cd dict
    ~ $ cat ../org/*.scel.org > 1.org
    

    得到1.org文件,合并词库文件,有利於提升输入法的性能。很明显从单个文件提词比从多个文件提词快。

    到目前威治我们得了一个*.org格式的大词库文件。

  5. 从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        # 去掉重复
    
  6. 转换成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.mbpyphrase.mb文件复盖原文件即可。

  7. 复盖Fcitx原文件。

    原文件一般位於系统路经 /usr/share/fcitx/{data,pinyin} 和个人用户目录~/.config/fcitx/{data,pinyin}。如果所在目录有原文件,就覆盖,没有的话就复制过去。

    在我的Gentoo下,位於{/usr/share,~/.config}/fcitx/pinyin/目录下。最后选择放到个人用户目录下。

  8. 上面描述里从*.scel*.org再到*. mb*格式的转换过程。

    如果能从网上下载到比较好的*.org*.mb会更省时(注意文件是否是UTF-8编码)。第四个参考链接里的sougou-phrases-full.7zfcitx-sougou-phrase-full.7z不错。

chinese-pyim词库设置

  1. 上面得到的3.org经过转换也可以给chinese-pyim使用。
  2. sed命令把'替换成-

    ~ $ sed -ibak  "s/'/-/g" 3.org
    
  3. 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
    
  4. 重新排序。经过awk合并后,顺序打乱了:

    ~ $ sort 4.org > 5.pyim
    
  5. 在同一行去重复。譬如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 定製指南.

基本介绍

  1. Rime比较好的地方是无广告、不联网、隐私高、定制性高。初期使用比较麻烦,好多概念不好理解。
  2. 添加用户自己的词库。
  3. 添加emoji输入。
  4. 同步用户定制。
  5. Fcitx Rime配置文件~/.config/fcitx/rime

Windows

  1. 最好在创建好多用户后,在普通帐户下安卓小狼毫。
  2. 让多用户共享同一个用户文件夹。

    虽然小狼毫自带的“小狼毫安装选项”可以更改用户文件夹,但是只对管理员账户有效。

    打开注册表,HKEY_CURRENT_USER\Software\Rime\Weasel里面有一个string属性的RimeUserDir参数(普通账户没有此参数要新新建一个),把它设置成新的用户文件夹地址(可能要重启),这样不同的Windows账户可以共用同一套配置。

    一个更好的办法是从管理员账户注册表拷贝过来。

  3. Windows和Linux没法共用一套配置,因为词库二进制格式不兼容。
  4. Rime在Windows和Linux上不区分换行符,\n\r\n都支持。

简体配置

  1. Rime自带的5个默认输入方案,但是对与我来说,只需要使用其中的“朙月拼音·简化字”。
  2. 每一个输入方案对应的配置文件以.schema.yaml结尾。譬如“朙月拼音·简化字”对于的是luna_pinyin_simp.schema.yaml

    由一个特殊的default.yaml表示当前总配置,会随着用户其他配置的改变而改变。

  3. 用什么输入方案就修改对应的配置文件。可以直接编辑默认schema文件。但更好的方法是创建一个对应的custom配置文件,如default.custom.yaml:

    patch:
      menu/page_size: 9
      schema_list:
        - schema: luna_pinyin_simp
    
    1. patch表示对默认的配置default.yaml进行修改。
    2. 候选项由5个词条改成9个。
    3. 输入方案去掉其他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: 〔表情〕
  1. 要输入表情,按"`",后接对应的表情字符串,具体参考rime emoji.
  2. 其中abc_segmentor/extra_tags在输入汉字时,表情包也显示在候选项中,特别是输入单个字母时(如'b'),候选项可能全是表情,可以注释掉。

词库

  1. 词库文件分两种。
    1. 用户输入累计,文件名带userdb。这个词库很小,基本不足为虑,可以随便编辑,甚至直接删除。
    2. 另一种就是我们要导入的大文本词库,文件名以.dict.yaml结尾。导入后,通过点击「重新部署/deploy」生成二进制格式词典以.table.bin结尾。

      注意,重启Fcitx没有效果,必须「重新部署/deploy」。

  2. 文本词库.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

  1. 同步概要
    1. 在Rime设置里点击“同步”。
    2. 因为Rime默认不会同步一些依赖的配置文件。所以第一次同步,还需要手动复制一些额外配置到同步目录下:

      ~ $ cp -n ~/.config/fcitx/rime/*.yaml sync_dir/installation_id
      
  2. 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时,就可以利用备份快速部署。

  1. 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文件,加载到内存,查找速度快。

  2. 导入配置文件

    重点注意,虽然前面备份时,额外拷贝了诸如default.yaml之类的文件,但是导入时最好重新用官方的。因为拷贝的default.yaml可能含有多余的选项。

     ~ $ cp ~/opt/rime-fcitx/Rime-Fcitx/*.yaml ~/.config/fcitx/rime
    

    前面说过,配置文件的同步是单向的,所以必须拷贝。

  3. 重新部署
  4. 同步词典
    1. 导入用户词典之前必须关闭Rime输入法,因为Rime运行时独享对用户习惯词典写权限。
    2. 必须在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即可。

Ref

  1. 合并词库及方法步骤(2012-06-17 更新)
  2. 120余万的搜狗细胞词库
  3. fcitx archlinux
  4. 词库下载
  5. rime词库