tumashu / pyim

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

多台机器同步词库想法 #423

Closed lld2001 closed 2 years ago

lld2001 commented 2 years ago

搜了下 issue,多台机器之间同步个人词库没有找到好的方法。有个想法,不知道可不可行,请帮忙看下:

  1. 每次关闭emacs时导出个人词库,把 pyim-export-personal-words 放在 kill-emacs-hook里。
  2. 导出的词库文件位置由git管理,方便多台之间合并词库。
  3. 通过下面方式加载。此处有疑问,由于各台机器之间本身有 cache,并且不同。这样会不会引起重复加载问题?加载优先级问题
    (setq pyim-dicts
      '((:name "dict1" :file "/path/to/pyim-dict1.pyim")
        ))
  4. 有没有更好方法?
tumashu commented 2 years ago

pyim 的全拼输入法, 第一个位置是预留的,剩下的词就通过count大小来排序,型码输入法也可以搞成这样,但我不知道合理不合理,因为我不了解

lld2001 commented 2 years ago

因为以前有人反映过,不希望词的位置频繁变动。

这个好像在issue里看过下。

那我先在我这种想法下用一段时间试试。

tumashu commented 2 years ago

我感觉你是想导出你输入过的词,并且这个词没有在已有词库中存在,如果这样的话,你应该自定义导出功能,这样影响更小

lld2001 commented 2 years ago

型码像五笔本身重码低,如果本身在第一个位置也统计词频,可能会有点偏。

tumashu commented 2 years ago

统计count 是一回事,排序是另外一回事,排序可以基于 count,也可以基于其它规则

lld2001 commented 2 years ago

我觉得理想状况是:固定第一个词,其他词按统计的词频进行排序,也就是从第二个位置开始按词频排列词。

tumashu commented 2 years ago
我觉得理想状况是:固定第一个词,其他词按统计的词频进行排序,也就是从第二个位置开始按词频排列词。

拼音输入法就是这么搞得,其实我觉得第一个词如何固定更重要,目前使用的方法还是比较粗糙的

lld2001 commented 2 years ago

五笔简单,第一个词按词库来就行,所以前面我才说不希望第一个词更新词频

tumashu commented 2 years ago
五笔简单,第一个词按词库来就行,所以前面我才说不希望第一个词更新词频

意思是,第一个词按词库来,剩下的按 count 排序?

lld2001 commented 2 years ago

嗯。但重码时字的排序在词的前面要好点。

tumashu commented 2 years ago

我更新了,你可以试试,另外型码是支持联输的, 可以试试:

(setq pyim-autoselector nil)
lld2001 commented 2 years ago

不知是作了什么改变?我有针对性试试。看着好像前面那里的逻辑删除,只留下 (pyim-process-create-word (pyim-process-get-outcome)

tumashu commented 2 years ago

主要更改在这块:

(defun pyim-candidates-create:xingma (imobjs scheme-name &optional async)
  "`pyim-candidates-create' 处理五笔仓颉等形码输入法的函数."
  (unless async
    (let (result)
      (dolist (imobj imobjs)
        (let* ((codes (pyim-codes-create imobj scheme-name))
               (last-code (car (last codes)))
               (other-codes (remove last-code codes))
               output prefix)

          ;; 如果 wubi/aaaa -> 工 㠭;wubi/bbbb -> 子 子子孙孙;wubi/cccc 又 叕;
          ;; 用户输入为: aaaabbbbcccc

          ;; 那么:
          ;; 1. codes       =>   ("wubi/aaaa" "wubi/bbbb" "wubi/cccc")
          ;; 2. last-code   =>   "wubi/cccc"
          ;; 3. other-codes =>   ("wubi/aaaa" "wubi/bbbb")
          ;; 4. prefix      =>   工子
          (when other-codes
            (setq prefix (mapconcat
                          (lambda (code)
                            (car (pyim-dcache-get code '(code2word))))
                          other-codes "")))

          ;; 5. output => 工子又 工子叕
          (setq output
                ;; NOTE: 下面这种策略是否合理?
                ;; 1. 第一个词选择公共词库中的第一个词。
                ;; 2. 剩下的分成字和词,字优先排,字和词各按 count 大小排序。
                (let* ((first-word (car (pyim-dcache-get last-code '(code2word))))
                       (all-words (pyim-dcache-get last-code '(icode2word code2word shortcode2word)))
                       (chars (cl-remove-if (lambda (word)
                                              (> (length word) 1))
                                            all-words)))
                  (mapcar (lambda (word)
                            (concat prefix word))
                          ;; NOTE: 形码输入法的第一个词选择公共词库中的第一个词,
                          ;; 剩下的词按照词条 count 大小排序。这种策略是否合理?
                          `(,first-word
                            ,@(pyim-dcache-call-api 'sort-words chars)
                            ,@(pyim-dcache-call-api 'sort-words all-words)))))
          (setq output (remove "" (or output (list prefix))))
          (setq result (append result output))))
      (when (car result)
        (delete-dups result)))))
lld2001 commented 2 years ago

型码是支持联输的

我看了下现在 pyim-autoselector 的设置,目前是:(pyim-autoselector-xingma)

用五笔一般是4码自动上屏,5码自动取消,现在这个设置正好,所以不存在“aaaabbbbcccc”这么长的码。

现在这种字优先于词的方案貌似也有些问题:把很多生僻字排朝常用词的前了。

tumashu commented 2 years ago

那干脆字和词不分开排了?

tumashu commented 2 years ago
所以不存在“aaaabbbbcccc”这么长的码

(setq pyim-autoselector nil) 的时候就需要处理。

lld2001 commented 2 years ago

嗯,固定第一个,其他按词频来,估计会好点。

tumashu commented 2 years ago
现在这种字优先于词的方案貌似也有些问题:把很多生僻字排朝常用词的前了。

或许我们可以选择用户曾经输入过的字?

lld2001 commented 2 years ago

但感觉词频也有些些偏差,四码唯一导致很多字词的频率会很高。

lld2001 commented 2 years ago

或许我们可以选择用户曾经输入过的字?

这是个好思路。

tumashu commented 2 years ago
这是个好思路。

试试看,我先排常用字了,常用字在这里的定义是用户输入次数超过30次的汉字

lld2001 commented 2 years ago

好的,像你说的排字词这块有点复杂,不知道有没有相关理论研究。我试用段时间再来反馈。

tumashu commented 2 years ago
好的,像你说的排字词这块有点复杂,不知道有没有相关理论研究。我试用段时间再来反馈。

没有研究过 :-)

lld2001 commented 2 years ago

发现一个bug,四码唯一上屏时,不会更新词频了。比如:时间(jfuj)这个词。

我是输入时,查看 pyim-dhashcache-iword2count这个变量的变化。

tumashu commented 2 years ago

应该可以了

lld2001 commented 2 years ago

嗯,可以正常更新词频了。