作为一个比较“事儿多”的五笔用户,在使用过几乎所有的主流输入工具后,我最终选择了定制性非常高(同时也比较难以上手)的Rime。刚开始是在Windows下使用小狼毫0.9.30版,这个工具在上屏速度、热键定制还有诸多功能设定方面,都令我非常满意。但是唯一美中不足的是,要使用自动造词功能,就必须开启用户词典,而开启之后,就会出现词序无法固定的问题。举个例子,新世纪五笔中的“去、支、云”三个字为重码项,而rime对于重码项的排序并不是按照常规的词频排序,开始一直以为是程序中存在bug,但后来发现是作者刻意而为,也许是在其他输入法中有用处吧,但是在五笔中真的不合适。经过一两个月断断续续的折腾之后,终于通过修改源代码解决了这个问题,所以决定写个博客记录一下。

1、最终效果
修改之后的程序,能够在开启自动造词之后,依然将单字固定在词组前面。有人说五笔不需要自动造词,这一点本人无法苟同。在前一段时间写毕业论文是,就用到了大量的自定义长词组,比如“支持向量机”。如果不开启自动造词,想要以词组的方式把“支持向量机”打出来, 就必须把这个词组加入词库文件.dict.yaml中(不需要指定词组编码,程序会自动根据单字编码反查并组合,这一点很强大),然后“重新部署”才可以,但对于每个自定义词组都这么做未免太麻烦。如果开启了自动造词,第一次按单字输入之后,以后就可以直接按词组输入,这么简单何乐不为?

2、librime源代码修改
经过长时间的琢磨,终于发现了问题在librime中。librime是Rime输入工具的内核,对于Windows、Linux、MacOS三个平台是通用的,正是它负责记录用户词组和词序调整。仔细观察用户词库文件.userdb.txt,可以发现词序是按候选项中的d值排序的,而d的值会在源代码中librime/src/rime/dict/user_db.cc和user_dictionary.cc两个模块中修改,这两个模块都调用了librime/src/rime/algo/dynamics.h中的formula_d函数,这个函数原本是这么定义的:

inline double formula_d(double d, double t, double da, double ta) {
return d + da * exp((ta - t) / );
}

结合user_dictionary.cc中的调用代码:

v.dee = algo::formula_d(commits, (double)tick_, v.dee, (double)v.tick);

可以看出来,d值会随着时间有一个指数衰减,这就解释了为什么一个候选项的d值本来很大,但长时间不输入,会导致下一次之后d值变的很小。通过修改formula_d,问题迎刃而解:

inline double formula_d(double d, double t, double da, double ta) {
return d + da;
}

修改之后,每次候选项上屏之后,d值都会+1,然后通过给重码设定不同的d值,就可以近似达到固定排序的目的,比如分别为“去、支、云”指定7500、5000、2500,那么“支”要比“去”多上屏2500次才能排在前面,因此说是近似固定排序。这个方法的另一个好处是,只为单字指定词频,而不为词组指定(默认为0),那么就可以保证重码单字排在词组之前,而词组之间会按输入频率排序。

3、Windows下weasel编译
虽然很不喜欢Windows,但是不得不承认Windows做的很傻瓜式,很容易上手。对于程序的编译也是这样,装上VS,事情就搞定一大半了。然后再安装cmake和boost函数库,就可以编译了。但同时,Windows下出了问题也比较难以解决,比如编译脚本build.bat里编译器环境变量命名的错误,就害我找了好久。

4、Ubuntu下编译安装
Ubuntu下编译虽然麻烦一些,要安装很多的工具和函数库,但是出现问题基本上Google一下就能搞定。这里有几点需要记录一下,以方便以后查阅:
1)以源码形式编译和安装,似乎只能在每台机子上现编现装,在其他机子上make好的似乎不能直接make install
2)编译时需要的大部分工具和函数库,都可以通过apt-get install的方式安装,但有两个函数库不在默认的安装源中,分别是GoogleLog(glog)和OpenCC,已上传到百度网盘中备用
3)目前Linux下的输入界面似乎还不能修改,有待研究

