例如,我看了你的帖子,越来越不明白自然码跟双拼的关系。你是使用自然码么?还是使用自然码风格的双拼?还是说自然码本身就包含拼音?如果你是自然码的高手,那么你需要先向我们普及一下这方面的知识,剩下的事情就好做了。
> 我很困惑, 似乎我在linux上遇到的双拼都对自然码和双拼支持的不好, fcitx很优秀,
> 可是它对自然码的支持缺陷甚是明显...
(注意上面的第二处修改跟当前主题没有关系, 那是前几天针对双拼添加的, 目的是解决双拼中的某些键序列与自然码不一致的情况)
然后我把我的自然码码表(vimim.nature.txt) 直接改名为 vimim.use_zrm_as_pinyin.txt .
再次打开vim, 就可以直接把 自然码 的词库文件 让vim当做拼音来解释了, 感觉挺好的! 看来vimim没必要把解释自然码的函数 和 解释
拼音的函数分开嘛! 当然, 当做拼音来解释并不总是完美的(这里就不说太多了)...
你这个给我的感觉是:自然码跟拼音一样,可以一次输入多个字的码然后拼接成词或者句?(对于五笔而言,词的规则与字的规则是不同的。)
如果是这样的话,修改起来可能容易。但是自然码跟全拼还是有区别的。因为目前所有的输入法都要求对全拼进行智能断字。而如果修改了编码,就无法正确断字,那么会出一些问题。
把自然码当作双拼行不行?这个我不清楚,因为双拼是个定长编码,每个字必须是两个码。而自然码不知道是否符合?
当然 i,u,v 的问题是个不足,因为这个对应的代码仅仅对智能ABC双拼方案适用(智能ABC双拼方案不使用 i,u,v
打头的拼音,而对于自然码双拼而言,空余出的三个字母不是 i,u,v 而是其他的三个字母。)。这个不足实际上我在目前的私云中才解决,而没有在
vimim 引擎中去测试。
hmm, 如果这里确实是 3934 行的话,你用的看起来并不是最新版本。
你可以重新检出一份版本。
svn checkout http://vimim.googlecode.com/svn/trunk/
至于前者,可以使用 pinyin_zrm 来代替 use_zrm_as_pinyin,这样与其他的命名更统一。
=====================================================
我想就我的了解 说说 全拼(仅针对使用自然码方案的双拼)、双拼 和自然码的区别。。。
+++++++++++++++++++++++++++++++++++++++++++++++++++++
##全拼##
**首先, 拼音有声母+韵母构成, 每个字都对应一个 声+韵 组合, 但是每个声韵组合都对应大量的字, 据此来说,全拼的一个缺点就是重
码太多, 仅靠韵母和声母这样区分度不大的组合 致使会在大量候选字中翻阅(不过好象有在声韵组合后加上一个数字代表音调的实现);
**全拼输入的另一个缺陷是需要频繁敲击键盘, 声母一般都是一个字母(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'(撇的声母)
... ...
好了, 不多说了, 我只是的拼音、双拼 和自然码做了简单的比较与评价. 要想了解自然码,请搜索网上的材料...
包括全拼中的韵母 在自然码中都使用那些字母代表, 还有自然码中辅码的一些细则, 都能在网上找到答案!
对于双拼,固定是两个字符一个字,但是如果加辅助码,那么有的字是两个字符,有的字是三个字符,输入六个字符的话,究竟是应该三三分认为是两个字,还是应该二二分认为是三个字呢?
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
>
....笔记本快没电了, 先提交了, 明天再来写!
关于你这个描述,我们可以知道:
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,
关于代码,请找 vimim google code project 的 owner。
具体代码我也整不太明白,目前我在里面搭了一个架子,有了这个架子vimim就可以调用外部的输入引擎,于是我就可以用外部引擎实现自己的输入法。如果需要,用外部引擎方案我可以整出若干空余时间实现自然码。
不过如果是说直接在 vimim.vim 中实现的话,目前要达到你说的样子还是有一定距离。主要是,那个脚本很多细节我也不太明白。
是这么个意思吧?
===================
回复:
===================
一个关键问题时, 不管是fcitx中的码表, 还是 vimim.nature.txt, 里面所有词条的键码没超过 4 个字母, 不知这是
自然码的本身规定, 还是词库的不健全... 如果在现有的码表文件下, 6字母按3个双拼就无法直接匹配了, 因为词库
中没有这样的词组, 应该优先用前4个匹配一个双字词语, 后两个字母当做双拼. 如果前4个不能组词或遍历完所有的
词语, 再按3个双拼处理. 7个字母先使用前4个匹配双字词, 后3个作为一个 声韵辅 组合.
词库中所有的词条单引号前面均没有超过3个字母, 所以你说的第5条是有限制的...
你说5个字母按4个字母加1个(词语)辅码处理, 这样很好, 我之前说的那个网站提供的自然码产品就有整词辅码的功能,
但是在现有的词库条件下, 恐怕实现起来有点困难, 我还没机会体验这个功能...
--------------------
不得不说的是, 虽然我认为自然码的设计思想已经很完美了, 但是我所使用的词库和码表中词条的编码规则让我感觉
很不合理... 里面的所有词条的编码仅限于4个字母(或字母加单引号)组成的序列, 这样表达能力会很低. 比如为了得到
’大家好‘, 输入 dajwhk ,候选项中肯定找不到 ’大家好‘ , 因为词库中没有这么长的键码映射! 只能先在候选项中得到
’大家‘ , 然后在发音为 hao 的众多单字中选择 ’好‘...
(其实输入’大家好‘的一个更好的方法是 djh' )
---------------------
如果输入工具能在不完全依赖词库的情况下, 通过智能分析, 把自然码的精华发挥得淋漓尽致, 那将是非常美妙的事情,
比如我之前一篇贴子中提到的对 整词辅码 支持的方案应该是可以实现的...
---------------------
其实你应该看出来了, 我把我在 自然码上的不爽体验的原因归结于输入平台的支持 和 码表文件的简陋.
我希望能够多了解一些基础性的东西, 以促进在linux系统下, 一个能够完美支持自然码并发挥其精髓的输入平台的诞生!
另外, 由于我没有用过专业的自然码输入系统, 自然码的细则方面我无从得知... 我所说的多是根据于 我的使用体验...
不过我认为把一些基本的规则按人性化的方式实现就很好了...
希望我能够为在linux平台下 完善自然码的实现, 推广自然码的使用 尽一份力!!!
这个问题容易解决,因为既然自然码就是双拼,我们可以直接使用搜狗的词库,那样想有几个字符就有几个字符。
> 你说5个字母按4个字母加1个(词语)辅码处理, 这样很好, 我之前说的那个网站提供的自然码产品就有整词辅码的功能,但是在现有的词库条件下, 恐怕实现起来有点困难, 我还没机会体验这个功能.
其实辅码按照单字过滤,很容易实现,只要建立一个辅码表就可以了,当然,我不知道怎么在 vimim
中实现它,但我可以先在本地云(pim-cloud.appspot.com)中实现,等 mxj
休假结束了,再让他看看。或者你自己研究一下现有代码。
现在的 vimim 双拼主要是基于智能 ABC
的,因为我只熟悉这个,其实从思想上来讲,智能ABC也是拼音加形码,基本根自然吗没有太大区别。只是建位不同而已。因此,以形码作为辅助码进行过滤,这些功能从思想上早就已经实现了。而超长的码表我们也可以直接从拼音字库中借鉴,应该说,自然码所需要具有的功能vimim基本都已经具备,只是需要一些整合而已。