かな入力とローマ字入力を定義する

前から少し考えていたことをかえでさんが実際にやってくださったので、じゃあAZIKとかな入力、はたまたローマ字入力の違いってなんなのよということをあらためて考えてみます。

なぜこういうことを考えるかというと、単純にかな入力(JISかなを含むかな入力系)とローマ字入力(拡張含む)を明確に区別できる定義を見たことが無いからです。タイプウェルをはじめとする多くのタイピングソフトでは、かな入力とローマ字入力で明確に区別している一方で、入力方式自体がかな入力とローマ字入力のどちらに分類されるのかを厳密に区別できないのが現状です。

そんなわけで、標準のかな入力、ローマ字入力以外の配列を分類するための日本語入力の定義を考えたいというのが今日のエントリです。大学の教科書を引っ張り出してきてあれこれやってますので、厳密な定義になってないぞとか、もっと良い定義の仕方があるぞとかツッコミ歓迎です。

キーボードによる日本語入力とは

追記定義を修正しました


任意のキーアクションを行い、任意の日本語文字列*1を出力するシステムを日本語入力とします。日本語入力のうちはじめに挙げたかな入力やローマ字入力のようにIMEを使うものを「変換あり入力」、IMEを使わないものを「変換なし入力」と分類することが可能ですが、ここでは両者あわせて定義できるようにできるだけ一般化して考えます。
入力としてキーアクション列を受け取って文字列を出力する関数imを定義します。

Keysをキーボードで押下可能なキー群、Σをすべての文字集合とすると、任意のキーアクション(キー情報+押し下げ、押し上げ)列に対して任意の文字列を出力する関数imを定義できます。
 im: K \times A \rightarrow S
 K = Keys^*
 A = \{\uparrow,\downarrow\}^*
 S = \Sigma^*
ここで、X^*とは集合X上のすべての系列からなる集合を表します。例えばX={a,b}であれば、X^*は{ε,a,b,aa,ab,ba,bb,aaa,...}を表しています。
(ちなみに、imの入力であるk \in Ka \in Aは同じ長さの系列でなければならないのですが、なんと表記すればいいのかわかりませんorz)

以上の定義を使うと、任意のK \times A \rightarrow Sの組み合わせを日本語入力配列と定義できます。例えばローマ字入力であれば以下のようなパターンを組み合わせることで定義できます。

  • im(ka, ↓↓) -> か
  • im(tta, ↓↓↓) -> った

これを使うと漢直なども含め多くの日本語入力配列を定義可能なはずですが、例外的にアプリケーション側で時間情報を使って入力と出力を定義するようなもの(姫踊子草ややまぶきにおける親指シフトの扱い)は上記定義に含めることができません。入力に時間も含めれば可能ですが複雑になりますので、ここでは除外します。

変換あり入力と変換なし入力

日本語入力のうち変換あり入力と変換なし入力の違いは、Σの違いであると言えます。変換あり入力はかなや英数字しか含んでいないのに対して、変換なし入力はΣに漢字等も含みます。

かな入力とローマ字入力の違い

では、変換あり入力に含まれるかな入力とローマ字入力の違いはどのように定義できるでしょうか。ここでは変換あり入力は必ずかな入力かローマ字入力に分類されるものとします。ここでは3つの方法で両者を分類してみましょう。

出力文字列長の違い

おそらくもっとも簡単なのは出力の文字列集合Sから考えることです。一般にかな入力と呼ばれているものは出力s \in Sはほぼすべて1文字です。一方でローマ字入力は「sya:しゃ」などのように2文字以上の文字列の出力が定義されています。すべての出力sが1文字に限定されているものをかな入力、そうでないものをローマ字入力と定義することが可能です。

この定義ではAZIKローマ字入力に含まれます。ただし、下駄配列や姫踊子草配列のように同時打鍵で複数文字列を出力するようなかな系配列も存在します。

状態数の違い

K \times A \rightarrow Sの組み合わせが日本語入力配列であると前述しましたが、これは表現する方法はいくつか存在しており、その中の一つにオートマトンによる表現が可能です。例えばローマ字入力の定義は以下のような入力と状態の遷移で表現できます。入力が行われるとそのキーに合致した矢印に沿って進み、二重丸に到達すると文字列を出力します。この丸のことを状態と呼びます。

ちなみにJISかなのオートマトンは以下のような形になります。

ご覧のとおり、かな系でよく使われている「面」(シフトを押さない面、シフトを押した面など)という概念はここでいう「状態」に相当します。

JISかなの状態数2に対して、ローマ字入力は優に10を超えます。では、状態数が3以上のものをローマ字入力と定義するかというとそうはいきません。例えば飛鳥配列では{シフトなし、左親指、右親指}と状態が3になります。では4以上が…と言っていくとどこまでかな入力とみなすかは曖昧になり、単に状態数が違うというだけになります。

かえでさんがAZIKをかな入力としてみなすことができると考えられたのは、おそらくこのように状態(面)で考えることでかな入力との境界が曖昧になるという観点からだと思います。

標準かな入力・標準ローマ字入力との近似性

もう一つ考えてみましょう。標準かな入力を「JIS X 6002-1980で規定される入力方式」、標準ローマ字入力を「JIS X 4063:2000で規定されていた入力方式」とし、この中で定義されるK \times A \rightarrow Sにより近いものをかな入力、あるいはローマ字入力と定義することができます。
この定義ではAZIKローマ字入力に含まれますが、その他のかな入力系と言われるものの立場が怪しくなります。



以上のようにいくつかの方法で分類することが可能ですが、どの分類も一長一短で既存の「かな系」「ローマ字系」と言われるものを万人が納得する形で分類することは難しいです。僕自身はAZIKがかな入力でもローマ字入力でもどうでも良くて、少なくともタイパーにとっては全部「日本語入力配列」でいいんじゃないの?とすら思っているので、こういう結論で一旦閉めます。


追記
Kはすべて順序付きのキー列なので同時押し*2をすっきり表現できませんが、順序付きであるかのように定義するか、あるいはここでは定義不可能としておきます。

ついでに、Aで定義しているアクションが実はあんまり役に立たない気がしてきた。。シフトなどの状態を表現するのに使えるかなと思って加えたけどちょっと微妙。要検討。

*1:ひらがな、カタカナ、漢字などです

*2:親指シフトは基本的にシフトを先に押す形になると思うので、同時押しではないと考えます