Dvorak键盘布局下的中文输入(一)

2009-09-28 23:52:12
如果您还没有听说过Dvorak(德沃夏克)键盘布局,可以先从维基百科上了解一下相关背景:
http://zh.wikipedia.org/wiki/德沃夏克鍵盤

我是一个重度的Dvorak使用者,倘若给我一幅普通的Qwerty键盘,我只能盯着它,用两个手指“戳字”。我的相册中有一张图片,是我正在使用的Macbook,按键已经被我重新排了座次。

近来高密度打字的时候很多,例如上周听写的一段一个多小时的录音就有将近两万字,整个听写过程超过了五个小时。使用全拼打字的过程感觉就像骑调成了最低档位的山地车,干蹬不走,被人家的对话远远抛在了后头。

Google了一通,似乎目前最快最流行的速记方法称为“亚伟速录”,使用专门定制的键盘和输入法。尽管无法在电脑上模拟,但是其核心内容大概有三点可以吸取:

1. 根据中文习惯重新安排了键位,常用按键在中间一排。
2. 将多个字符组成的韵母安排在了固定的按键上,类似“双拼”,只用输入一个字符。
3. 如同使用乐器一般,多个按键可以同时按下。

Dvorak键盘布局下中文输入法的讨论几乎是个空白,我想在这一系列文章中对上面三点逐一分析,看看是否能够找到一些提高录入速度的办法。今天是第一部分,对Dvorak在中文输入的键位安排方面做一点研究。

在Dvorak键盘布局下,英文最常用的字母被安排到了手指最容易按到的地方。对这一点的研究已经很多,不用质疑。可是用来输入中文(拼音)的情况又是怎么样呢? 从前有人对汉字字符集做过统计,在Dvorak布局下,键盘的中排使用率要明显高于Qwerty,这也就意味着同输入英文一样,输入汉语拼音也能从该布局中受益,手指移动的距离更少。但是对字符集的统计毕竟代替不了实际情况,因为在实际输入中,各个汉字的使用频率不同,可能造成实际的使用结果与对字符集的统计存在差别。所以Dvorak的效率究竟如何,还要在实践中检验。 在下面这段Python代码中,我对自己以前撰写的几篇稿件进行了分析。这些稿件内容大多与IT相关,字数约为五、六万。 #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "ldx (lispython@gmail.com)" __date__ = "Sat Sep 26 08:02:00 2009" #from pinyin import hanzi2pinyin from hanzimap import hanzi2pinyin import collections import numpy as np import matplotlib.pyplot as plt doc = open('doc.txt', 'r').read() rst = hanzi2pinyin(doc.decode('utf8')) result = {} # print rst.count('iong') data = collections.defaultdict(int) all_keys = '\',.;abcdefghijklmnopqrstuvwxyz' dv_rows = ['\',.pyfgcrl', 'aoeuidhtns', 'qjkxbmwvz'] qw_rows = ['qwertyuiop', 'asdfghjkl', 'zxcvbnm,.'] for char in rst: if char in all_keys: data[char] += 1 data['letters'] += 1 for c in all_keys: result[c]=(float(data[c])/data['letters']*100) dv = [0,0,0] qw = [0,0,0] for i in range(3): for c in dv_rows[i]: dv[i] += result[c] for i in range(3): for c in qw_rows[i]: qw[i] += result[c] keys = result.keys() keys.sort() val = [result[key] for key in keys] plt.figure(1, figsize=(8,8)) ax = plt.axes([0.1, 0.1, 0.8, 0.8]) labels = ('up', 'middel', 'down') explode = (0.05, 0.05, 0.05) plt.pie(dv, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True) plt.title('Dvorak', bbox={'facecolor':'0.8', 'pad':5}) plt.figure(2, figsize=(8,8)) plt.pie(qw, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True) plt.title('Qwerty', bbox={'facecolor':'0.8', 'pad':5}) pos = np.arange(0, 60, 2) plt.figure(3) plt.barh(pos, val, 1.5, align='center', alpha = 0.8) plt.yticks(pos, keys) plt.xlabel('Percentage') plt.grid(True) plt.show() 对于这段代码有几点需要说明: 1. 将汉字转换为拼音使用了pyzh中的pinyin模块,但是该模块不能将中文标点转换为英文标点进行统计,因此我做了一点修改,将其命名为hanzimap。 2. 代码中使用了matplotlib库(同样也不在标准库中),将统计结果生成图像。 3. 中文文稿样本为doc.txt,使用utf-8编码,与代码放在同一目录下。文稿中的空白不会影响最后结果。 结果如下:
每个按键的使用频率
每个按键的使用频率
分别在Qwerty和Dvorak布局下,键盘的上、中、下三排使用情况对比。
我们可以看到(清晰一些的图片可以在我的相册中浏览)Qwerty布局中间一排的使用率为34.8%,甚至还不如上面一排。 Dvorak布局下,中排的使用率则达到了69%,几乎是Qwerty布局的两倍。稍微有点儿可惜的是处于上面一排的字母g,它的使用率很高,甚至高过了中排的许多字母,不过好在该字符位于右手食指上方,是除中排以外最容易触到的按键。


2009-09-29 13:05:46: BladeWang (万古无言对大荒)

  用Vim的话,键盘映射得重新设置或者适应一遍……

2009-09-29 14:15:40: lispython

  生命在于折腾嘛:)
  
  这个体会我很深,我在Emacs上的快捷键几乎就是全部推到重建。不过既然键盘布局的变化都能适应,这个障碍应该还小一些呢。
  
  我的做法不是映射以保持键位,或者单纯去适应新布局,而是把所有快捷键按照自己使用的频率大排序,然后将频率最高的按照传说中的人体工程学原理放在最称手的位置上。