能否直接判断当前候选是否进行了补全?


我制作了一份简拼词库,使用的过程中发现低权重的简拼词库常常会被高权重的主词库的补全顶下去,于是我就尝试削减补全候选的数量,但是我没有找到判断script translator候选是否为补全的接口。 在table_translator中,来自补全的候选都会通过cand.comment标识,但是script_translator并不支持这种操作,所以我尝试了其他的办法,目前发现了一个可行方式: 双拼方案中补全候选的input的长度总是cand.text长度的2倍再+1,所以可以通过捕捉这种关联来判断是否为补全。
效果图:



-------------------------------------------------------------
--[[======运行逻辑========
1定义计数器b,累积补全数量(即 输入码为"wo d"时出现的"我的、我对"的候选的数量)
2检查是否"输入码为奇数的同时候选处于补全状态"
1是则计数一次补全候选的数量(b+1),并将编码提示改为『补全』
2然后判断补全候选的数量是否超过3,超过3则不再允许补全通过滤镜
结束
=判断当前是不是处于补全状态 (候选的长度)==(输入码长度)/2+0.5时,被认为处于补全状态,仅适用于双拼
=判断输入码是不是奇数 (输入码长度)/2的余数为1时,被认为是奇数
==================--]]
function abbreving_filter(input,env)
local b=0
for cand in input:iter() do
if(utf8.len(cand.text)==string.len(env.engine.context.input)/2+0.5 and string.len(env.engine.context.input)%2==1)then
if(b<3)then b=b+1 yield(ShadowCandidate(cand,cand.type,cand.text,"『补全』"))end
else yield(cand)
end end end
-------------------------------------------------------------
这个方案美中不足的是,他只能判断定长方案的候选是否为补全,对不定长方案无能为力,所以我想知道有没有办法能判断任何translator的候选是否处于补全状态。
用反查的方法查当前候选的编码和当前输入的编码是否一致,如果不相等且以当前input为开头,则为补全
@mokapsing 在哪里反查?对于任意候选都可以吗?
local dict = env.engine.schema.config:get_string("translator/dictionary") or env.engine.schema.schema_id
env.reversedb = ReverseDb("build/" .. dict .. ".reverse.bin")
--...
for cand in tran:iter() do
local code = env.reversedb:lookup(cand.text)
end
但这样有个问题,一字多码会查出多个
或者(拼音)开启spelling_hint,判断comment和输入码是不是相等
一般从 table_translator (enable_completion: true 时) 产生的 candidate 可以从 cand.type =="completion" 来判断
一般从 table_translator (enable_completion: true 时) 产生的 candidate 可以从 cand.type =="completion" 来判断
script_translator下此方法无效。
local dict = env.engine.schema.config:get_string("translator/dictionary") or env.engine.schema.schema_id env.reversedb = ReverseDb("build/" .. dict .. ".reverse.bin") --... for cand in tran:iter() do local code = env.reversedb:lookup(cand.text) end但这样有个问题,一字多码会查出多个
或者(拼音)开启spelling_hint,判断comment和输入码是不是相等
这两种方式都会返回真实编码,而非拼写运算后的编码