情報処理学会, 文書処理とヒューマンインタフェース研究会, 13 - 2, 1987
TAO/ELISで稼働中のEmacsライクな画面エディタZenに日本語入力法Kanzenを実装した. Kanzenの特徴は,
現在, TAO/ELISシステムで実用に供されている.
Kanzen is a Japanese editor embedded in an Emacs compatible editor Zen implemented on the TAO/ELIS list processing system. The characteristics of kanzen are:
1. Kanzen の設計思想
2. Kanzen の仕様
3. Zen エディタへの Kanzen の組込み
4. Kanzen のかな漢字変換部
5. 評価
文献
付録
Kanzen は TAO/ELIS 上の Emacs コンパティブルエディタ Zen (Zeroth Editor for NUE) の上で動く日本語入力・編集システムの一つである. Kanzen の設計思想は [1, 2] に述べたが, ここで簡単にまとめておく.
Kanzen はローマ字入力か, 新 JIS キーボードでのかな入力で使用することが可能である. 以下の説明はローマ字入力を基本に行なう. かな入力については異なる点を 2.4 で述べる.
以下の説明では Emacs の知識を仮定する. (Emacs は, GNU Emacs または TOPS-20 上の Emacs を標準とする. オーバーフローした行を折り返して表示できないタイプのEmacsではKanzenが目指しているような WysiWyg の実現は難しい.) 以下, "M-" は Meta コマンド, "^" はコントロールコマンドを表わす.
Kanzen に関する Zen のモードは次のような入れ子構造になっている.
(このほか, 原綴り入力, 全角文字入力というやや特殊なモードがある)
ここで上向きのモード変化は飛び越しが可能である (たとえば, 日本語・カタカナ入力のモードで ^C を打つと Kanzen の ASCII モードへ直接移行する). Kanzen の中で, ASCII, 日本語・ひらがな, 日本語・カタカナなどのモードの区別はカーソルの形 (または色) で表示される (注視点でのモード表示).
Kanzen モードでは, テキストバッファ内に「下線部」と「反転部」がおのおの 0 個ないし 1 個存在する. 下線部はかな漢字変換の開始位置を表わし, 反転部は変換中の文字列を表わす. これらが画面上に見えている場合 (そうであることが大半であろうが), 下線部ではその文字に下線がつき, 反転部では変換中の文字列が実際に白黒反転して表示される.
下線部で始まる文字列を構文解析して別の文字列 (通常の場合漢字で始まる) に変換することを「変換起動」と呼ぶ. 構文解析の対象となる文字列は, 下線部から始まり, 現在のカーソル位置, またはひらがな ・ 数字 ・ アルファベット以外の文字の直前で下線部に近いほうまでである. 変換起動の際, 別の場所にすでに反転部があればその文字列は「確定」し, 普通の表示に戻る.
反転部はいつでも変換のやり直しが可能である. 次候補を選択するときは, ^H (backspace), 前候補を選択するときは ^G (bell) を押す. 反転部は ^J (linefeed) または次の変換起動で確定する. 反転部にカーソルが入ったとき (delete で後ろから消しに入ったときも同様), 反転部は直ちに確定する.
変換は次のコマンドによって起動される (ただし, 日本語モードのときのみ).
Kanzen モードでは, native モードと, ^J (linefeed), ^H (backspace), ^G (bell) および ^C の意味が異なるだけであとのコマンドの意味はまったく同一である. これは, Kanzen が Emacs コマンド体系と非常によい整合性をもっていることを示している. なお, ^J はプログラム編集モードにおいては「改行 + インデント」で return + tab によって容易に代用可能であること, ^H は通常 Emacs では文字削除の意味に使わないこと, ^G は一般のキャンセルコマンドで Kanzen モードでもかな漢字変換の一種のキャンセル (前候補選択) に拡張されただけであること, ^C はもともと Emacs のコマンドでないことに注意されたい. なお, Zen では文字を ^D や delete で消しすぎた場合, ^delete で元に戻すことが可能である (これは漢字を消しすぎたときに便利).
Kanzen には変換中とか入力中というモードがない. 変換中というのは反転部に固有の性質であって, エディタ全体のモードとは関係がない. だから, すべての Emacs コマンドはいつでもどこでも有効である.
日本語モードでは次のコマンドが追加されている. これらは変換を起動し, 自己挿入し, 自分自身が下線部になり, 変換の様相を示すマーカとして機能する.
外来語の入力は, 上記の # だけでなく, 原語の綴りを大文字で打ち始めてもよい. たとえば, 「Program」はローマ字かな変換で, 「Pろgらm」とされたあと, 構文解析により「プログラム」へ変換される.
新 JIS キーボードを使った入力では, 大文字入力が不可能なので, 下線部は事前に別のキーを叩く必要がある. このキーをどれにするかはカスタム化可能である. 原語の綴りによる外来語の入力は # を使う方法のみ可能である. なお, Unique mapping の原則により, JIS キーボードを使った場合でも, 全角英数字などの入力は上記の @ コマンドを使わなければならない.
Emacs に特有のインクリメンタル・サーチは, Kanzen ではサーチ用のエコーバッファで確定したものから順にインクリメンタルに捜すという形で実現する. だから, ひらがな確定で打ち進めれば, 1 字ずつインクリメンタル・サーチが行なわれる. もちろんサーチ用のエコーバッファは主バッファとは異なるバッファであるから, 独自の下線部と反転部をもつ. しかし, インクリメンタル・サーチに入った瞬間のモード (ASCII または日本語) は主バッファと同じである.
陽に単語を辞書登録するには, 登録する単語を region で囲み, M-X jregister-word コマンドのあと, 読みを入れればよい. (コマンドコンプリーションの機能があるので, コマンドは単に M-X jr< blank> と打てばよい.) 動詞の登録は, 活用分類をユーザが意識しなくてもよいようにするため 「修羅場らない」のように動詞の否定形を入れて行なう. このほか, バッチ的に辞書登録を行なうことも可能である.
Zen は, TAO/ELIS の主エディタでその機能はほぼ Emacs に沿っている. Zen は TAO のオブジェクト指向の機構を利用して書かれている. Kanzen の組込みにあたっては, 漢字を扱う部分をクラスにまとめ, Zen における漢字利用の統一化を図った. また Zen はその入出力機構, 画面表示機構などを他のプログラムから部品として利用することも目指している. 部品としての Zen でも Kanzen は利用でき, TAO/ELIS システム全体にわたった標準的な漢字利用法を提供することができる.
Kanzen を組込むにあたって次のことを考慮した.
Zen のテキスト編集コマンドと漢字利用を融合するには, 次のようなことを考慮しなければならない.
このようにテキスト編集と漢字入力の動作は独立である. これらの問題に対処するには, 変換のための特別な領域を使わず, 常に実際に入力され, バッファに挿入されている文字列から情報を得なければならない. すなわち情報を文字自体にもたせなければならない. さらに, 反転部, 下線部が移動したときは, これらをバッファ中から探す必要がある. また漢字変換の範囲も下線部を起点として変換起動時に決定する.
Kanzen では TAO のフォントつき文字列 (fatstr) を使用してバッファ内の文字に 3 bit の情報をつけている. fatstr には文字ごとに 7 bit のフォント情報を付加することができる. 反転, 下線は Kanzen の表示とも対応している.
フォントの使い方
これらのフォント情報により native モード, ASCII モードで入力されたプログラムコードとして入力された部分が変換されるといったことがなくなる. 反転部, 下線部は別に位置も記憶しており, 位置が移動したときのみバッファを探索するが, ELIS は文字列の処理をすべてマイクロプログラムで記述してあるので高速に捜し出すことができる.
漢字コードは ATT Unix 方式のコードを使っている. これは JIS 漢字コードの各バイトの MSB を 1 にするもので, 文字列中にエスケープ文字列などの見えない文字はない. これも文字自体に情報をもたせていると言えるし, WysiWyg の原則に沿っている. ただし半角のカタカナは使用できない.
利用者によるカスタム化のために, バッファごとにローマ字かな変換テーブル, コマンドディスパッチテーブルなどをもっている. コマンドテーブルは入力文字ごとに起動するコマンドを設定することができる. また入力文字の属性として文字ごとに 5 bit の情報を付与し共通の処理を制御している. これらのテーブルは Zen の起動時に利用者の設定ファイルに従って作成されるが, 利用者はローマ字かな変換のリストを変更したいものだけ設定すればよい. 文字属性を次に示す.
文字属性
Kanzen の動作中, キーを一つ入力した場合の処理の概略を示す. 以下の処理を順に行なう.
テキスト編集コマンド (Control キー, Meta キーによるコマンド) の実行では漢字変換に関わる処理は行なわれない. 日本語入力の処理はすべて日本語処理の起動文字が入力されて初めて動作し, 通常の編集を行なっている時にその準備をしてはいない.
漢字変換は, 変換起動ルーティンでかなを切り出して変換処理に渡し, その結果をバッファに挿入する. エディタと変換ルーティンとの切り口は辞書の頻度更新などを含めて 5 ヵ所である.
Kanzen を組込むにあたっての Zen 本体の主な変更個所を示す.
このうち本質的なものは反転部へカーソルが入った時の処理である. これは通常のテキスト編集に関わる. その他の変更はすべて付加的処理である. Zen ではカーソルの再表示を行なう処理のなかで反転部に入ったことを調べ, 確定処理を行なっている.
Kanzen の仕様は比較的単純であるが, Zen との親和性を重視し, テキスト編集機能と日本語入力機能の独立と両立を図っている. このため文字自体に種々の情報をもたせ, 日本語のための処理は実際に見えているバッファに基づいて動作する. TAO/ELIS では基本データである fatstr が利用できたが, 文字に情報をつけることができないシステムでは, バッファの構造から構築する必要がある. 先決めで漢字変換開始を指定し, 下線, 反転でそれを表示して日本語を入力していく部分は比較的簡単に実現できると思われる. しかし, Zen のテキスト編集機能がいつでも利用できることが Kanzen の使いやすさを高めている. 他のエディタに実装する場合, この親和性にもっとも注意を要するだろう.
単語辞書は, ユーザ共通のディスク単語辞書と基本単語辞書, そして, ユーザ毎のユーザ辞書の 3 階層で構成される.
一般化 競争下 情熱家 数学科 総務課さらに, 単漢字変換で入力された未登録単語も自動的に学習されるので, その後は単語の読みを入力すればよく, 入力の手間が軽減できる. ただし, これらの学習された単語は, 一定の期間使われないと自動的に忘れさられる.
この他に,かな漢字変換のために, 接辞や助詞, 助動詞の入った付属語辞書と, 単漢字変換のための漢字辞書がある.
Kanzen では, 変換対象文字列の先頭の 1 文節が変換対象になるが, その後に漢字に変換されない文節が存在する場合があるために, 単なる単文節の変換にはない問題が生じる.
| [例] | (正解) | (誤り) |
| 彼ははだし ⇒ | 枯葉派だし |
対処: この多くの場合は, 自立語に接辞がついて 1 つの文節を構成することが多いので, 変換対象文字列が 2 文節以上を含んでいる時の解析を続けて行なう.
| [例] | (正解) | (誤り) |
| 人はよく ⇒ | 一葉よく | |
| 長すぎる ⇒ | 流すぎる |
対処: 変換対象文字列が 2 文節以上を含んでいる場合は, 第 1 文節の成立条件として, その後に第 2 文節が成立するかの簡単なチェックを行なう.
| [例] | コンパクト 化する |
| ABC 法の |
対処: 変換対象文字列以外に, その前後の文字も付加情報として構文解析部に渡し, この付加情報を用いて, 接尾語で始まる可能性があるものとして解析をする.
変換は, 4.3.1 を考慮した上で, 次の 2 段階で行なう.

