增加自造词的废词自动清理能力
Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
Rime的自动造词是通过枚举方式进行的,再加上因为同音字等而造成的一字多码,就可能出生大量用户用不着的废词。例如,在声笔飞码中,输入「声」「笔」「系」「列」「码」后,可能生成的词组为「声笔」「笔系」「系列」「列码」「声笔系」「笔系列」「系列码」「声笔系列」「笔系列码」「声笔系列码」。如果有同音字的话,每个词都可能产生多个编码。这些新造的词中,大部分都不是用户需要的,从而成为废词。这还是在最大造词长度设置为5的时候,如果设置为6或者更大,那么废词还会爆炸式地增长。废词太多的话,让有的用户看着不舒服,还占用了大量的空间,更重要的是会降低输入法的读写和检索速度,影响到用户的输入效率。
Describe the solution you'd like
A clear and concise description of what you want to happen.
有没有办法对废词进行清理呢?办法肯定是有的,只是不同的方法,付出的成本或代价不一样。最笨的办法是通过Rime的词典管理工具,将用户词典导出,然后手动删除那些不需要的临时词组(即废词)。这种方式工作量巨大,恐怕没有人愿意这么干。而且,在手机上没法进行这项工作。另一种思路就是,开发一个工具来批量地删除废词。但是,以什么标准来确定一个临时词组是废词呢?首先想到的可能是时间。然而,人们使用输入法的频繁程度是不一样的。有的人一个月只有千字的输入量,而有的人一个月可能有上百万字的输入量,显然以时间作为标准是不适合的。
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
输入量是可以作为一个依据来删除废词的。怎么样才能知道用户的输入量呢?幸好,Rime记录了一个tick值,它会在用户每一次上屏输入内容都自动加1,用户词典还有个tick累计值。累计的tick值与词条的tick之差就反映了词条使用的频繁程度,该差值越小就说明词条使用越频繁,而差值越大就说明词条用得越少。因此,可以将tick差值作为一个阈值来控制废词清理的强度,通过运行一个工具软件来删除那些大于此阈值的临时词组。这样就比导出用户词典来用编辑器逐个删除不需要的词条方便多了。美中不足之处是,工具的运行还是得手动进行。能不能再进一步,在用户没有感觉的情况下实现全自动的废词清理呢?能!然而,Rime现在是没有办法直接实现这一点的,需要修改其后端引擎librime的源代码才能实现。
Additional context
Add any other context or screenshots about the feature request here.
不用這麼麻煩,關閉自動造詞即可。
自動產生的備選詞需要用家再選過一次才正式記錄爲用戶詞。 要備選詞積累詞頻,就意味着不能很快清除掉。 可以優化的是將自動造詞結果作爲候選詞展示出來的條件。
关闭自动造词,就不能享有方便的造词功能,这不是希望的结果。词频的累计对希望成为正式词组的临时词有效,但是绝大多数的临时词是永远都不需要的。rime对这些词又没清除机制,长期积累的话,对性能影响是很大的。仅仅优化展示条件只是治标不治本的手段。
想要造詞,又不讓詞典記錄,那只能手動造詞啊。
既要造词,又要记录,还要不让垃圾积累:)
https://github.com/rime/librime/issues/975#issue-2837291671
我也提出了新得建议, 我写了一个简单的删除c<=0的词条,我认为在一定阶段自己做一些目标性的动作是合理的,但是在产品端我认为不适合 我感受到用户词管理、调频还是固定、辅助码 实现方式三者是rime用户重点围绕讨论的问题!!!
这里的问题是有时候会误造一些词,造成干扰。一个一个去删除又麻烦,所以想通过自动淘汰的方式进行清理。
可以優化的是將自動造詞結果作爲候選詞展示出來的條件。
做到這個就可以了,只顯示 tick 接近當前時刻的臨時詞。
我现在是在 filter 中使用 quality 参数对候选词进行排序,这样至少不用的词可以排后面去了。然后确实造错的词使用 Shift + Del 来删除,差不多满足我的需求了。
以下是我的做法(OS是Ubuntu 20.04)
- xxx.schema.yaml里的translator下设置为db_class: tabledb(就是不知道会不会比userdb慢)
- ~/.config/ibus/rime/ 下新建一个文件, chmod +x clean-userdb.py
#!/usr/bin/env python3
"""
清理自动的用户词典文件USER_DB_FILE
策略:删除输入次数小于MAX_COUNT的词条
"""
RIME_DIR = "/home/mhf/.config/ibus/rime/"
USER_DB_FILE = "rime_mhf.txt" # 用户词典文件
MAX_COUNT = 2 # 保留词条的最少输入次数
def clean():
list = []
tick = 0
file_path = RIME_DIR + USER_DB_FILE
with open(file_path, "rt") as f:
tick_offset = 10 # 所有词条的count之和再加上tick_offset就是 #@/tick 的数量
tick_index = 0
line_index = -1
tick_prefix = "#@/tick "
for line in f:
line_index+=1
if line[0] == "#":
list.append(line)
if line.startswith(tick_prefix):
tick_index = line_index
continue
count = int(line[line.rfind("\t") + 1 : len(line) - 1])
if count >= MAX_COUNT:
tick += count
list.append(line)
list[tick_index] = tick_prefix + str(tick + tick_offset) + "\n"
with open(file_path, "w") as f:
for line in list:
f.write(line)
def main():
clean()
if __name__ == "__main__":
main()
- 设置开机执行,在~/.config/autostart/下新建一个文件rime-clean-userdb.desktop
[Desktop Entry]
Type=Application
Name=CleanRimeUserDB
Comment=clean rime userdb
Exec=/home/mhf/.config/ibus/rime/clean-userdb.py
X-GNOME-Autostart-enabled=true
这个清理办法在我这里行不通。因为每个词条后面的t值与userdb文件顶部的tick都是一个相同的数值。我用的是小狼毫,不知道这是不是一个bug
做到這個就可以了,只顯示 tick 接近當前時刻的臨時詞。
有道理啊……
但是做不到啊,t 值只表示記錄的 d 值是在 t 時刻的記憶強度,不代表上屏的時刻。
應該判斷留存的記憶減小到一定程度就不顯示。
这个清理办法在我这里行不通。因为每个词条后面的t值与userdb文件顶部的tick都是一个相同的数值。我用的是小狼毫,不知道这是不是一个bug
t 的數值是這條記錄更新的時刻,不必是記錄產生或是該詞條最後一次上屏的時刻。
只要同步用戶詞典,所有記錄都會更新一遍。