outloudvi / mw2fcitx

Fcitx 5 pinyin dictionary generator for MediaWiki instances. (Releases for dict of zh.moegirl.org.cn / Check release list for latest releases)
The Unlicense
279 stars 6 forks source link

输入m没有候选词,输入韵母后正常显示 #4

Closed tumuyan closed 3 years ago

tumuyan commented 3 years ago

我引入这个词典后发生了奇怪的冲突现象。 输入m没有候选词,输入韵母后正常显示;输入其他声母也能正常显示候选;关闭引用一切恢复正常; 我尝试删除了moegirl词库中全部首字m发音的词条,没有任何效果。

import_tables:
  - moegirl

测试使用4.15版本字典+袖珍简化字拼音方案修改字典,附件为整个方案 pinyin_simp.schema.zip 在windows上使用小狼毫和android使用同文都出现了这个问题

outloudvi commented 3 years ago

感谢回报,可以复现。 在排查这个问题的原因的时候,我遇到了一个奇妙的解决方法:请试着将字典文件第五行的 ... 改为 --- 之后重新启动 fcitx/rime,再重试。这在我的设备上可以解决 m 不出候选的问题,麻烦您也测试一下。 另外我也去和 fcitx 或者 rime 那边问问。

tumuyan commented 3 years ago

我测试发现,当...改为---时,的确不出现m没有候选的问题了,但是实际上moegirl整个词典都失效了。 请您在确认一下?

tumuyan commented 3 years ago

和群友看了半天,又通过二分法定位,发现造成异常的原因是词条唔呣 wu m 总结经验:词条如果包含单个声母的码,会对全拼造成伤害。

outloudvi commented 3 years ago

感谢二分 :) 我之前测试了一下 fcitx 自带的拼音,是没有这个问题的。这个问题只发生在 fcitx5 配 RIME 的案例中(例如您使用的 pinyin_simp 或者我测试时使用的 double_pinyin)。考虑到这个问题在小狼毫和同文那边,估计是 RIME 方面的事情。 我去翻了一下 RIME 的 issue,果然:rime/librime#72 这个字确实是m 的读音lazy_pinyin 也是这么生成的:

>>> from pypinyin import lazy_pinyin
>>> lazy_pinyin("唔呣")
['wu', 'm']

关于解决方案:把它转成 mu 好了我觉得...

tumuyan commented 3 years ago

阅读librime#72后,我又看了下自己的词库,发现刚好有其中的栗子K歌。 我自己在设计编码的时候,刚好用忽略空格的编码方式写了这几条,所以之前没有发生问题。 K歌 Kge i了 ile U盘 Upan 虽然单声母的文字不多,但是英文+汉语的组合还是比较多的。 我对这个项目的脚本和py都不大熟悉,我猜测类似的词条被脚本自动过滤掉了? 我觉得这一部分可能在生成词库后,二次处理,使用脚本正则过滤,在编码中去除空格比较好一些。 为了处理无法简拼的问题,可以设置同一个词条多个编码,比如: 唔呣 wum 唔呣 wm

outloudvi commented 3 years ago

我对这个项目的脚本和py都不大熟悉,我猜测类似的词条被脚本自动过滤掉了?

是的。在预处理后不为全中文的词语都被过滤掉了:

https://github.com/outloudvi/mw2fcitx/blob/a4fbbcd5e8068ee1f08714f0e18b46c8b289a42c/mw2fcitx/exporters/opencc.py#L16-L17

我觉得这一部分可能在生成词库后,二次处理,使用脚本正则过滤,在编码中去除空格比较好一些。

考虑到不同用户输入习惯不同(例如很多用户比较喜欢在中英文之间加空格,有些用户则不然),pkg-moegirl 分支发布的词库暂时不打算包含含有英文的词条。如果有需要的话,可以在 pkg-moegirl 中配置文件的基础上,客制一个 converter,在上述文件的基础上加入想要的修改。将配置文件中的 "opencc" 换为自制的 converter 函数即可。

https://github.com/outloudvi/mw2fcitx/blob/bfad233133659e5f3e2a6728a9c3746c53893f0b/utils/moegirl_dict.py#L15-L18

为了处理无法简拼的问题,可以设置同一个词条多个编码,比如:

记得 RIME 是含有对简拼处理的配置的(例如 72 提到的 abbrev/^([a-z]).+$/$1/),所以可能并不需要在词库层面特别对简拼做优化。

tumuyan commented 3 years ago

谢谢解释 已经明白是怎么回事了