librime icon indicating copy to clipboard operation
librime copied to clipboard

在源码中如何访问词库?

Open blues-green opened this issue 5 years ago • 12 comments

看了librime的源码,发现字典都被编译成bin文件来访问,所以想请问:  1.如果自己想增加联想功能,从而要访问词库,有没有入口?  2.词库中的词频是如何更新的?这里也应该涉及到词库的访问,如果想要改变词频的更新步长,可以在哪里改?

blues-green avatar Oct 15 '19 12:10 blues-green

另外想改变九宫格中识别的按键字符顺序,比如按6,出来的希望是n,而不是m,这个顺序怎么调整呢?或者希望能够输出这些字符(包括m,n,o),请问怎么解决?

blues-green avatar Nov 01 '19 02:11 blues-green

+1 想了解下librime中是否有词频记录的逻辑。

merrickluo avatar Nov 12 '19 05:11 merrickluo

+1 想了解下librime中是否有词频记录的逻辑。

有应该是有的,你打字打过几次那个词就会提上来了。但不知道要打多少次才提一步,在代码里还是没找到。

blues-green avatar Nov 12 '19 05:11 blues-green

librime/src/dict/ 主要有固态词典和用户词典。 前者是只读的,包含YAML源文件里的数据。在部署阶段生成。 固态词典需要 build/*.table.binbuild/*.prism.bin 配合使用,其数据结构设计为按输入码查询,不支持中文联想。build/*.reverse.bin 用于中文反查编码,也许可以用作联想查询。你也可以自己设计一个专用的词典。 用户词典*.userdb/记录用户输入产生的新词及对词频的更新。 “打多少次才提一步”这个说法不成立。重码字词的候选顺序是按各个字词的权重从大到小排列。

lotem avatar Nov 13 '19 02:11 lotem

那么“各个字词的权重”是怎么计算的呢?

caoh8 avatar Nov 13 '19 03:11 caoh8

算法比较复杂。简单地说就是历史上历次用户输入对词频更新的叠加值。对于没输入过的字词,权重比较的是词典里的词频。总之,每个字词独立统计,不做字词之间的比较,也不会考察在候选列表中的顺序,因此没有“步长”这个概念。事实上“记录和调整选定字词在重码字词中的位置”这种机制是不实际的,因为同一个字可以由不同的查询方法(例如拼音取决于输入全拼或简拼以及模糊音设置等)出现在不固定的候选列表里。

lotem avatar Nov 13 '19 07:11 lotem

算法比较复杂。简单地说就是历史上历次用户输入对词频更新的叠加值。对于没输入过的字词,权重比较的是词典里的词频。总之,每个字词独立统计,不做字词之间的比较,也不会考察在候选列表中的顺序,因此没有“步长”这个概念。事实上“记录和调整选定字词在重码字词中的位置”这种机制是不实际的,因为同一个字可以由不同的查询方法(例如拼音取决于输入全拼或简拼以及模糊音设置等)出现在不固定的候选列表里。

想要了解这个更新的机制,需要怎么做?有可以参考的地方嘛?

caoh8 avatar Dec 09 '19 03:12 caoh8

@lotem 那麼把keyevent轉換到dict內尋找的部份是在那裡完成的? (我正在找怎樣可以改成需要按下space才開始組字)

我看到context.cc 有PushInput() 並做 input_.insert() 但是這input_像是hook/global object。我現在是在看speller, 是不是找字部份不應該從speller出發?

windhamwong avatar Feb 25 '20 03:02 windhamwong

@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 avatar Feb 29 '20 09:02 lotem

@lotem 因我在改能否使用space才能打開列表 (就是像傳統的, 在另1個issue內有談及, 但是最後沒實現的功能),我在找到底判定所輸入的是否符合並列出選擇這部份的logic 到底是放在那@@

這link 好像只能說明應該在engine/processors 內處理,但我找不到那一個是關鍵function...

windhamwong avatar Mar 01 '20 15:03 windhamwong

沒有現成的邏輯能支持你想要的行爲呀。 這不止是一個空格鍵的事了。首先需要區分輸入模式和選字模式。Rime現在無模式的工作流程是每當輸入串改變都做轉換,並更新候選列表。你要改爲有一個開關按鍵手動控制轉換和顯示候選。 我給你的文檔,介紹了現有流程如何工作,也許能幫助你分析代碼。

lotem avatar Mar 08 '20 15:03 lotem

嗯, 看來是方向沒錯了 謝謝解說

windhamwong avatar Mar 11 '20 02:03 windhamwong