図1. 「くるまではしらなかった」の解析グラフの例

図2. 仮想ノード {しらなかった}, {はしらなかった} を補間した例
以上の方法は, 基本的には連文節の解析法と共通している. 違いは, Kanzen の場合は, 文法規則について文節と文節の間の接続条件を不可にしている点と, 単語辞書の検索を先頭単語のみについて行なう点, 解析グラフで仮想ノードの補完をする点, の 3 点である.
Kanzen は設計以来約半年間, 実用に供しながら評価・改良を行なってきた. 現在ほぼ完成の域に達しており, あとは使っていて発見される細かい改良を残すのみになっている. Kanzen の評価として強調したいのは, Kanzen の設計方針がその通り実現されているということのほかに, かな漢字変換が高速なことである. 実際, 1 回の変換・再表示に要する時間は大体 100 ミリ秒のオーダで, ELIS の 1 プロセス当たりの連続走行割当時間とほぼ一致している. 人間の反射神経にとって遅れを感じさせない時間の限界は約 50 ミリ秒と言われているが, ほぼこの限界に近づいていると言ってよいと思われる.
使いやすさについては慣れと趣味が絡むので主観的な評価しかできないが, 筆者らはもうほかの日本語ワープロにまったく興味が湧かないところまで来ている. 特に編集のしやすさと快適さは他のワープロに対して群を抜いている感がある. しかし, より一般的な評価はユーザに委ねるほかはないだろう.
[謝辞] 本論文を印刷するのに使った JTeX を提供していただいた斉藤康己, 磯崎秀樹の両氏に感謝する.
[文献]
[付録] Kanzenの動作例: 左側が入力したキー, 右側が画面の表示である.
赤文字部分は画面上では白黒反転して表示される.
M-J の入力をここでは [M-J] と書く.
カーソル位置は で示す.
| Ky | Ky |
| o | きょ [ローマ字かな変換が起こる] |
| uW | 今日 [変換起動]W |
| atasiha | 今日わたしは |
| Is | 今日渡しはいs [誤変換に気がつく] |
| ^H | 今日私はいs [次候補選択] |
| hani | 今日私はいしゃに |
| Iku. | 今日私は医者に行く. |
| KyouWatashihaIshaniIku. | 今日私は医者に行く. [文節区切りは入力時に解決済み] |
| KyouWatashiHaishaniIku. | 今日私歯医者に行く. |
| Yomerukadoukahadoudemoiinoja. |
読めるかどうかはどうでもいいのじゃ. |
| [決して, 読める華道科は銅でも飯野蛇. にはならない] | |
| KumitoriwoOnegaisimasu. | 汲み取りをお願いします. |
| sudeni | すでに |
| * | すでに* [カタカナモード] |
| k | すでにk* |
| a | すでにカ* |
| takana | すでにカタカナ* |
| Mode | すでにカタカナもで [外来語] |
| ninatteiru | すでにカタカナもでになっている |
| Baai, | すでにカタカナモードになっている場合, |
| JuuzokuHensuu^Qxto^Qywo, | 従属変数xとyを, [^Qはエスケープ文字] |
| 1887 | 1887 |
| Nenninha |
1887ねんには [構文解析の便のため, 下線が左へシフト] |
| Rekisit | 1887年にはれきしt |
| #250 | #250 |
| Ma'e'noYosan | 二百五十万円のよさn |
| @OokiiKoumyou^J | 大光明 [人名, 「おおみや」と読む. |
| 大文字にするのを | |
| [M-J] | 大文字にするのを忘れたことに |
| [M-C] ^F ^F ^F | ぜんぶ |
| [M-C] ^F ^F ^F ^F | 全部こもじで |
| [M-J] | 全部こもじで打ちました |
| ^J | 全部小文字で打ちました |