iDvel / rime-ice

Rime 配置:雾凇拼音 | 长期维护的简体词库
https://dvel.me/posts/rime-ice/
GNU General Public License v3.0
9.25k stars 617 forks source link

如何降低emoji的权重 #770

Closed Chengxcy closed 4 months ago

Chengxcy commented 6 months ago

emoji临时关闭以及长期关闭我都看到了方法。emoji很好用,我日常会用到,不想关闭,目前emoji在候选中是第二位,目前需求只是想降低emoji的权重,让它在后面显示,这样怎么改?

mirtlecn commented 6 months ago

某个编码下,降低权重可以用 pin lua;

整体降低权重可能要另外写一个 lua 去排序。

emoji在候选中是第二位

在没有其他 lua 的影响下,emoji 是在对应中文的后面而不是候选第二位。

Chengxcy commented 6 months ago

对的,是在对应中文后面。那这个现在最好的解决方法就是关闭,没办法其他修改的办法了吗?

mirtlecn commented 6 months ago

你想改成什么样子的?

Chengxcy commented 6 months ago

你想改成什么样子的?

现在的情况是输入某个关键字词,有emoji的话,一般后面候选就对应表情。 我期望的是输入某个关键字词,emoji可以排在候选最后面,在候选栏能看到即可。

mirtlecn commented 6 months ago

好奇怪的需求,如果排在后面几页,要翻页好几次才能看到,不如用快捷键直接关掉,用的时候再开。

能想到的场景就是鼠须管和移动平台的弹性盒视图下,好找一点。

硬要实现:

boomker commented 6 months ago

@Chengxcy 你要的效果是不是这样的,

image

参考: reduce_emoji.lua 

Chengxcy commented 6 months ago

@Chengxcy 你要的效果是不是这样的,

image

参考: reduce_emoji.lua 

对的,这样看着很不错

gaboolic commented 6 months ago

参考long_word_filter.lua 这个是遇到长词 提到前面 你可以改成遇到是emoji的时候 给它挪到后面

Chengxcy commented 6 months ago

@Chengxcy 你要的效果不是这样的,

图像

参考: reduce_emoji.lua

对的,这样看着很不错

@Chengxcy 你要的效果不是这样的,

图像

参考: reduce_emoji.lua

对的,这样看着很不错

在您的指导下基本上实现了我的需求,感谢。 image image

boomker commented 6 months ago

@Chengxcy 不客气,我也是有类似需求,看到你的想法,就尝试实现一下。抛砖引玉而已,主要还是你提出了一个很棒的想法。

uliuyt commented 6 months ago

@Chengxcy 你要的效果是不是这样的, image

参考: reduce_emoji.lua

大佬,请问这个脚本是属于filter脚本吗? 我在文件rime.lua添加一行 reduce_emoji = require("reduce_emoji") 然后在方案文件rime_ice.schema.yaml里面的engine/filters下面添加一行- lua_filter@reduce_emoji 最后把reduce_emoji.lua文件放到lua文件下下面 重新部署小狼毫以后,直接不显示候选字了😭

Chengxcy commented 6 months ago

@Chengxcy 你要的效果是不是这样的, image

参考: reduce_emoji.lua

大佬,请问这个脚本是属于filter脚本吗? 我在文件rime.lua添加一行 reduce_emoji = require("reduce_emoji") 然后在方案文件rime_ice.schema.yaml里面的engine/filters下面添加一行- lua_filter@reduce_emoji 最后把reduce_emoji.lua文件放到lua文件下下面 重新部署小狼毫以后,直接不显示候选字了😭

是这位boomker大佬写的,无私奉献,感谢,我只是使用者。将大佬仓库里的该reduce_emoji.lua文件放到自己的lua文件夹里,在rime.lua里添加这两行代码,local emoji_reduce = require("reduce_emoji") emoji_reduce_filter = emoji_reduce.filter 在自己使用的方案里的engine/filters下添加-lua_filter@emoji_reduce_filter。重新部署就能实现大佬截图的效果了。

uliuyt commented 6 months ago

@Chengxcy 你要的效果是不是这样的, image 参考: reduce_emoji.lua

大佬,请问这个脚本是属于filter脚本吗? 我在文件rime.lua添加一行 reduce_emoji = require("reduce_emoji") 然后在方案文件rime_ice.schema.yaml里面的engine/filters下面添加一行- lua_filter@reduce_emoji 最后把reduce_emoji.lua文件放到lua文件下下面 重新部署小狼毫以后,直接不显示候选字了😭

是这位boomker大佬写的,无私奉献,感谢,我只是使用者。将大佬仓库里的该reduce_emoji.lua文件放到自己的lua文件夹里,在rime.lua里添加这两行代码,local emoji_reduce = require("reduce_emoji") emoji_reduce_filter = emoji_reduce.filter 在自己使用的方案里的engine/filters下添加-lua_filter@emoji_reduce_filter。重新部署就能实现大佬截图的效果了。

