vimIM使用自然码和双拼的问题

41 views
Skip to first unread message

wonder beyond

unread,
Mar 5, 2010, 10:08:27 AM3/5/10
to vimim
我的环境:
操作系统:ubuntu9.10; gvim version: 7.2 .
我使用的vimIM是当前的测试版本(20010-03-03号下载)和
当前最新正式版本(date:2010-02-04, version: 3414)。
它们在自然码和双拼输入方面都有问题。。。
自然码的问题:
* 它并不向宣扬的那样可以整句输入(这在使用全拼时是没有问题的),如:
输入: wop yb yige mgxd.<点石> vimIM根本不知该怎么做!
* 也无法逐字(词)匹配, 如:
输入: wop.yige.mgxd<点石> 也行不通! 。。。
* 开启双拼的选项竟然会影响到自然码的使用。。
把 let g:vimim_shuangpin_nature=1 写入vimrc文件用来让双拼使用自然码的方案,
可是如果改用自然码后, 如果不注释掉rc文件中的这句, 自然码会无法使用。。。
双拼的问题: (我使用的是自然码方案)
*输入以u, v, i 打头的键码时, 根本无法匹配, 如:
uh(全拼中的shang), uhhl(对应全拼的shanghai), ikgo(chaoguo)... 这些都无法匹配
但是诡异的是, 当u,v,i不是在一个词语中的第一个字时, 可以成功匹配, 如:
dauh(dashang) 可以匹配打伤等...
更诡异的是, 即使是词语的第一个字里, 在整句匹配时, v, i, u可以匹配成功, 如:
输入 buyk zlll uhhl wo.<点石> 经过选择就可得到 "不要再来伤害我"
... ...
我很困惑, 似乎我在linux上遇到的双拼都对自然码和双拼支持的不好, fcitx很优秀,
可是它对自然码的支持缺陷甚是明显...

Message has been deleted

Pan Shi Zhu

unread,
Mar 7, 2010, 8:42:44 AM3/7/10
to vi...@googlegroups.com
这个问题的主要原因来自:要想成功的设计一个输入法的用户体验,必须首先熟知该输入法。而目前vimim作者并不熟悉自然码。

例如,我看了你的帖子,越来越不明白自然码跟双拼的关系。你是使用自然码么?还是使用自然码风格的双拼?还是说自然码本身就包含拼音?如果你是自然码的高手,那么你需要先向我们普及一下这方面的知识,剩下的事情就好做了。

> 我很困惑, 似乎我在linux上遇到的双拼都对自然码和双拼支持的不好, fcitx很优秀,
> 可是它对自然码的支持缺陷甚是明显...

wonder beyond

unread,
Mar 8, 2010, 5:03:19 AM3/8/10
to vimim
你说的很对, 输入法的实现者并不了解 输入方案本身, 这确实是一个问题... fcitx对自然码支持的缺陷也是同样原因, 我曾经反映过,
但yuking说他并不了解自然码...说可以和我讨论, 但是以后就没联系了...
至于我在使用哪种输入形式, 我现在在fcitx上面使用的是 自然码, 自然码 是从双拼发展来的, 它加入了一些新元素, 比如辅码...
双拼本身有各种形式(键组合有些区别), 自然码风格的双拼 可以说是与 自然码 的键盘输入组合(不包括自然码使用的辅码, 因为双拼不支持, 要是
支持的话, 它已经是自然码了) 一致的双拼形式...
当我发现我所使用的输入平台对自然码支持不好的时候, 我就考虑到了尝试使用双拼, 因为熟悉自然码 ,肯定选择自然码方案(使用双拼当然无法象自然码
那样可以使用辅码了)... 你问我到底使用自然码还是双拼, 答案是, 我首选自然码, 无奈时会尝试采用自然码方案的双拼, 其他的双拼一律没用
过, 也不了解, 我还是看了 vimIM 的代码后才发现原来 不同的双拼方案 的区别在于键盘组合上...
自然码确实是 一种绝好的 输入方法, 它会带来比双拼更惊艳的体验! 所以我应该担起向更多人介绍自然码的责任... 虽然我只是一个普通的使用
者... 我也确实感到了使用者(或关注者)少给我带来的痛苦, 否则的话我会有更好的体验的... 全拼就是例证, 当我发现输入平台对自然码支持不
好(对双拼的支持也不太好)的时候, 我特意体验了下全拼, 比如fcitx对全拼支持的很完善很智能...
但是在不太友好的体验下, 我一直坚持使用的是自然码, 为什么? 我只能说, 自然码输入方案很完美, 很科学... 能极大提高打字效率, 而且需
要强制记忆的东西不过二三十个韵母所对应的键梆定是什么, 如果稍微多记忆一些辅码, 输入效率将是极大飞跃...
所以即使输入平台的支持有缺陷, 依然不能让我放弃使用自然码...
至于说普及一些知识, 我知识一个普通用户... 我所了解的仅限于我的体验范围之类, 不过我会抽实践整理一些材料的, 用来推广一下自然码...

wonder beyond

