librime
librime copied to clipboard
在源码中如何访问词库?
看了librime的源码,发现字典都被编译成bin文件来访问,所以想请问: 1.如果自己想增加联想功能,从而要访问词库,有没有入口? 2.词库中的词频是如何更新的?这里也应该涉及到词库的访问,如果想要改变词频的更新步长,可以在哪里改?
另外想改变九宫格中识别的按键字符顺序,比如按6,出来的希望是n,而不是m,这个顺序怎么调整呢?或者希望能够输出这些字符(包括m,n,o),请问怎么解决?
+1 想了解下librime中是否有词频记录的逻辑。
+1 想了解下librime中是否有词频记录的逻辑。
有应该是有的,你打字打过几次那个词就会提上来了。但不知道要打多少次才提一步,在代码里还是没找到。
librime/src/dict/ 主要有固态词典和用户词典。
前者是只读的,包含YAML源文件里的数据。在部署阶段生成。
固态词典需要 build/*.table.bin
和 build/*.prism.bin
配合使用,其数据结构设计为按输入码查询,不支持中文联想。build/*.reverse.bin
用于中文反查编码,也许可以用作联想查询。你也可以自己设计一个专用的词典。
用户词典*.userdb/
记录用户输入产生的新词及对词频的更新。
“打多少次才提一步”这个说法不成立。重码字词的候选顺序是按各个字词的权重从大到小排列。
那么“各个字词的权重”是怎么计算的呢?
算法比较复杂。简单地说就是历史上历次用户输入对词频更新的叠加值。对于没输入过的字词,权重比较的是词典里的词频。总之,每个字词独立统计,不做字词之间的比较,也不会考察在候选列表中的顺序,因此没有“步长”这个概念。事实上“记录和调整选定字词在重码字词中的位置”这种机制是不实际的,因为同一个字可以由不同的查询方法(例如拼音取决于输入全拼或简拼以及模糊音设置等)出现在不固定的候选列表里。
算法比较复杂。简单地说就是历史上历次用户输入对词频更新的叠加值。对于没输入过的字词,权重比较的是词典里的词频。总之,每个字词独立统计,不做字词之间的比较,也不会考察在候选列表中的顺序,因此没有“步长”这个概念。事实上“记录和调整选定字词在重码字词中的位置”这种机制是不实际的,因为同一个字可以由不同的查询方法(例如拼音取决于输入全拼或简拼以及模糊音设置等)出现在不固定的候选列表里。
想要了解这个更新的机制,需要怎么做?有可以参考的地方嘛?
@lotem 那麼把keyevent轉換到dict內尋找的部份是在那裡完成的? (我正在找怎樣可以改成需要按下space才開始組字)
我看到context.cc 有PushInput() 並做 input_.insert() 但是這input_像是hook/global object。我現在是在看speller, 是不是找字部份不應該從speller出發?
@windhamwong 请参考 https://github.com/rime/home/wiki/RimeWithSchemata#%E8%BC%B8%E5%85%A5%E6%B3%95%E5%BC%95%E6%93%8E%E8%88%87%E5%8A%9F%E8%83%BD%E7%B5%84%E4%BB%B6
@lotem 因我在改能否使用space才能打開列表 (就是像傳統的, 在另1個issue內有談及, 但是最後沒實現的功能),我在找到底判定所輸入的是否符合並列出選擇這部份的logic 到底是放在那@@
這link 好像只能說明應該在engine/processors 內處理,但我找不到那一個是關鍵function...
沒有現成的邏輯能支持你想要的行爲呀。 這不止是一個空格鍵的事了。首先需要區分輸入模式和選字模式。Rime現在無模式的工作流程是每當輸入串改變都做轉換,並更新候選列表。你要改爲有一個開關按鍵手動控制轉換和顯示候選。 我給你的文檔,介紹了現有流程如何工作,也許能幫助你分析代碼。
嗯, 看來是方向沒錯了 謝謝解說