感谢,rime.lua里面添加的代码第一行删除了local,方案文件engine/filters下-lua中间加个空格,实现截图的功能了。

iDvel commented 6 months ago

最好把这个 Lua 放到 - simplifier@emoji 的下面,- simplifier@traditionalize 的上面。

Chengxcy commented 6 months ago

最好把这个 Lua 放到 - simplifier@emoji 的下面,- simplifier@traditionalize 的上面。

还有这个细节要注意,感谢提醒!有个疑问,不这样的话,会出现其他什么问题吗❓

wxyzh commented 6 months ago

稍微修改了下

#local reduce_emoji = {}
--- https://github.com/boomker/rime-fast-xhup/blob/master/lua/reduce_emoji.lua
--- 在filter中的"simplifier@emoji"和- "simplifier@traditionalize"之间添加- "lua_filter@*reduce_emoji"
---@diagnostic disable-next-line: unused-local

local function reduce_emoji(input, env)
    local engine = env.engine
    local config = engine.schema.config
    local emoji_cands = {}
    local other_cands = {}
    local prev_text = ""
    local emoji_pos = 6
    -- local emoji_pos = config:get_int("emoji_reduce_config/idx") or 6
    -- local opencc_db = Opencc("emoji.json")

    for cand in input:iter() do
        if
            (emoji_pos > 1)
            and (cand:get_dynamic_type() == "Shadow")
            and not (cand.text:find("([\228-\233][\128-\191]-)") and cand.text:find("[%a]"))
        then
            table.insert(emoji_cands, { prev_text, cand })
        elseif emoji_pos > 1 then
            yield(cand)
            emoji_pos = emoji_pos - 1
            -- local emoji_tab = opencc_db:convert(cand.text)
            -- if #emoji_tab > 1 and type(emoji_tab) ~= "string" then
            prev_text = cand.text
            -- end
        else
            table.insert(other_cands, cand)
        end
    end

    if #emoji_cands > 0 then
        for _, cand_item in ipairs(emoji_cands) do
            yield(ShadowCandidate(cand_item[2], cand_item[2].type, cand_item[2].text, cand_item[1]))
        end
    end

    for _, cand in ipairs(other_cands) do
        yield(cand)
    end
end

return reduce_emoji
xiaoyixiao369 commented 6 months ago

我是直接给emoji加了一个开关,一般情况下可以不用,想用了按快捷键打开就行

iDvel commented 6 months ago

最好把这个 Lua 放到 - simplifier@emoji 的下面,- simplifier@traditionalize 的上面。

还有这个细节要注意,感谢提醒!有个疑问,不这样的话,会出现其他什么问题吗❓

放到 - simplifier@emoji 的下面,产生 emoji 后,这个 filter 再处理,才有效果。 放到 - simplifier@traditionalize 的上面,避免这个 Lua 对简繁产生副作用。

mirtlecn commented 6 months ago

这样写太怪了,不是在降权 emoji,而是在降权 simplify filter 的结果。基本和方案强绑定。不能添也不能加

而 emoji 本身 unicode 范围太杂了,也不好界定。

到不如用 lua 的 opencc 函数直接写一个转换。加个 tag 就方便了。

mirtlecn commented 6 months ago

或者就像 fcitx5 那样搞个 emoji 词典,权重降低。

比如这样

https://github.com/mirtlecn/rime/blob/master/tools/special.dict.yaml

或者这样:方案用拆字方案就行:

https://github.com/fcitx/fcitx5-chinese-addons/blob/master/im/pinyin/emoji.txt

boomker commented 6 months ago

到不如用 lua 的 opencc 函数直接写一个转换。加个 tag 就方便了。

新版本已经用上了 Opencc 转换了。之前对 Opencc 转换函数用法有点疑问,就注释了。


在降权 simplify filter 的结果

并没有吧, 我是对 "Shadow" 类型的 cand 做处理的

mirtlecn commented 6 months ago

因为 Shadow 类型是 simplier filter 组件产生的,所以我这么说:Candidate -> simplifier@emoji -> Shadowcandidate

另外 opencc 这个函数有内存泄漏的问题,应该在 librime 1.10 左右修复,现在前端版本都没有更新上来,长期用起来会占满内存。所以在配置上应当加上 gc 函数。

Anber55 commented 5 months ago

请问在选择Emoji上屏时,如何不让这个Emoji对应的词组进入自造词

boomker commented 5 months ago

请问在选择Emoji上屏时,如何不让这个Emoji对应的词组进入自造词

应该不会进到用户词典里吧,我这边没有这种情况

gaboolic commented 4 months ago

我基于Opencc里的文件 做了emoji词库https://github.com/gaboolic/rime-shuangpin-fuzhuma/blob/main/emoji.dict.yaml 然后用 ae + 拼音打emoji