作为一个比较“事儿多”的五笔用户,在使用过几乎所有的主流输入工具后,我最终选择了定制性非常高(同时也比较难以上手)的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. 你也可以当面霸-MVC的原理及特点

    MVC是面试中经常被问到问题,如果能把MVC的原理简单清楚的描述出来,肯定会在面试官的心目中加分. 如果在能画图的情况下,画出一张MVC的流程图,无疑能简化不少概念上的术语,如果不能也不要紧,只要把核 ...

  2. POJ 3660 Cow Contest 传递闭包+Floyd

    原题链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  3. 第三章 poj 1064——关于带精度的二分法

    /* 题意:给定n个实数l[i],给定一个k 问:求最大的ans,使得sum l[i]/ans i=1 to n >=k,且ans最大*/ #include <iostream> # ...

  4. Jena+fuseki

    1.下载apache-jena-3.1.0.tar.gz,这个可以将ttl三元组文件或者xml文件加载 进入bin目录,执行./tdbloader2 --loc /path/for/database ...

  5. Maven自动部署war到Tomcat8

    原文:http://www.cnblogs.com/yucongblog/p/5392932.html 我使用的环境是:Eclipse Java EE IDE for Web Developers(V ...

  6. [反汇编练习] 160个CrackMe之029

    [反汇编练习] 160个CrackMe之029. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. 启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决-及eclipse版本查看

    启动eclipse时出现“Failed to load the JNI shared library jvm.dll”错误及解决-及eclipse版本查看 学习了:https://www.cnblog ...

  8. css3 position fixed居中的问题

    通常,我们要让某元素居中,会这样做: #element{ margin:0 auto; } 假设还想让此元素位置固定呢?一般我们会加入position:fixed,例如以下: #element{ po ...

  9. android客户端向服务器端验证登陆方法的实现1

    遇到的问题:一个条件查询与多个条件查询,所用到的方式不一样 参考文档: http://www.oschina.net/question/1160609_133366    mybatis多条件查询的一 ...

  10. ajax短信验证码-mvc

    <script type="text/javascript"> function SendMessage() { var phoneNumberInput = docu ...