unread,
Mar 8, 2010, 9:15:55 AM3/8/10
to vimim
我突然发现一个很好(但很迂回)的办法迂回的解决了我在vimim中使用自然码的困惑, 让我获得了较好的体验
首先声明我不懂 vimscript, 但是我试图看了vimim的脚本结构, 看出了一点点东西.
对稍作修改, 照葫芦画瓢添加了一句: diff vimim.vim_bk vimim.vim #前者为当前测试版, 后者已被我修改
diff 输出如下:
413a414,415
> call add(input_methods, "use_zrm_as_pinyin")
> "不要惊讶, 我要程序把自然码码表当拼音来解释
3934a3937,3939
> elseif s:vimim_shuangpin_nature > 0
> let jxqy = {"jv" : "ju", "qv" : "qu", "xv" : "xu", "yv" : "yu"}
> call extend(sptable, jxqy)

(注意上面的第二处修改跟当前主题没有关系, 那是前几天针对双拼添加的, 目的是解决双拼中的某些键序列与自然码不一致的情况)
然后我把我的自然码码表(vimim.nature.txt) 直接改名为 vimim.use_zrm_as_pinyin.txt .

再次打开vim, 就可以直接把 自然码 的词库文件 让vim当做拼音来解释了, 感觉挺好的! 看来vimim没必要把解释自然码的函数 和 解释
拼音的函数分开嘛! 当然, 当做拼音来解释并不总是完美的(这里就不说太多了)...

Pan Shi Zhu

unread,
Mar 8, 2010, 8:21:51 PM3/8/10
to vi...@googlegroups.com
> (注意上面的第二处修改跟当前主题没有关系, 那是前几天针对双拼添加的, 目的是解决双拼中的某些键序列与自然码不一致的情况)
> 然后我把我的自然码码表(vimim.nature.txt) 直接改名为 vimim.use_zrm_as_pinyin.txt .
>
> 再次打开vim, 就可以直接把 自然码 的词库文件 让vim当做拼音来解释了, 感觉挺好的! 看来vimim没必要把解释自然码的函数 和 解释
> 拼音的函数分开嘛! 当然, 当做拼音来解释并不总是完美的(这里就不说太多了)...

你这个给我的感觉是:自然码跟拼音一样,可以一次输入多个字的码然后拼接成词或者句?(对于五笔而言,词的规则与字的规则是不同的。)

如果是这样的话,修改起来可能容易。但是自然码跟全拼还是有区别的。因为目前所有的输入法都要求对全拼进行智能断字。而如果修改了编码,就无法正确断字,那么会出一些问题。

把自然码当作双拼行不行?这个我不清楚,因为双拼是个定长编码,每个字必须是两个码。而自然码不知道是否符合?

当然 i,u,v 的问题是个不足,因为这个对应的代码仅仅对智能ABC双拼方案适用(智能ABC双拼方案不使用 i,u,v
打头的拼音,而对于自然码双拼而言,空余出的三个字母不是 i,u,v 而是其他的三个字母。)。这个不足实际上我在目前的私云中才解决,而没有在
vimim 引擎中去测试。

Pan Shi Zhu

unread,
Mar 8, 2010, 8:29:59 PM3/8/10
to vi...@googlegroups.com
> diff 输出如下:
> 413a414,415
>> call add(input_methods, "use_zrm_as_pinyin")
>> "不要惊讶, 我要程序把自然码码表当拼音来解释
> 3934a3937,3939
>> elseif s:vimim_shuangpin_nature > 0
>> let jxqy = {"jv" : "ju", "qv" : "qu", "xv" : "xu", "yv" : "yu"}
>> call extend(sptable, jxqy)

hmm, 如果这里确实是 3934 行的话,你用的看起来并不是最新版本。

你可以重新检出一份版本。
svn checkout http://vimim.googlecode.com/svn/trunk/

至于前者,可以使用 pinyin_zrm 来代替 use_zrm_as_pinyin,这样与其他的命名更统一。

wonder beyond

unread,
Mar 9, 2010, 8:10:29 AM3/9/10
to vimim

