キー頻度のバラし方に関するメモ。

 完全に交互打鍵でこなせるキーに関しては、それぞれを二つのグループに分ける。

    右手   |     左手
          |     
  キーA     |    キーB  
            |          

 特定の3打鍵が連続する特定の二打鍵のみが高頻度で連続する場合は、連続するキーを同手同段に振り分ける。

    右手   |     左手
          |     
  キーA キーB  |    キーC  
          |     

 うーん……これはキーマトリックス……ではなくて、各キー同士の「近さ・遠さ」をカウントする方がいいのかも。
 同キー二打鍵はカウントする必要が無いし(カウントしても良いか)、打鍵順が逆のものはまとめてもいい(始めに打鍵される可能性が高いキーを小指寄りに配置するとか、そういう方法はありかも)。


 元の文字が【[Tab][Shift]hello [Shift]world.[Enter]】の場合は……
 

 ※空=Space(左右不明)、飛=左Tab、改=右Enter、右=右Shift、大=Shift(左右不明)
 ※[Tabのあと][Enter+文字の前]右小指シフトを叩くことが向きが決まっている場合は「右」に+1。
 ※シフトの向きが決まらない場合は「大」に+1。

  一打鍵目
  ABCDEFGHIJKLMNOPQRSTUVWXYZ,./;空飛改右大
二A                                    
打B                                    
鍵C                                    
目D           +1                        
 E       +1                            
 F                                    
 G                                    
 H                                 +1  
 I                                    
 J                                    
 K                                    
 L    +1      +1     +1                  
 M                                    
 N                                    
 O           +1          +1             
 P                                    
 Q                                    
 R              +1                     
 S                                    
 T                                    
 U                                    
 V                                    
 W                                  +1 
 X                                    
 Y                                    
 Z                                    
 ,                                    
 .   +1                                
 /                                    
 ;                                    
 空              +1                     
 飛                                    
 改                           +1        
 右                               +1    
 大                              +1     


 ……と、こういう35x35マスで集計してみるといいのかも……?
 プログラムが組めるかどうかは不明ですけれども、とりあえず。

良く考えてもみれば……

 jgawk などでプレ置換処理をすれば、集計そのものはそれ用に作られた morogram に任せてしまうこともできるのかも…。

  1. 「a-z」「A-Z」「 ,./;<>?+」(半角空白を含む)以外の文字を除去する。……手に負えないのでパス。
  2. 「A-Z」を、「Shift」を意味する符号[S]+小文字の「a-z」に置換する。
  3. 行頭に「Tab」を意味する符号[T]を付加する。
  4. 行末に「Enter」を意味する符号[E]を付加する。……処理方法が思い浮かばないので、今はパス。
  5. 「Tab」の後に続く「Shift」を意味する符号[S]を、「右Shift」を意味する符号に置換する。
  6. 行頭に「Shift」を意味する符号[S]がある場合、それを「Tab」を意味する符号[T]+「右Shift」を意味する符号[R]に置換する。
  7. 「<>?+」を、それぞれ「Shift」+「,./;」を意味する符号に置換する
  8. 「 」(半角空白)を、「_」(下線)に置換する。
  9. その後、この35文字を n=2 にして morogram に掛ける。


 ……って、ホントにこれでうまくいくのかなぁ。

とりあえず作ってみた。

 かなり手抜きなのは……いつものことなのでご容赦願いますorz

BEGIN{
}

/* MAIN */
{

	/* ここから、下記のテキストを変換試験済み。 */
	/* ABCDEFG HIJKLMN OPQRSTU VWXYZ */
	/* ↓ */
	/* SaSbScSdSeSfSg ShSiSjSkSlSmSn SoSpSqSrSsStSu SvSwSxSySz */

	gsub(/[S]/,"Ss");

	gsub(/[A]/,"Sa");
	gsub(/[B]/,"Sb");
	gsub(/[C]/,"Sc");
	gsub(/[D]/,"Sd");
	gsub(/[E]/,"Se");
	gsub(/[F]/,"Sf");
	gsub(/[G]/,"Sg");

	gsub(/[H]/,"Sh");
	gsub(/[I]/,"Si");
	gsub(/[J]/,"Sj");
	gsub(/[K]/,"Sk");
	gsub(/[L]/,"Sl");
	gsub(/[M]/,"Sm");
	gsub(/[N]/,"Sn");

	gsub(/[O]/,"So");
	gsub(/[P]/,"Sp");
	gsub(/[Q]/,"Sq");
	gsub(/[R]/,"Sr");
	gsub(/[T]/,"St");
	gsub(/[U]/,"Su");

	gsub(/[V]/,"Sv");
	gsub(/[W]/,"Sw");
	gsub(/[X]/,"Sx");
	gsub(/[Y]/,"Sy");
	gsub(/[Z]/,"Sz");

	/* ここまで、下記のテキストを変換試験済み。 */
	/* ABCDEFG HIJKLMN OPQRSTU VWXYZ */
	/* ↓ */
	/* SaSbScSdSeSfSg ShSiSjSkSlSmSn SoSpSqSrSsStSu SvSwSxSySz */

	/* ここから「<>?+」を、各々「Shift」+「,./;」に変換 */
	gsub(/[<]/,"S,");
	gsub(/[>]/,"S.");
	gsub(/[?]/,"S/");
	gsub(/[+]/,"S;");
	gsub(/[ ]/,"_");
	/* ここまで「<>?+」を、各々「Shift」+「,./;」に変換 */

	/* 行頭→「^」、行末→「$」 */

	gsub(/^[S]/,"TR");

	/* ここまで、テキストを変換試験済み。 */

	print $0
}

