15KB
公開: 更新:

KLAスコアの最適化

キーボード配列界隈にはKeyboard Layout Analyzerというのがある。
https://patorjk.com/keyboard-layout-analyzer/#/main
最近使われているのはこちらのフォークのよう。(今回これを使っていく。)
https://stevep99.github.io/keyboard-layout-analyzer/#/main

正直ここの評価関数には難があるのだけれど、それはそれとして、これのスコアを高めようという話がある。

またKLAスコア弄りをやっていました(小川謙三の毒にも薬にもならない話)
新しいローマ字用論理配列「ににか配列」 (agile_honest5737 )
【配列】KLA最大値問題って数学的に解ける?(大岡俊彦の作品置き場)

日本では大西氏が作成したjap-n.txtを用いて評価されていることが多いようであるので、ここでもそれに従う。
このノート ローマ字入力に最適なキー配列を考える(比較編)(大西拓磨 )にGoogleDriveの共有リンクが存在するようである。

100pt – 完全なハック

KLAでは見つからない文字はエラーで除外して採点する。また、typeKey()関数の前の方に

if (
    (shiftInfo.fingerUsed &&
     shiftInfo.fingerUsed === altGrInfo.fingerUsed) ||
    shiftInfo.fingerUsed === keyInfo.fingerUsed ||
    altGrInfo.fingerUsed === keyInfo.fingerUsed
) {
    errors.push(
        "Keyboard configuration error: Same finger used to type shift, altgr or " +
        String.fromCharCode(keyInfo.charCode)
    );
    console.log("Exiting typeKey due to errors.");
    return errors;
}

という実装があり、typeKey()の呼び出し側はこのエラーを受け取らないため、1文字だけ適当なところに置き、残りのすべての文字をここでエラーを吐くように設定すれば、100ptを取ることができる。
kla_jp_100_ascii_skip.qwerfj

コメント:実際に入力することはできないので終わっている。

99.52pt – 実現可能な範囲でのハック

KLAは修飾キーの扱いがあまりにも軽いので、これをハックする。
まず、ホームキーのみを利用するようにして、distanceで50pt(-0pt), Consecutive Fingerで30pt(-0pt)を確保する。
その上で、Finger Usageは平均でどれくらい弱い指を使っているかなので、修飾キーでコスト1のキーを押しまくれば相対的に薬指などのコストが重いキーの割合が減ってスコアが上がりまくる。と言うことで、そう言う方針で適当に割り当てるとほぼほぼコストを1にできるので、19.52pt(-0.48pt)とかいう壊れたスコアを出せる。
KLAJP_R4_ANSI_QuadLayer.qwerfj

コメント:1.9打/文字なので終わってる。

84.14pt – 両側altに文字を割り当て

コーパス的にスペースの使用頻度がとても少ないので、両側の親指にスペースだけ押させるのはあまりにも勿体無い。ということで、標準ANSIの範囲内で悪さをするために、両側のaltに文字を入れる。
最初膨大すぎるので、指ごとのコストを計算する。(なんとKLAは同指連続でしか距離とか考えず、他の指は毎回ホームポジションに戻るので)指ごとのコストは、3キー担当の指で26C0…3、人差し指でも26C0…6とかなので、そこまで大きくはない。(となると30^6として10^12程度のオーダーしかない。)あとはまたスコア低すぎるの刈りつつ組み合わせできるのを見つけていけば良いはず。

` 1 2 3 4 5  6 7 8 9 0 L =
  Q F C D G  ; H , Y .
  S U O T Z  P K N E R
  X / · W ·  B M - J V
      I  Space  A

KLAJP_R10_ANSI_AltThumbs_Top3_GlobalOpt(1).qwerfj

コメント:日本語入力では変換でスペース多用するので終わってる。そもそも親指でAとか打ちたくない。

81.33pt – 片側altのみに文字割り当て

同じですね〜ただし片側altなら実用的と考える人がいてもおかしくありません。

` 1 2 3 4 5  6 7 8 9 0 ; =
  Q L . H G  F R M , J
  E I O T P  Z K N U S
  C X - W V  B D Y / ·
         Space  A

KLAJP_R10_ANSI_OneThumb_GlobalOpt.qwerfj

コメント:私は親指に文字入力を割り当てている配列を絶対使いません。

72.42pt – 英字のみ入れ替え

英字のみに絞ると、かなり制限ができて、スコアを高める上でありえない配置を結構刈れる。刈り方が間違っていなければ、72.42ptが最大だった。
こんな低い気はしないので、これは何か間違っていてもおかしくない。
これについても特にいうことないけれど、結構意外な配置ではあった。

X Y F H M   Z S R Q E
U I A T B   J K N O ;
C V L G P   W D , . /

KLAJP_R8_Letters26_GlobalOpt.qwerfj
でも特に言うことないですね。人差し指にたくさんキー渡して中指薬指で頻度高いキー使わせてる。

コメント:これくらい制約入れればまともなのが出る。ただし、記号は入れ替えたほうが良さそうなので、もう一度条件変えて最適化する。

76.87pt – 英字+11記号のみ入れ替え

英字のみが刈れるなら記号含めても刈れるだろうと言うことで。

` 1 2 3 4 5  6 7 8 9 0  ; =
  F L Q R H  Z S . , Y  [ ] \
  U I A K W  B T O N E  '
  V X C M P  G D - / J

KLAJP_R7_NonDigit37_GlobalOpt.qwerfj

これで76.87pt取れます。;とか退かせるのが熱いですね。メインのキーは記号の移動に合わせて多少移動していたりしていなかったり。そもそも英語で;をよく使うからホームポジションに置いているわけで、日本語入力なら日本語入力で使う記号やら文字を配置すべきで、英字のみの入れ替えってなんだかなって感じ。

コメント:飽きた。

最後に

KLAの総合スコアを最適化しても、大した配列は作れません。評価関数もコーパスも現実から乖離があるからです。ただし、きちんとガードすれば一定レベルの配列は作ることができます。(英字+11記号の入替の最適解などは罰ゲームで使えと言われたら使えなくはない。新下駄が楽すぎて使うことないけど。)
また、今回は総合スコアだけの最適化を行いましたが、結局細かいパラメーターを調整しないと使いやすい配列はまだ作ることはできなくて、それが配列の味になると思います。今回はハックできてしまうせいで考えられませんでしたが、シフトも考慮できればもっと面白い配列が作れるでしょう。

あとAIが賢すぎて私がいなくてもほぼできてしまう。やばすぎ。