=====================================================
我想就我的了解 说说 全拼(仅针对使用自然码方案的双拼)、双拼 和自然码的区别。。。
+++++++++++++++++++++++++++++++++++++++++++++++++++++
##全拼##
**首先, 拼音有声母+韵母构成, 每个字都对应一个 声+韵 组合, 但是每个声韵组合都对应大量的字, 据此来说,全拼的一个缺点就是重
码太多, 仅靠韵母和声母这样区分度不大的组合 致使会在大量候选字中翻阅(不过好象有在声韵组合后加上一个数字代表音调的实现);
**全拼输入的另一个缺陷是需要频繁敲击键盘, 声母一般都是一个字母(zh, ch, sh 除外), 但是很多韵母太长了, 在输入它们时浪费了
很多时间, 严重降低了输入效率...
+++++++++++++++++++++++++++++++++++++++++++++++++++++
##双拼##
**基于上面提到的全拼的第二个缺陷, 我认为 双拼 最高明的是 简化了韵母的输入. 但是我首先要说的全拼在 声母输入 上的改善,
声母有26个, 其中23个(如 b,p,f...)都是只用一个字母来表示的, 但是有三个例外, 那就是zh、ch 和 sh,正好键盘上存在三个
字母
是声母中没有用上的, 那就是 v、i 和 u,于是双拼中, 分别让 v 代表 zh, i 代表 ch, u 代表 sh(把v想像成 树(sh)
枝,i想像成
尺(ch)子, u想像成 试(sh)管, 你就会很快熟练双拼中的声母输入)。这样以来既简化了输入, 又决不会引入 歧义性 和 候选词增加
的问题...
**然后说双拼中的韵母:
[既然] 声母只需敲击一个键就搞定了, [而且] 在一个拼音中 韵母必然后于声母出现, [那么]可以确定的是, 在一个 声+韵 组合中,
第一个字母之后的肯定就是韵母了. 我刚刚google了一下, 普通话中共有39个韵母, 而键盘上的字母共有26个, 为什么非要用一串很长
的字母组合来代表某些韵母呢? 我们先用键盘上26个字母分别代表一个韵母(剩下的13个韵母先假设它们不存在), 这样如何?
这样我们既简化了输入, 又没有引入重码增多的问题. 比如我们用 字母 's' 代表韵母中的 'ong', 这样 s 既是声母中的 s, 又是
韵母中的 ong, 看到 'ss' 这个声韵组合时, 绝对不会发生混淆, 因为声母先于韵母而出现, 所以第一个 s 是声母中的 s, 声母之

是韵母, 所以第二个 s 是韵母中的 ong. 合在一起 'ss' 就相当于全拼中的'song', 它绝对不会代表另一个全拼中的 声韵组合,
所以
双拼是没有歧义的, 没有歧义就不会带来重码增多(对于用户来说, 就是候选词增多)的问题. 双拼相对于全拼, 只有优化, 没有代价!
... 可是我们刚才只用键盘上的所有字母映射了 普通话韵母 中的26个, 还有13个怎么办??? 首先, 需要明确一个事实, 那就是双拼中,
所有的韵母都是用一个字母表示的, 可能你会发现漏洞出来了. 我刚才说双拼绝对没有歧义性, 现在又说双拼用键盘上的26个字母来
映射所有韵母, 而且每个韵母都只用一个字母表示, 那么双拼中肯定有一些 声韵组合 对应全拼中的两个 声韵组合(因为要用26个字母
映射全部的39个韵母, 肯定会有一些字母代表两个韵母才行), 这样不就出现歧义性(歧义性会导致重码增多)了吗?
下面举个例子来攻破刚才的矛盾, 打消刚才的疑虑:
在全拼中, 确实会使用 键盘上的一个字母代表多个 韵母.
如 s 既代表全拼中的 'ong', 又代表 'iong', 所以
ss 代表 song, 但是不代表 siong;
hs 代表 hong, 但是不代表 hiong;
qs 代表 qiong, 但是不代表 qong;
... ... 因为普通话中 没有 siong, hiong, qong这些声韵组合
d 既代表全拼中的 'uang', 又代表 'iang', 所以
hd 代表 huang, 但不代表 hiang;
qd 代表 qiang, 但不代表 qang;
... ... 道理同上...
全拼正是利用普通话拼音的这些规则来实现 声韵组合 在解释上的惟一性的...
好了, 总结一下. 双拼克服了全拼输入过于繁琐的缺陷, 大大减少了不必要劳动. 它在大大压缩了键码组合的情况并没有引入歧义性,
所以说双拼是一个很好的选择.
##自然码##
双拼很好地解决全拼输入繁琐的缺陷. 全拼的另一严重问题仍然没有解决. 虽然我刚才强调双拼在简化键码的同时没有引入重码增多
的问题. 但是众所周知的是, 全拼本身的重码问题已经非常严重了, 据说五笔(我不会用)中几乎每个字都有惟一与之对应的字母组合.
而拼音呢? 二三十个字共用一个 声韵组合 是很常见的事情(比如输入'da', 会有 大、达、耷、妲...), 这样何谈效率?
而自然码很好地解决了 全拼和双拼中重码多的问题. 靠的就是自然码中的辅码!
自然码源于双拼, 它象双拼那样, 仅使用两个字母的 声韵组合 来代表全拼中的冗长的 声韵组合, 但是在由两个字母构成的 声韵组合
的基础上, 可以再加一个辅码来大大减少重码率. 通常的情况是, 辅码输入后, 你心中所想之词马上出现在候选词的第一位, 直接空格
上词吧, 快哉!
比如输入'tm'(全拼中的tian), 候选词中包括:
填, 腆, 掭, 甜, 佃...
要选择上面的字之一往往还需要翻页, 你完全可以在自然码中那样干... 但是不必那么麻烦, 下面让我们体验一下辅码:
输入 'tmt' , 出现在第一的是 '填'...后面的t就是辅码, 它是 '填' 的偏旁 '土' 发音声母的声母部分;
输入 'tmo' , 出现在第一的是 '腆'...辅码是o, 你可以把字母O想像成天上的月亮(部首月)、太阳(部首日) 和 圆圆的眼睛(部首
目);
输入 'tmf' , 出现在第一的是 '掭'...辅码是f, 看齐来 '掭' 的 提手旁 和 字母 f 很相象;
输入 'tmu' , 出现在第一的是 '甜'...辅码是u, u 代表 '甜' 的部首 '舌' 发音的声母部分;
输入 'tmr' , 出现在第一的是 '佃'...辅码是r, r 代表 '佃' 的部首 '人' 发音的声母部分;
辅码的选用往往都很形象, 形象的让你不用记忆就能搞定大多数字的辅码! 辅码多位偏旁部首的发音的声母部分! 如'效'的辅码为 'w',
'笑' 的辅码为 'v'(竹的声母). 独体字的辅码往往选用它的首笔法的发音的声母部分, 如 '自' 的 辅码我 'p'(撇的声母)
... ...
好了, 不多说了, 我只是的拼音、双拼 和自然码做了简单的比较与评价. 要想了解自然码,请搜索网上的材料...
包括全拼中的韵母 在自然码中都使用那些字母代表, 还有自然码中辅码的一些细则, 都能在网上找到答案!

