tumashu / pyim

一个 emacs 中文输入法,支持全拼,双拼,五笔,仓颉和Rime,pyim 是 GNU elpa 包。
891 stars 93 forks source link

候选词按词频排序的一点想法 #430

Closed lld2001 closed 2 years ago

lld2001 commented 2 years ago

词频更新,我的理解是为了重码时,最近输入的词排在前面。现在的是输入一个词,词频加1。

我想能不能在更新词频时,“遗忘”重码的其他词的部分词频,比如根据遗忘曲线。或者简单点,根据黄金分割率,如某个词的词频为10,就 10*0.618=6,为最新词频,其余重码的词也作类似处理。

这样的目的是让最近输入的词尽快排前面。

tumashu commented 2 years ago

最近输入的词尽快排前面,你可以看看chief那个函数,里面拼音输入法就有一些类似的策略,虽然是我主观猜测的,但也可以借鉴,其实合理定义“最近”和”尽快“,才是重要的事情,至于你说的遗忘曲线,我没太理解是啥意思

lld2001 commented 2 years ago

比如:中文,中方 这两个词,编码都是:khyy。可能有一段时间经常输入“中文”,导致其词频很高,现在要经常输入“中方”,要排在前面就得等词频超过。我的意思是,输入一个词后,将其它重码词的频降低,也即减掉掉 30%。

lld2001 commented 2 years ago

我看最新的提交是记录最近100个字词,来实现”最近“。

如果没有重码,似乎没有必要记录。

tumashu commented 2 years ago

我看最新的提交是记录最近100个字词,来实现”最近“。

是的,当然这100个词也是我估计的,哈哈

lld2001 commented 2 years ago

我觉得是不是基于重码来考虑最近好点

tumashu commented 2 years ago

基于重码考虑最近是什么意思?

lld2001 commented 2 years ago

也就是我说的,调减其他重码词的词频。

tumashu commented 2 years ago

count肯定不能减,不能说你输入这词,其它词的输入次数就降低了,这个逻辑上是不合理的,我们只能优化排序算法,加入权重机制,降低count在排序中所占的分量

tumashu commented 2 years ago

但这个权重怎么定,确实是一个值得考虑的事情

lld2001 commented 2 years ago

如果count不变化,可以考虑 同一重码 的词都放入队列中,这样在前面的词权重高点,依次递减权重。

tumashu commented 2 years ago

可以考虑 同一重码 的词都放入队列中

这个队列就是personal-words, 要实现你说的这个功能,难度不大,只需要调整sort函数就可以了,不过,怎么定权重呢?比如第一位系数是多少,第二位是多少?

tumashu commented 2 years ago

可以考虑 同一重码 的词都放入队列中

这个队列就是personal-words, 要实现你说的这个功能,难度不大,只需要调整sort函数就可以了,不过,怎么定权重呢?比如第一位系数是多少,第二位是多少?

lld2001 commented 2 years ago

也许可以按斐波那契数列来定。没研究过这方面。

tumashu commented 2 years ago

你说的这个功能,框架我已经搭好了,现在就差寻找合适的权重列表了,看master代码就明白了

lld2001 commented 2 years ago

看了下,觉得既然是权重,我想权重和加起来要为1。

最近输入的权重大,最早输入的权重低。这种排序方法应该是个指数函数。

我说的按 斐波那契数列 来定,因为它恰好就是一个指数函数,在自然中、计算中都比较常见,算法也较简单。

同一重码下:比如有5个重码,按斐波那契数列[1,2,3,5,8](首项特殊舍弃?),倒置下:[8,5,3,2,1],Sum=19,则权重分别为:[8/19, 5/19, 3/19, 2/19, 1/19]。 根据这个权重再和 count 之积计算排序值。

lld2001 commented 2 years ago

网上查了下,有些算法比较复杂,还有衰减算法之类的。我想排序算法能够考虑:输入顺序、词频两个因素,并且权重函数对输入顺序是指数函数,效果应该比单纯比较词频好。

tumashu commented 2 years ago

我觉得没必要加起来是一,我们只想让以前输入过得词更容易排在前面,如果要加起来为1,那么必须要根据候选词列表的长度计算每个位置上的权重,计算啰嗦。

在 2022-01-03 09:49:23,lld2001 @.***> 写道:

看了下,觉得既然是权重,我想权重和加起来要为1。

最近输入的权重大,最早输入的权重低。这种排序方法应该是个指数函数。

我说的按 斐波那契数列 来定,因为它恰好就是一个指数函数,在自然中、计算中都比较常见,算法也较简单。

同一重码下:比如有5个重码,按斐波那契数列[1,2,3,5,8](首项特殊舍弃?),倒置下:[8,5,3,2,1],Sum=19,则权重分别为:[8/19, 5/19, 3/19, 2/19, 1/19]。 根据这个权重再和 count 之积计算排序值。

— Reply to this email directly, view it on GitHub, or unsubscribe. Triage notifications on the go with GitHub Mobile for iOS or Android. You are receiving this because you commented.Message ID: @.***>

tumashu commented 2 years ago

或许我应该用得分而不是权重,得分不存在加起来必须为1的问题

tumashu commented 2 years ago

或者用factor, 系数

tumashu commented 2 years ago

@lld2001 我做了一下新的尝试,现在pyim会保存最近7天每天的词频,然后按照你说的方法算权重,现在代码在count-log分支,你可以试试,不知道效果怎么样

lld2001 commented 2 years ago

好棒,我用用看。现在已经很好用了,打字几乎都在emacs内。

tumashu commented 2 years ago

@lld2001 已经合并到 master