キーボード配列の最適化は2連接のデータだけでいいのか?

キーボードの配列の良し悪しを判定するときに、2連続打鍵(2連接)の頻度と入力時間を使うのが一つのやり方だと思います。 これでいいのだろうかという疑問があったので、自分のタイピングデータを使って少し調べてみました。

キー配列の良し悪しはどう考える?

キー配列の最適化問題では、配列の良し悪しを考えることになる。客観的にやりたい場合には良し悪しの数値化が必要だ。最も単純な最適化は、頻度が高い順にホームポジションやそれに近い位置にキーを配置することだろう。

ただしタイピングしていると、キー位置の組み合わせによって速かったり遅かったりすることに気づく。たとえばqwerty配列でのceなどは同じ指で違うキーを打鍵するのであまり速く打てない。連続打鍵の入力速度もキー配列の良し悪しの尺度として取り入れたくなるわけである。

このことを考慮したやり方は2連続打鍵(2連接)の入力速度とその頻度を利用してキー配列を評価することである。欲張ると3連接、4連接なども評価に加えたくなる。でもそうすると、2連接と3連接をどういう重みづけで評価すればいいのかわからない。また、アルファベット26文字の3連接の組み合わせは17,576 通り。4連接だと…。これらすべての組み合わせに対してタイピングデータを取得するのはかなり困難だろう。

だから2連接だけで物事を考えたくなる。さて、このスコアリングはリーズナブルなのだろうか?もし3つ以上のn回連続打鍵の入力時間が、(n-1)回の2連接の入力時間の和と等しければ、2連接だけ考えれば良いはず。そこで2連接と3連接の入力時間の関係を調べてみた。

2連接と3連接の入力時間

2連接と3連接の入力時間は、自作のタイピングデータ解析アプリで取得した。

kgnwsknt-chef.hatenablog.com

データの大部分はMonkeytypeあるいは10fastfingers.comでの英語のタイピングテスト。またブログなどの日本語の文章を書いていた時のタイピングデータも含まれている。 2連接は1秒以内のアルファベットの連続入力、3連接は1.5秒以内のものと定義し、各組み合わせについて平均入力時間を求めた。ただし頻度の少ない組み合わせは除いた。このデータを入力時間でソートし、3連接と対応する2つの2連接の時間の和を比べたのが次の図。

3連接(3gram)と2連接(2gram)x2の入力時間の比較

横軸は入力文字の組み合わせを示してしている。わかりやすいように入力時間の短いもの、長いものだけをプロットすると次の図のようになる。

入力時間の短いものと長いもの

念のため、英語タイピングと日本語入力をそれぞれ見てみたのが次の図。

英語タイピングテストの入力時間

日本語文章の場合の入力時間

もしかしたら入力時間の短いいくつかの組み合わせは頻発しているミスタイプかもしれない。(oweとか、どういう言葉を入力しているときか思いつかない…)

これを見ると、3連接と2x2連接の入力時間は相関しているものの、3連接の入力時間の短い場合、長い場合は大きく異なる。これを見てしまうと、2連接のデータだけでキー配列を最適化するのは十分ではないような気がしてしまう。

眺めているといろいろ面白い。umuはすべて同じ指になるので遅いというのは予想通り。逆に使う指がすべて異なる3連接は速く打鍵できると思っていたが、必ずしもそうではないみたいだ。aerやaenは入力が遅い。これらは小指を使うからだろうか?遅い打鍵のパターンを眺めているとaが多い気がする。aキーを小指から別の指の位置に移動させるだけでも効果が大きいかもしれない。意外なのはoit。これは右薬指、右中指、左人差し指で打鍵するが、別に打ちづらい感じはしない。でもなんでかはわからないけれど、どうやら自分は苦手らしい。

最適なスコアリングとは?

2連接と3連接の比較を見ると、2連接のデータだけでは不十分だと思う。一番マシなスコアリングは、十分な長さの入力をスペース入力や長い時間入力が無いという条件で区切ってn連接の塊を作り、その塊の入力時間の和を用いることだと思う。つまり人間の思考時間を除いた打鍵時間。

この評価のやり方の問題は、次の点。

  • どうやって入力ミスを判定するか?
  • キー配列のスコアを計算するのに時間がかかる

入力ミスの判定はBackspaceの入力からある程度はわかるとして、問題は後者。qwerty配列Dvorak配列など、すでにあるキー配列の評価をするのは容易い。でも、適当なアルゴリズムを使ってスコアの最も良いキー配列を探索する場合には、スコアの計算速度は重要になる。

あとがき

ここでは入力時間を最小化するという方針で考えてきたが、入力ミスが少なくなるように、という考え方もあると思う。でもこれと入力時間の重みづけはどうするのが良いのだろう?考えれば考えるほどわからなくなっていく。キー配列、沼過ぎる…。

この記事は、自作したオリジナルキーボードunity69で書きました。