Pan Shi Zhu

unread,
Mar 9, 2010, 9:39:17 AM3/9/10
to vi...@googlegroups.com
原理上都很清楚了,因为音加形是多数输入法都有的功能。
我想知道的是,如果加辅助码,如何断字?

对于双拼,固定是两个字符一个字,但是如果加辅助码,那么有的字是两个字符,有的字是三个字符,输入六个字符的话,究竟是应该三三分认为是两个字,还是应该二二分认为是三个字呢?


2010/3/9 wonder beyond <wonder...@gmail.com>:

> 而自然码很好地解决了 全拼和双拼中重码多的问题. 靠的就是自然码中的辅码!
> 自然码源于双拼, 它象双拼那样, 仅使用两个字母的 声韵组合 来代表全拼中的冗长的 声韵组合, 但是在由两个字母构成的 声韵组合
> 的基础上, 可以再加一个辅码来大大减少重码率. 通常的情况是, 辅码输入后, 你心中所想之词马上出现在候选词的第一位, 直接空格
> 上词吧, 快哉!
> 比如输入'tm'(全拼中的tian), 候选词中包括:
> 填, 腆, 掭, 甜, 佃...
> 要选择上面的字之一往往还需要翻页, 你完全可以在自然码中那样干... 但是不必那么麻烦, 下面让我们体验一下辅码:
> 输入 'tmt' , 出现在第一的是 '填'...后面的t就是辅码, 它是 '填' 的偏旁 '土' 发音声母的声母部分;
> 输入 'tmo' , 出现在第一的是 '腆'...辅码是o, 你可以把字母O想像成天上的月亮(部首月)、太阳(部首日) 和 圆圆的眼睛(部首
> 目);
> 输入 'tmf' , 出现在第一的是 '掭'...辅码是f, 看齐来 '掭' 的 提手旁 和 字母 f 很相象;
> 输入 'tmu' , 出现在第一的是 '甜'...辅码是u, u 代表 '甜' 的部首 '舌' 发音的声母部分;
> 输入 'tmr' , 出现在第一的是 '佃'...辅码是r, r 代表 '佃' 的部首 '人' 发音的声母部分;
> 辅码的选用往往都很形象, 形象的让你不用记忆就能搞定大多数字的辅码! 辅码多位偏旁部首的发音的声母部分! 如'效'的辅码为 'w',
> '笑' 的辅码为 'v'(竹的声母). 独体字的辅码往往选用它的首笔法的发音的声母部分, 如 '自' 的 辅码我 'p'(撇的声母)
> ... ...
> 好了, 不多说了, 我只是的拼音、双拼 和自然码做了简单的比较与评价. 要想了解自然码,请搜索网上的材料...
> 包括全拼中的韵母 在自然码中都使用那些字母代表, 还有自然码中辅码的一些细则, 都能在网上找到答案!
>

> --
> VimIM —— Vim 中文输入法
> http://vimim.googlecode.com/svn/vimim/vimim.html
>

wonder beyond

