上次发了个贴子《解决自动造词时词序固定问题,并实现词库与配置自动网盘同步》,分享自己的一种解决方案,结果被人喷坐井观天。。即便即此,我还是决定把这个改进版的解决方案分享出来,万一有人需要呢?
走自己的路,让别人说去吧。
——但丁
世界上有几十亿人,有些人的井可能比某些人的天还大。
——冷冷漠然
好了进入正题。在这个贴子里,楼主给所有单字设定不同的词频,以达到固定排序的目的;对于词组不加设置,这样就能根据输入习惯来排序。至于同步,首先使用db_class: plain_userdb,这样用户输入习惯会以文本的形式保存在“用户文件夹”下的*.userdb.txt中,同步的时候把这个文件同步即可。
一、目的与意义
首先声明楼主的需求,没有这些需求的朋友就别浪费时间看本贴了。
楼主用的小狼毫+五笔输入法,目前的版本有个问题(反正对我来说是个问题):开启自动造词之后,候选词序会根据你的输入历史来自动调整,而不受词典文件中所指定词频的影响,也就是说重码的单字词也会被调整顺序,这是楼主不想看到的;但是对于自造词,楼主又希望能按输入次数排序。
也许有人会问了:用五笔为什么还要开启自动造词?嗯,我不知道别人的输入习惯怎样,反正前一段时间我写毕业论文的时候像“支持向量机”这种长词打了多少遍已经数不清了。。如果不开启自动造词怎么办?有办法,自己把这个词加到词典文件.dict.yaml里然后“重新部署”就可以了,但是每次都这么把自定义词组加进去太累了。也许五笔高手总喜欢拆开打:“支持+向量+机”,反正我不是高手,而且我的词库里原本连“向量”这个词组都没有 :)
综上所述,说不好自动造词对别的五笔用户有多大意义,反正对楼主来说意义重大,但是目前版本的小狼毫存在缺陷。
二、怎么解决?
上次的贴子中提到,经过观察,开启用户词典之后的词序不是按词频调整的,而是按wubi.userdb.txt中的d排序的,如下图所示:

按理来说,按上图这样设置,基本上就解决了“单字词序固定”这个问题了。刚开始这样用起来的确没问题,但是用过一段时间后发现会莫名其妙地出现乱序。经过长时间的观察思考,以及不得已去查看源代码,楼主终于搞清了原因。上图中的d是排序依据,t是输入时间,d和t存在如下的关系(这个公式对应源码“librime\include\rime\algo\dynamics.h”中的formula_d函数):

