は、負担を少なくしつつ可能な限り高速に打鍵できる運指を定義し、それをもとに遺伝的アルゴリズムによって探索することによって生まれた配列である。
らをすあつ ・゜りえお
まくしきる ゃな Sいゅ
のとはんこ ょうけ゛か
にちもっそ たてれーさ
・・、ぁ・ ・・・ぇぉ
・めへ。む やろ・ぃゆ
わねひみ・ よぅ・・ほ
・・・・・ ふせ・・ぬ
Scalaで書き直した改良版はこちら。各種配列を評価したデータもあり。
Google IMEのローマ字テーブルにこのローマ字定義ファイルをインポートする。
よい運指、いわゆるアルペジオを最大化すること、また打鍵時の認知的な問題を減らすこと、である。前者については、よい運指を定義し、それに基づいて評価関数を作成し、遺伝的アルゴリズムで探索することによって実現した。評価関数の詳細は後述の節を参照のこと。
よい運指の定義は、複数の指を用いて、一度押した指を離さずにほかの指で打鍵を続けることができるような打鍵列を多くすることである。そのような打鍵列を定義するさい、無理をしなければ同時に押せないような打鍵列も良運指としてある。これは、容易に打てる運指とそうでない運指の境界が曖昧であるため、上述の条件を満たす運指を取りこぼさないようにするため、またたとえ現実的に理想的に打つことができなくても、同指打鍵のようなここで最も悪いとした運指より悪いことはないと判断したためである。
認知的負担を減らすというのは、打つべき文字がどのような運指であるかを探すさいに混乱しないようにするということである。そのためにまず清濁同置を採用する。ある文字を探すさい、探すべき文字の数を少なくするためである。また、清濁同置は徹底する。パ行を打つさいには半濁点キーを使い、あ行とや行の小文字は同置とする。また、シフトキーを一つだけにするため、4段配列にする。シフトキーが複数ある場合、どれを打つべきかとっさに判断しにくくなるため。また、シフト操作する場合は後置操作する。筆者の体験として、前置シフト配列を後置シフトに変えたとき、文字とキーを対応付けるさいに必要な集中力が減ったため。
日本語から変換された打鍵列を評価するとき、打鍵列を以下のように構成されているとみなす。
| 打鍵列 | 一つ以上のアクション |
| アクション | 一つ以上のチャンク |
| チャンク | 一つのキー、または一つのアルペジオ |
| アルペジオ | 打鍵方向が一定で快適に打てる複数のキー |
| インターアクション | 隣り合ったアクションの累計打鍵列同士の直積の中で最も悪い打鍵列 |
なお、評価のための打鍵列は左右の手でわかれつ。たとえば、ある日本語文字列から変換されたfjdkという文字列があるとして、これはf dという打鍵列にわけ、それぞれ別に評価する。
ある打鍵列が複数のチャンクにわかれるための条件は、その打鍵列を打つさい打鍵方向が変わることである。たとえばasfdは、asf、dの2チャンクにわけられる。これがasdfであれば、打鍵方向が一定であり、かつ全体の文字列がアルペジオに含まれているため、1アルペジオからなる1チャンクである。交互打鍵もチャンクを区切る契機になる。fjdkは左手がf、dの2チャンク、右手がj、kの2チャンクである。
複数のアクションを区切るのは同指打鍵などの悪運指である。dferは、dfという一つのチャンクからなるアクション、同様にerというチャンクを持つアクションの二つにわけられる。
打鍵列を評価する場合、そこに含まれるすべてのチャンクに割り当てられたスコアを加算する。また、チャンク同士、アクション同士の関係性に応じてペナルティを加える。
チャンク同士の関係性は、ある一つのアクションにおいて評価される。一つのアクションの中にsd、a、fの三つのチャンクがある場合、まず最初の二つ、sdとaの関係性を調べる。二つの打鍵列の直積から、sa、da、という打鍵列を作る。この中でdaのスコアが最も悪いため、それに基づいてペナルティを加える。次に、すでに評価したチャンクの累計打鍵列sdaと、最後のチャンクfを調べる。そして直積sf、df、afから最も悪いafを選ぶ。
アクション同士の関係性も、同様にアクションの打鍵列同士の直積を作ることによって調べる。ただし、アクションの場合は隣り合ったもの同士だけを調べ、一つ以上離れたアクション同士を調べることはない。この操作で最も悪いものとして選ばれた打鍵列はインターアクションと呼ばれる。
なお、アクション同士の直積には必ず同指打鍵、またはアルペジオではない2打鍵が含まれ、チャンク同士の直積の場合は必ずアルペジオの2打鍵が含まれる。
以上の方法で、日本語の頻出の4gramを変換した打鍵列を評価する。なお、本プロラムで使用した4gramデータは、mentaiko氏が作成した1800字データである。 最適化計算によるかな配列『月見草』 月見草開発に用いた文章サンプル
あらかじめアルペジオを一覧化しておく。
まず左手と右手のキーをわけておく。それぞれの手ごとに、ありうるすべての2打鍵の組み合わせを作る。40キーの配列の場合、片手で210通り、両手で420通りになる。
(順列ではないことに注意。ここでは手間を省くためにある打鍵列とその逆順は同じスコアとみなす。dfとfd、sdfとfdsはそれぞれ区別しない。sdfとdfsのように構成キーが同じでも逆順の関係にないものは区別する。)
それらの中からアルペジオとそうでない組み合わせを選別し、2打鍵のアルペジオの一覧を作成する。また、すべての2打鍵列にスコアを割り当てる。それから、それぞれの手で3打鍵、4打鍵のありうるすべてのキーの順列を作る。それぞれの順列を2打鍵の組み合わせに分解する。(asdfであればas、ad、af、sd、sf、dfの6通り。)それらすべてが2打鍵のアルペジオに含まれており、かつ全体の打鍵列の打鍵方向が一定であれば、その順列をアルペジオとする。そのアルペジオのスコアを決めるには、構成要素の2打鍵アルペジオのうち、最もスコアの悪いものを打鍵列の要素数引く1の分(4打鍵アルペジオであれば3個。上述の例であればas、ad、af)選び、それらのスコアを足して7割にする。このようにすることで、2打鍵のアルペジオを選別する手間のみで、4打鍵までのすべてのアルペジオを見つけることができる。
一般的に配列の評価方法として以下のようなものがある。
- アルペジオの多さ
- 交互打鍵の多さ
- 弱い指を使う頻度の少なさ
- 運指距離の短さ
既存の配列はこれらを総合的に取り入れ、とくにアルペジオを重視する。なるべくアルペジオが多くなるようにし、増やしきれなくなったら交互打鍵を増やす、というの一般的である。
本評価方法は、アルペジオを最重視するという点では一般的な評価観と共通しているが、次善の打鍵をどのようなものとするかで異なっている。その違いが生まれる所以は、左右の打鍵が混ざるような打鍵列において、左右の手を独立に考えるかどうかにある。一般的な評価方法では、左右の手を独立に考えることはない。
たとえば、dkeiという打鍵列を考える。これはいわゆる交互打鍵であるため、一般的にはそれほど悪くないとされるだろう。しかし片手の打鍵だけに注目した場合、de、kiと、同指打鍵になっている。dkfjという打鍵列であれば、片手だけに注目したさいアルペジオになっているため、先の打鍵列より早く打てるだろう。本評価方法では、交互打鍵には打鍵を早くする効果はまったくないと考えており、それぞれの手の打鍵列が打ちやすいものかどうかだけを考える。交互打鍵が多くあるべきか少なくあるべきかではなく、配列を評価するうえで交互打鍵という概念がほとんど不要ということである。よって、交互打鍵率については一切評価しない。
運指距離の短さについては、早く打つためという目的のために考慮しているが、それほど重要視していない。また、負担を減らすためという目的はまったく考慮していない。一般的には、運指距離が長くなると疲れやすくなると考えられているが、本評価方法ではそのようなことはまったくないと考える。なぜなら、運指のさいの移動とはあるキーの上から別のキーの上までの指の移動ということであり、指はただ空を切っているだけなのだから、それで疲れるはずはないと思われるからである。
本評価方法において、疲労の原因のすべては片手の指の組み合わせによっていると考える。つまり、打ちやすいアルペジオが多いほど負担が少なくなるということになる。そのため、強い指を多く使う、特定のキーの頻度を多くする、といった評価のしかたはしない。ただし、負担の少ないアルペジオを高く評価することで、結果的に弱い指はあまり使わないようになっている。