unread,
Mar 9, 2010, 10:55:28 AM3/9/10
to vimim
On 3月9日, 下午10时39分, Pan Shi Zhu <pan.shi...@gmail.com> wrote:
> 原理上都很清楚了,因为音加形是多数输入法都有的功能。
> 我想知道的是,如果加辅助码,如何断字?
>
> 对于双拼,固定是两个字符一个字,但是如果加辅助码,那么有的字是两个字符,有的字是三个字符,输入六个字符的话,究竟是应该三三分认为是两个字,还是应该二二分认为是三个字呢?
==============================================
至于如何断字, 我在使用中也思考过这个问题, 感觉确实有点难以抉择...
我只知道自然码的编码规则, 对于断字规则, 我不知道自然码是否规定了一个标准, http://www.zrm.com.cn/ 这个网站貌似在自
然码上
很权威, 但是它只提供for win的产品, 所以我没有机会体验它的断字细节...
我一直在fcitx平台使用自然码, 但是我感觉它对自然码的支持并不好, 可能因为不懂自然码, 所以没发有针对性的设计...
现在我就我的使用体验, 说说应该怎么断字才算人性化:
**输入1个字母时 :
自然码中规定了 26 个特别常用的字, 绑定到 26 个字母键上, 目的是在只输入一个字母就敲空格时, 上档的是它对应的那个常用字.
例如 ’y‘ 对应 ’一‘, ‘d’ 对应 ’的‘, 所以当仅输入字母 ’d‘ 时, 必须保证 ’的‘ 排在第一位, 这与后面的候选在如何选
择, 我认为
不太重要了
**当输入2个字母时:
我认为fcitx在这个时候表现的很差!
应该首先把它看作 一个单字 的(没有辅码的)编码. 什么意思呢?
如输入 ’lm‘(全拼中的lian) , 应该把所有的匹配的单个汉字排在前面, 而fcitx怎么做的呢? 下面是fcitx中输入lm的候选词
(前6个):
1 连, 2 厘米, 3 恋爱, 4 帘, 5 老毛病, 6 连绵不断 ...
我先来解释下为什么这六个会被匹配, 然后在说这样有什么不好
第一个不用说了;
在解释第二个之前, 先插播一条关于自然码一个细则的介绍
-----------------------------------------------------
vimIM里面的 云游字符(') 在自然码里面起到一个特殊作用
如 dj'(注意后面的但引号) 并不代表全拼中的 dan, 所以它并不匹配 ‘但’, 以云游字符结尾键码序列中的每一个字符被当做一个词语、成
语 或句子中的每个字的的拼音的声母来解释, 所以 dj' 匹配 ‘大家’, yjld 匹配 ‘炎凉’, 而 yjld' 匹配 ’一举两
得‘。。。
-----------------------------------------------------
接着解释lm 的第二个匹配项, 为什么 ’厘米‘ 会出现在候选词中, 因为 lm 是 lm' 的一部分, 所以可以成为 ‘亚选项’, 将像在拼
音输入法中 输入 ‘shuan’ 如果把匹配 ‘shuan’ 的候选词翻完了, 后面会出现匹配 ‘shuang’ 的字.

....笔记本快没电了, 先提交了, 明天再来写!

wonder beyond

unread,
Mar 10, 2010, 10:00:33 PM3/10/10
to vimim
To: Pan Shi Zhu,
下面内容是昨天就写的, 由于gladder 突然无法翻墙访问GoogleGroups导致我没发登陆该论坛, 所以贴子里面的 ‘昨天’ 实际上
是 ‘前天’
==============================================================================================================================
我昨天就自然码如何断字的回答尚未完成, 今天继续!
经过我的思考与测试, 我的思维与昨天所说已经接不上了。。。
--------------------------
首先纠正一下昨天的错误:
我昨天说,以单引号结束的键序列中的每一个字母都将作为一个词语或短语中每一个
单字的发音的声母来匹配,这是不准确的。
输入 dj' 并不相当于全拼中的 dan,实际上 d 和 j 分别代表一个双字词组中两个字
的声母,所以 dj' 可以匹配 '大家'。。。 djh' 可以匹配 '大家好' 。。。
但是与昨天我说的不一致的地方是, 输入 yjld' 并不会匹配 ‘一举两得’... 通过词库
文件 vimim.nature.txt 可以发现, 单引号前面的字母个数一律没有超过3个, 输入一
举两得的实际键码是 yjld , 超过四字的短语的 编码方案是: 把其前三个的单字的声母
和最后一个字的声母拼接生一个四个字母组成的序列, 如 ‘中华人民共和国’ 在词库的
编码是’vhrg‘ ...
我认为这样设计是有缺陷的, 可以发现vimim的自然码词库中所有的双字词, 都是由前后
两个单字的 声韵 组合成的 4个字母序列 编码的... 这样以来, 当输入四个字母的序列
时, 如 yjld, 候选词中既有双字词语, 又有成语和超过四字的短语, 无疑增多了重码.
================================================
好了, 回到正题, 你昨天问道: 输入六个字母, 到底应该 三三 分成两个字, 还是 二二
分成 3 个字...
实际上, 三三拆是拆成两个 声韵辅 组合, 二二拆是拆成三个 声韵组合.
最简单的是手动断字, 在通用的输入法如fcitx中, 随着你输入字母的增多, 候选项是
实时刷新的, 要想输入两个单字, 可以先输入第一单字的 声韵辅 组合后, 直接空格或
按下数字提示选择目标字, 然后按同样的方法输入第二个字, 在连续输入两个不能组成
一个词语的单字时, 就是这样做的...
如果要输入一个 双字词语 呢? 比如 ‘试验’ , 输入两个 声韵辅 拼接成的6个字母组合
即 uiyyjm 合适吗?
很遗憾! 这不是输入双字词语的正确方式, 虽然 uiy 可以匹配单字 ‘试’, yjm 可以
匹配单字 ‘验’ , 正确的输入应是: uiyj 或 uy' (前提是, 词库中提供了这样的词组
映射, 否则只能逐字输入, 即先输入 uiy 得到 ‘试’, 再输入 yjm 得到 ‘验’), 为什么
呢? 查看一下词库文件就知道了, 词库里面的每个词条所对应的键码都没有超过四个
声母, 所有 双字词 的键码都是两个 声+韵 组合成的4个字母, 所有的成语和长短语都
采用前三个字的声母加最后一个字的声母所组成的4个字母序列编码.
自然码的的辅码在输入单个汉字的效率是极高的, 但是词库中的所有双字词中, 并没有
使用两个 声韵辅 组合来编码, 而是采用声韵组合, 我认为这是很合理的, 为什么呢?
原因在于, 词语本身的结合性已经可以滤掉全部那些相互组词的单字了, 词语相对于
单字的重码率会本来小很多, 如果把词语中的每个字都再加上辅码加以限制, 感觉意义
不大, 并且浪费劳动力... http://www.zrm.com.cn/ 这个网站提供的自然码产品支持
对一个词语加上辅码来精确定位目标词, 这个辅码是针对词语的, 可以从词语中的任意
一个单字中选择, 例如, 输入 dajwf , 就可以匹配 ‘打假’ 而把 ‘大驾’, ‘大家’等
过滤掉, 因为 ‘大驾’, ‘大家’ 中的任何一个字的辅码都不是 f ...
这个整词辅码我没有机会体验过, scim, fcitx中的自然码都不支持, vimIM 提供的
纯文本码表文件让我有机会了解到: 词库中每个词条的键码都没有超过四个字母, 这样
的词库是不支持 词语辅码 的. ((##############################################
#思维分叉: 其实我认为, 只能的输入法不能完全依赖码表中罗列的词条来匹配, 比如
#它可以这样支持词语辅码: 要实现用户输入 dajwf 时能够匹配打假, 不必要求词库
#文件中存在这样一个词条让 dajwf 和 ‘打假’ 形成映射, 只需要存在 dajw 与 ‘打假’
#的映射就行了, 当然与 dajw 映射的还有其他词语. 通过 前四个字母 dajw 可以
#得到 ‘打假’ ‘大家’ ‘大驾’ 这些匹配项, 然后在词库中查找这些词语中每个单字的
#辅码, 如果它不是 f , 显然可以过滤掉了...#################################))
==================================================================
综上所述, 当输入一个6个字母组成的序列时, 对它进行三三拆分肯定不会直接得到一个
双字词的, 因为词库中没有提供这样的词语组合, 但是可以先后得到两个单字, 前三个
字母通过 声韵辅 组合匹配一个单字, 后三个同样得到一个单字.
------------------------------------------------------------------
我认为, 如果了解了词组的编码规则, 要想输入一个 双字词语, 是不会连续输入两个
声韵辅 组合的成的6字字母序列的...
但是输入三字的时候输入常常会输入6个字母的序列, 这六个字母是由3个 声韵 组合
拼接成的, 比如要输入 ‘快点来’ , 如果词库中有相应的词条, 可以直接输入 kdl' ,
但是词库中没有这个映射. 由于 ‘快点’ 是一个常用 双字词, 加上后面的 ‘来’, 可以
输入 kydmll , 这是时候如果 三三拆分 就与违背意愿了...
所以个人认为, 输入六个字母时, 应该首先进行 4-2 拆分, 这也体现了最大匹配的原则
, 在候选词列表中, 首先应把前4个字母匹配的所有双字词排在前面, 然后把这4个字母
匹配的所有成语和长短语排在其次, 如果用户选择了前4个字母所对应的匹配项之一, 就
把剩下的2个字母按输入两个字母时的规则匹配. 如果用户不选择而继续翻页, 当四个
字母所能匹配的选项排完后, 可以使用 2-2-2 拆分, 用来依次得到三个孤立的字.
同理, 7 个字母, 优先使用 4-3 拆分, 其次使用 2-2-3 拆分;
8 个字母, 优先使用 4-4 拆分, 前四个当做双字词匹配后, 后四个继续作为双字词匹配
, 其次使用 2-2-4 拆分, 再次使用 2-2-2-2 拆分...
---------------------------------------------------
下面根据 自然码规则 以及 我的个人体验 说说当输入 的字母在 1-5 之间时, 应该
如何组织候选项:
1 个字母:
该字母所对应的那个常用字必须排在第一, 后面的不太重要, 把以字母开头的所有键码
所对应的词条按序排列就行;
2 个字母:
其实没加辅码的两个字母所构成的 声韵组合 也绑定了一个常用字, 比如 ln 对应的
常用字是 ‘林’, 所以直接输入 ln 时, 排在第一为的必须为 ‘林’, 如果加上‘林’的
辅码后输入 lnm , 候选项中排在第一的说不定就不是 ‘林’ 了, 因为其他发音为 lin
的汉字的辅码也可能是 m , 比如 ‘檩’ ... 排在常用字后面的候选项应该遵循什么规则
我认为是很要紧的事情! 比如输入 lm , 第一个候选项为其对应的常用字 ‘连’, 后面
的候选词, 只能出现近似匹配的项目了, 有以 lm 开头, 以一个辅码结束的; 有以 lm
开头, 以两个字母结束的(它们匹配四字或四字以上的成语和短语); 有以 lm 开头, 以
单引号结束的; 有以 lm 开头, 以一个字母加单引号结束的. 如何排列这些项目十分
重要. 比如我要输入 ‘莲’ , 可是我忘记它的辅码是什么了, 忘记了就不写了嘛! 于是
只输入 lm , 可是你看看在 fcitx 下面输入 lm 时的候选项是怎么排列的:
1 连, 2 厘米, 3 恋爱, 4 帘, 5 老毛病, 6 连绵不断, 7,8,9,10全是双字词语...
(‘厘米’ 的完全码是 lm' , ‘恋爱’ 的完全码是 lmai , ‘老毛病’ 的完全码是 lmb' )
看出问题来了吗? 候选项中 单字, 双字词, 三字词, 成语 交错排列, 而非按人性化的
顺序排列, 这让人很难定位目标字 ‘恋爱’ 的词码是 lmai , 与 lm 差了那么远竟然
排的那么靠前! 向 ‘厘米’ 这样的选项根本就应该靠边站, 如果我想输入一个词语中的
每个字的声母来匹配它, 我会自然而然地加上 单引号, 这时候它才应该提前. 而 ‘莲’
的编码是 ‘lmc’ , 输入 lm 的情况下竟然翻了半天找不到...
3 个字母:
当然把它看作一个普通的 声韵辅组合, 列举其对应的单字了, 其次列举近似匹配的...
4 个字母时:
优先列举双字词语, 然后列举成语和超过4字的短语.
5 个字母时:
这个看着办吧, 想不好, 如果是 ‘标准’ 自然码的话, 那第五个字母就是一个词语的
辅码了... ...

Pan Shi Zhu

unread,
Mar 11, 2010, 12:14:20 AM3/11/10
to vi...@googlegroups.com
插个话,如果使用 https 访问 groups 是无须翻墙的。
或者把 group 直接定位到 gmail,由于 gmail 本身是 https 的,也无须翻墙。

关于你这个描述,我们可以知道:

1。自然码的编码方式接近拼音而非形码,没有最大码长,也可以进行任意的组合。——这样要很好的支持恐怕不容易。
2。同一个组合可以有多种断字方式,这一点接近形码而非音码。(拼音码的每个词通常都有唯一的断字方式)
3。对于单词的形码辅码,亦无法确定其辅码是针对哪一个字进行过滤。(新的不确定性)
4。辅码存在的时候,无法确定其为辅码还是音码,例如 abcdef 中,你可以解释为 ab,cd,ef 三个音码,也可以是 ab,cd 作为音码,ef 作为形码。
5。支持结尾加'形式的单声母简拼。

也就是说,从程序设计的角度来讲,自然码即引入了拼音码的复杂度,又引入了形码的复杂度。还引入了音+形码混合判定的复杂度,还引入了超级简拼的复杂度,是目前所知最复杂的实现。Linux中各种对自然码的支持有限是完全可以理解的。即使我现在来想,也无法完备的描述其规则,无法描述这个准确的规则也就无法建模,无法编程。

但是如果能够准确的规定其规则,那么部分实现还是可能的。

1。单字母按快捷字处理
2。2字母按双拼处理,3字母按2字母+1辅码处理
3。4字母按两个双拼处理,5字母按4字母+1辅码处理,
4。6字母按三个双拼处理,7字母按6字母+1辅码处理,依此类推。
5。加'按照超级简拼处理

是这么个意思吧?

2010/3/11 wonder beyond <wonder...@gmail.com>:
> To: Pan Shi Zhu,

wonder beyond

unread,
Mar 8, 2010, 9:25:52 AM3/8/10
to vimim
有人能介绍一下vim的代码组织结构和设计思想吗? 我想研究研究. 虽然我不懂vim script, 但是希望搞清楚vimim里面的各个模块是用
来干什么的, 也好照葫芦画瓢来进行定着制, 并以此为模板学习下vim script... 我大概看了下vim的文档, 好象关于script的介
绍的很简单...

wonder beyond

unread,
Mar 10, 2010, 9:51:24 PM3/10/10
to vimim
******************************************************************************************************
| To : Pan Shi
Zhu,
|
| 下面的内容是昨天就写好的, 由于gladder突然无法翻墙, 又尝试使用在线代理, 但由于不支持cookies, |
| 所以无法登陆GoolgeGroups... 以致今天才把内容发上来, 所以贴子里面的昨天实际上是前天... |
*****************************************************************************************************

Pan Shi Zhu

unread,
Mar 11, 2010, 3:35:35 AM3/11/10
to vi...@googlegroups.com
> 有人能介绍一下vim的代码组织结构和设计思想吗?

关于代码,请找 vimim google code project 的 owner。

具体代码我也整不太明白,目前我在里面搭了一个架子,有了这个架子vimim就可以调用外部的输入引擎,于是我就可以用外部引擎实现自己的输入法。如果需要,用外部引擎方案我可以整出若干空余时间实现自然码。

不过如果是说直接在 vimim.vim 中实现的话,目前要达到你说的样子还是有一定距离。主要是,那个脚本很多细节我也不太明白。

wonder beyond

unread,
Mar 11, 2010, 7:30:20 AM3/11/10
to vimim
引用:
===================

1。单字母按快捷字处理
2。2字母按双拼处理,3字母按2字母+1辅码处理
3。4字母按两个双拼处理,5字母按4字母+1辅码处理,
4。6字母按三个双拼处理,7字母按6字母+1辅码处理,依此类推。
5。加'按照超级简拼处理

是这么个意思吧?
===================

回复:
===================
一个关键问题时, 不管是fcitx中的码表, 还是 vimim.nature.txt, 里面所有词条的键码没超过 4 个字母, 不知这是
自然码的本身规定, 还是词库的不健全... 如果在现有的码表文件下, 6字母按3个双拼就无法直接匹配了, 因为词库
中没有这样的词组, 应该优先用前4个匹配一个双字词语, 后两个字母当做双拼. 如果前4个不能组词或遍历完所有的
词语, 再按3个双拼处理. 7个字母先使用前4个匹配双字词, 后3个作为一个 声韵辅 组合.
词库中所有的词条单引号前面均没有超过3个字母, 所以你说的第5条是有限制的...
你说5个字母按4个字母加1个(词语)辅码处理, 这样很好, 我之前说的那个网站提供的自然码产品就有整词辅码的功能,
但是在现有的词库条件下, 恐怕实现起来有点困难, 我还没机会体验这个功能...
--------------------
不得不说的是, 虽然我认为自然码的设计思想已经很完美了, 但是我所使用的词库和码表中词条的编码规则让我感觉
很不合理... 里面的所有词条的编码仅限于4个字母(或字母加单引号)组成的序列, 这样表达能力会很低. 比如为了得到
’大家好‘, 输入 dajwhk ,候选项中肯定找不到 ’大家好‘ , 因为词库中没有这么长的键码映射! 只能先在候选项中得到
’大家‘ , 然后在发音为 hao 的众多单字中选择 ’好‘...
(其实输入’大家好‘的一个更好的方法是 djh' )
---------------------
如果输入工具能在不完全依赖词库的情况下, 通过智能分析, 把自然码的精华发挥得淋漓尽致, 那将是非常美妙的事情,
比如我之前一篇贴子中提到的对 整词辅码 支持的方案应该是可以实现的...
---------------------
其实你应该看出来了, 我把我在 自然码上的不爽体验的原因归结于输入平台的支持 和 码表文件的简陋.
我希望能够多了解一些基础性的东西, 以促进在linux系统下, 一个能够完美支持自然码并发挥其精髓的输入平台的诞生!
另外, 由于我没有用过专业的自然码输入系统, 自然码的细则方面我无从得知... 我所说的多是根据于 我的使用体验...
不过我认为把一些基本的规则按人性化的方式实现就很好了...
希望我能够为在linux平台下 完善自然码的实现, 推广自然码的使用 尽一份力!!!

Pan Shi Zhu

unread,
Mar 11, 2010, 9:24:50 AM3/11/10
to vi...@googlegroups.com
2010/3/11 wonder beyond <wonder...@gmail.com>:

> 引用:
> ===================
> 1。单字母按快捷字处理
> 2。2字母按双拼处理,3字母按2字母+1辅码处理
> 3。4字母按两个双拼处理,5字母按4字母+1辅码处理,
> 4。6字母按三个双拼处理,7字母按6字母+1辅码处理,依此类推。
> 5。加'按照超级简拼处理
>
> 是这么个意思吧?
> ===================
>
> 回复:
> ===================
> 一个关键问题时, 不管是fcitx中的码表, 还是 vimim.nature.txt, 里面所有词条的键码没超过 4 个字母

这个问题容易解决,因为既然自然码就是双拼,我们可以直接使用搜狗的词库,那样想有几个字符就有几个字符。

> 你说5个字母按4个字母加1个(词语)辅码处理, 这样很好, 我之前说的那个网站提供的自然码产品就有整词辅码的功能,但是在现有的词库条件下, 恐怕实现起来有点困难, 我还没机会体验这个功能.

其实辅码按照单字过滤,很容易实现,只要建立一个辅码表就可以了,当然,我不知道怎么在 vimim
中实现它,但我可以先在本地云(pim-cloud.appspot.com)中实现,等 mxj
休假结束了,再让他看看。或者你自己研究一下现有代码。

现在的 vimim 双拼主要是基于智能 ABC
的,因为我只熟悉这个,其实从思想上来讲,智能ABC也是拼音加形码,基本根自然吗没有太大区别。只是建位不同而已。因此,以形码作为辅助码进行过滤,这些功能从思想上早就已经实现了。而超长的码表我们也可以直接从拼音字库中借鉴,应该说,自然码所需要具有的功能vimim基本都已经具备,只是需要一些整合而已。

Reply all
Reply to author
Forward
0 new messages