举个例子:现在使用小狼毫共上屏了2000次,在第1000次输入了“去”然后中间一直没再打过这个字,第2000次又打了一次,那么t_old=1000,t_new=2000。d_old假设是10000,那么按公式d_new就成了67.3862。。。本来设定好好的,让“去”(d=10000)排在“支”(d=7500)前面,但就因为长时间没打“去”这个字,就使得d_new变成60几,直接排在“支”和“云”之后了。我不知道这对其他输入法有什么意义,反正对五笔来说是很不合理的。就算要排序,按输入频率排不就很好吗?
于是乎,楼主就把这段代码改了,直接让每次上屏之后d+1:
d_new = d_old+1
编译、打包、安装、测试,终于实现了真正的按词频排序!为了长时间使用省心,楼主还把“librime\src\dict\user_db.cc”中为d设置的上限10000给取消了,万一以后词频会超过1W呢。
现在用着很好,解决了这个问题,小狼毫对我来说就是完美的输入工具了~ 而且新编译的rime.dll是1.2.9版本的,有朋友需要的话我会放网盘分享。BTW,我这里也有新世纪五笔单字固定词序的用户词典文件。
下面说下使用db_class: plain_userdb比默认的userdb有什么好处。老版本的小狼毫使用rime.dll 1.1.2版,默认的userdb会在“用户文件夹”下生成一个*.userdb.kct文件,这个文件在用户输入时会加锁,使得同步软件无法读取这个文件,自然也就无法上传到网盘中。如果使用plain_userdb,在rime进程结束后用户输入习惯会自动写入*.userdb.txt,这个文本大部分时间是不会被加锁的,因此不影响同步软件读取。
走自己的路,让别人说去吧。
——但丁
世界上有几十亿人,有些人的井可能比某些人的天还大。
——冷冷漠然
好了进入正题。在这个贴子里,楼主给所有单字设定不同的词频,以达到固定排序的目的;对于词组不加设置,这样就能根据输入习惯来排序。至于同步,首先使用db_class: plain_userdb,这样用户输入习惯会以文本的形式保存在“用户文件夹”下的*.userdb.txt中,同步的时候把这个文件同步即可。
一、目的与意义
首先声明楼主的需求,没有这些需求的朋友就别浪费时间看本贴了。
楼主用的小狼毫+五笔输入法,目前的版本有个问题(反正对我来说是个问题):开启自动造词之后,候选词序会根据你的输入历史来自动调整,而不受词典文件中所指定词频的影响,也就是说重码的单字词也会被调整顺序,这是楼主不想看到的;但是对于自造词,楼主又希望能按输入次数排序。
也许有人会问了:用五笔为什么还要开启自动造词?嗯,我不知道别人的输入习惯怎样,反正前一段时间我写毕业论文的时候像“支持向量机”这种长词打了多少遍已经数不清了。。如果不开启自动造词怎么办?有办法,自己把这个词加到词典文件.dict.yaml里然后“重新部署”就可以了,但是每次都这么把自定义词组加进去太累了。也许五笔高手总喜欢拆开打:“支持+向量+机”,反正我不是高手,而且我的词库里原本连“向量”这个词组都没有 :)
综上所述,说不好自动造词对别的五笔用户有多大意义,反正对楼主来说意义重大,但是目前版本的小狼毫存在缺陷。
二、怎么解决?
上次的贴子中提到,经过观察,开启用户词典之后的词序不是按词频调整的,而是按wubi.userdb.txt中的d排序的,如下图所示:

按理来说,按上图这样设置,基本上就解决了“单字词序固定”这个问题了。刚开始这样用起来的确没问题,但是用过一段时间后发现会莫名其妙地出现乱序。经过长时间的观察思考,以及不得已去查看源代码,楼主终于搞清了原因。上图中的d是排序依据,t是输入时间,d和t存在如下的关系(这个公式对应源码“librime\include\rime\algo\dynamics.h”中的formula_d函数):

举个例子:现在使用小狼毫共上屏了2000次,在第1000次输入了“去”然后中间一直没再打过这个字,第2000次又打了一次,那么t_old=1000,t_new=2000。d_old假设是10000,那么按公式d_new就成了67.3862。。。本来设定好好的,让“去”(d=10000)排在“支”(d=7500)前面,但就因为长时间没打“去”这个字,就使得d_new变成60几,直接排在“支”和“云”之后了。我不知道这对其他输入法有什么意义,反正对五笔来说是很不合理的。就算要排序,按输入频率排不就很好吗?
于是乎,楼主就把这段代码改了,直接让每次上屏之后d+1:
d_new = d_old+1
编译、打包、安装、测试,终于实现了真正的按词频排序!为了长时间使用省心,楼主还把“librime\src\dict\user_db.cc”中为d设置的上限10000给取消了,万一以后词频会超过1W呢。
现在用着很好,解决了这个问题,小狼毫对我来说就是完美的输入工具了~ 而且新编译的rime.dll是1.2.9版本的,有朋友需要的话我会放网盘分享。BTW,我这里也有新世纪五笔单字固定词序的用户词典文件。
下面说下使用db_class: plain_userdb比默认的userdb有什么好处。老版本的小狼毫使用rime.dll 1.1.2版,默认的userdb会在“用户文件夹”下生成一个*.userdb.kct文件,这个文件在用户输入时会加锁,使得同步软件无法读取这个文件,自然也就无法上传到网盘中。如果使用plain_userdb,在rime进程结束后用户输入习惯会自动写入*.userdb.txt,这个文本大部分时间是不会被加锁的,因此不影响同步软件读取。