END{
}


 まず変換前のテキストを。

ABCDEFG HIJKLMN OPQRSTU VWXYZ
abcdefg hijklmn opqrstu vwxyz
,./;<>?+

 このスクリプトを通すと、次のように変換されます。

TRaSbScSdSeSfSg_ShSiSjSkSlSmSn_SoSpSqSrSsStSu_SvSwSxSySz
abcdefg_hijklmn_opqrstu_vwxyz
,./;
TR,S.S/S;

 [S]が前置されない行に関しては、先頭に[T]を付加することができませんでした……どうやるのかまったくわかりませんorz
 これをmorogramに通すと……って、それはまた後で。

実際にmorogramにかけてみると……

 大量に下記の文字列が混じってしまい、手作業で除去しようにも数が多すぎて大変でした。

1234567890-^\
!"#$%&'()^=~|
@:_[]
`*_{}

 これらの文字はスクリプトの段階で一つずつ除去しないとダメですね。
 他の文字化けに関してはまだ手作業除去できますけれども、さすがにこれらは予め除去しておきたいところで。

変更後のスクリプト

BEGIN{
}

/* MAIN */
{

	/* ここから、下記のテキストを変換試験済み。 */
	/* ABCDEFG HIJKLMN OPQRSTU VWXYZ */
	/* ↓ */
	/* SaSbScSdSeSfSg ShSiSjSkSlSmSn SoSpSqSrSsStSu SvSwSxSySz */

	gsub(/[S]/,"Ss");

	gsub(/[A]/,"Sa");
	gsub(/[B]/,"Sb");
	gsub(/[C]/,"Sc");
	gsub(/[D]/,"Sd");
	gsub(/[E]/,"Se");
	gsub(/[F]/,"Sf");
	gsub(/[G]/,"Sg");

	gsub(/[H]/,"Sh");
	gsub(/[I]/,"Si");
	gsub(/[J]/,"Sj");
	gsub(/[K]/,"Sk");
	gsub(/[L]/,"Sl");
	gsub(/[M]/,"Sm");
	gsub(/[N]/,"Sn");

	gsub(/[O]/,"So");
	gsub(/[P]/,"Sp");
	gsub(/[Q]/,"Sq");
	gsub(/[R]/,"Sr");
	gsub(/[T]/,"St");
	gsub(/[U]/,"Su");

	gsub(/[V]/,"Sv");
	gsub(/[W]/,"Sw");
	gsub(/[X]/,"Sx");
	gsub(/[Y]/,"Sy");
	gsub(/[Z]/,"Sz");

	/* ここまで、下記のテキストを変換試験済み。 */
	/* ABCDEFG HIJKLMN OPQRSTU VWXYZ */
	/* ↓ */
	/* SaSbScSdSeSfSg ShSiSjSkSlSmSn SoSpSqSrSsStSu SvSwSxSySz */

	/* ここから「<>?+」を、各々「Shift」+「,./;」に変換 */
	gsub(/[<]/,"S,");
	gsub(/[>]/,"S.");
	gsub(/[?]/,"S/");
	gsub(/[+]/,"S;");
	gsub(/[ ]/,"_");
	/* ここまで「<>?+」を、各々「Shift」+「,./;」に変換 */

	/* 行頭→「^」、行末→「$」 */

	gsub(/^[S]/,"TR");

	/* ここまで、テキストを変換試験済み。 */

	/* ここから、3段10列の外にあるキーで打てる文字を排除。 */

	gsub(/[0-9]/,"");
	gsub(/[-]/,"");
	gsub(/[!]/,"");
	gsub(/[\^]/,"");
	gsub(/[\\]/,"");
	gsub(/["]/,"");
	gsub(/[#]/,"");
	gsub(/[$]/,"");
	gsub(/[%]/,"");
	gsub(/[&]/,"");
	gsub(/[']/,"");
	gsub(/[(]/,"");
	gsub(/[)]/,"");
	gsub(/[=]/,"");
	gsub(/[~]/,"");
	gsub(/[|]/,"");
	gsub(/[@]/,"");
	gsub(/[:]/,"");
	gsub(/[/,"");
	gsub(/]/,"");
	gsub(/[`]/,"");
	gsub(/[*]/,"");
	gsub(/[{]/,"");
	gsub(/[}]/,"");

	/* ここまで、テキストを変換試験済み。 */

	print $0
}

END{
}

 で、次のテキストを通してみました。

ABCDEFG HIJKLMN OPQRSTU VWXYZ
abcdefg hijklmn opqrstu vwxyz
,./;<>?+

1234567890-^\
!"#$%&'()^=~|
@:_[]
`*_{}

 通した結果は次の通り。

TRaSbScSdSeSfSg_ShSiSjSkSlSmSn_SoSpSqSrSsStSu_SvSwSxSySz
abcdefg_hijklmn_opqrstu_vwxyz
,./;
TR,S.S/S;



_
_

 これでごみは減るかと……また試してみます。