Rime输入工具的修改与编译安装的更多相关文章

  1. 使用autotools系列工具自动部署源代码编译安装

    在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作.autotools系列工具只需用户输入简单的目标文件.依赖文件.文件目录等就可以比较轻松地生成Makef ...

  2. 编译安装nginx并修改版本头信息—参考实例

    今天做实验的时候,想起我那台yum安装的nginx+php-fpm+mysql服务器上的nginx版本有点低了,并且还要加两个第3方模块,就去nginx官网下载了最新稳定版nginx-1.0.6,好了 ...

  3. Centos6.6下编译安装Apache2.2.31

    安装环境: [root@apache ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@apache ~]# uname -r ...

  4. CentOS 6.4编译安装和部署Zabbix 2.0版本监控(中文)

    [一].zabbix简介 zabbix是一个基于web界面的提供分布式系统监视以及网络监视功能的企业级开元解决方案 zabbix由2部分构成,zabbix_server和可选组件zabbix_agen ...

  5. Nginx使用教程(一):下载并编译安装Nginx

    安装依赖 <br\>我们已经选择下载程序源代码进行手动编译,而不是使用软件包管理器(如Yum,Aptitude或Yast)进行安装. 这个选择有两个原因. 首先,软件包可能不包含在您的Li ...

  6. Zabbix编译安装(全)

    一.前言 (一).概述 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案,Zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系 ...

  7. Linux下通过源码编译安装程序(configure/make/make install的作用,然后在/etc/profile文件里修改PATH环境变量)

    一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在 ...

  8. 编译安装Python3.4, pip安装, pypi是pip的源,修改为国内的pypi源

    Linux 下编译安装 Python 3.4 更新于 2014-09-24 02:01:05 UEANER 系统环境: CentOS 6.5 x86_64 / Fedora 20 x86_64 安装相 ...

  9. 使用autotools工具用configure、make、make install编译安装linux工程的详细步骤

    使用autotools工具用configure.make.make install编译安装linux工程的详细步骤 转载tmxkwzy 最后发布于2016-11-24 10:20:15 阅读数 324 ...

随机推荐

  1. [Web Tools] 实用的Web开发工具

    模拟http请求:Postman https://www.getpostman.com 生成Json数据 http://www.json-generator.com/

  2. js-input file 文件上传(照片,视频,音频)

    在此做一个笔记 <input type="file" accept="image/*" capture="camera"> &l ...

  3. es6 ---- babel

    babel-polyfill是ES6的补丁,由于babel只支持ES6语法部分的编译,对于新增的类我们还需要安装额外的polyfill,虽然现在Chrome和Firefox都已经添加了Promise等 ...

  4. L2-3. 悄悄关注【STL+结构体排序】

    L2-3. 悄悄关注 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在 ...

  5. CCCC L2-024 部落【并查集】

    https://www.patest.cn/contests/gplt/L2-024 首先在一行中输出这个社区的总人数.以及互不相交的部落的个数.随后对每一次查询,如果他们属于同一个部落,则在一行中输 ...

  6. CodeForces - 393E Yet Another Number Sequence

    Discription Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

  7. 品质与合身 无须昂贵 | Tailorwoods在线男装定制

    品质与合身 无须昂贵 | Tailorwoods在线男装定制 北京市朝阳区姚家园北一路八月照相馆2F

  8. html中的列表标签

    1.<dl>定义列表,<dt>定义列表中的项目,<dd>对项目的描述 例: 效果: 2.<ul>无序列表,<li>列表项 例: 效果: 3. ...

  9. DELPHI是怎么实现跨平台的?

    DELPHI是怎么实现跨平台的? 首先跨平台必须要兼容原来的语法,以线程的临界区对象为例: TCriticalSection = class(TSynchroObject){$IFDEF POSIX} ...

  10. 词典对象(NSDictionary和NSMutableDictionary)

    词典(dictionary)顾名思义就是同由键-值组成的数据集合.与在词典中查找单词定义一样,可以通过对象的键从词典中获取需要的对象,看到 这里,你是不是想起了java中的map?和NSArray一样 ...