作為一個比較“事兒多”的五筆用戶,在使用過幾乎所有的主流輸入工具后,我最終選擇了定制性非常高(同時也比較難以上手)的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) / 200); }
結合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下的輸入界面似乎還不能修改,有待研究
