rime / librime

Rime Input Method Engine, the core library
https://rime.im
BSD 3-Clause "New" or "Revised" License
3.49k stars 562 forks source link

<未输入完整的词条> 候选词排序是乱序的,未按照权重排序 #820

Open ccyybn opened 9 months ago

ccyybn commented 9 months ago

Describe the bug 在方案中配置 enable_completion: true,码表均为4码固定长度(小鹤音形码),按权重排序,输入de,候选词列表没有按权重展示

To Reproduce 将我上传的方案部署后即可复现

Rime.zip

为方便观察问题,该码表精简为只有 de 开头的词条,高权重的在上面 该问题在 Weasel for Windows 和 Fctix5 for Android Rime 插件上均存在

Expected behavior 无论是否输入完整,都按权重排序,<未输入完整的>可以比 <输入完整> 的整体靠后,但是他们内部都按权重排序

Log

Screenshots Snipaste_2024-02-16_15-53-02

Flavor(please complete the following information): Select your flavor:

Package:

Additional context

ksqsf commented 9 months ago

用 algebra 生成缩写形式即可

speller:
  algebra:
    - derive/([a-z])[a-z][a-z][a-z]/$1/
    - derive/([a-z][a-z])[a-z][a-z]/$1/
    - derive/([a-z][a-z][a-z])[a-z]/$1/
ccyybn commented 9 months ago

algebra:

  • derive/([a-z])[a-z][a-z][a-z]/$1/
  • derive/([a-z][a-z])[a-z][a-z]/$1/
  • derive/([a-z][a-z][a-z])[a-z]/$1/

加上过后,似乎未完成的编码提示消失了,而且不知道为什么,输入 de 这个 "德昂" 会排在 “的”前面

image

lotem commented 9 months ago

沒有專門製作前綴匹配的索引, 所有前綴匹配的字詞, 可能會是巨量的, 因此爲了效率故, 沒有一下檢索出來, 也就無法排序.

ccyybn commented 9 months ago

沒有專門製作前綴匹配的索引, 所有前綴匹配的字詞, 可能會是巨量的, 因此爲了效率故, 沒有一下檢索出來, 也就無法排序.

目前我的替代方案是把字典文件中,每个词条,按照按键顺序,重复生成几遍,就能达到相同的预期效果,不过文件大小比原始版本大了很多倍

image

如果是前缀匹配,比如键入a,可能词条有上万条,但一般人并不会翻页到第1000页找词,所以实际可能只需要显示前几页,应该没有那么巨量数据需要索引

另外好像 auto_select auto_select_unique_candidate未键入完整的词条并不起作用,比如下面这个,一定要输入 k 才会自动选择,目前只能在生成字典文件(*.dict.yaml)时,判断候选个数为1,把 k 去掉,才能达到预期效果

image

ksqsf commented 9 months ago

这个做法跟 derive 其实是一样的,不需要手动操作。

但一般人并不会翻页到第1000页找词,所以实际可能只需要显示前几页,应该没有那么巨量数据需要索引

难点就是第一页也很难显示出来。这跟 rime 补全原理有关。给定一个编码前缀,rime 并不知道后续补全什么编码会得到权重最高的候选(甚至不知道有没有候选),只能从 a 到 z 一一尝试。这种方法下无法排除 dezzzzzz 编码候选权重比其他 de 开头编码的候选更高的可能性,要以100%精确度显示出第一页并非易事。

lotem commented 9 months ago

得專門加索引. 這項功能安排到 R2 裏開發.