天天看點

Rime輸入工具的修改與編譯安裝

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

轉載于:https://www.cnblogs.com/vive/p/6848173.html

下一篇: 水窪數目

繼續閱讀