ddskk で交ぜ書き変換をしたい

Emacs Advent Calendar の20日目です。
Emacs Advent Calendar 自体は、下記 URL を参考として下さい。

前日は、id:buzztaiki さんでした。

さて、本日は、ddskk で交ぜ書き変換を使う elisp を書いたので、それを紹介したいと思います。
交ぜ書き変換とは、いわゆる漢直と呼ばれる日本語入力法で使われる変換方式の1つです。
私は、漢直にそこまで詳しいわけではないので、交ぜ書き変換の解説等間違いがありましたら教えて頂けると幸いです。


概要

SKK とは

ddskk とは SKK という日本語入力方式の Emacs における実装です。
以下の URL で開発がなされています。

簡単に説明すると、文節を人が決めて変換をする方式で「日本語」という語句を入力したいならば、
「Nihongo」と漢字変換したい文字列の先頭の文字を大文字で入力し、SPC で変換するという方式です。
これにより、機械が自動で文節を判断し変換するという事を行わないので、おかしな変換が減る等の利点があります。

交ぜ書き変換とは

通常の仮名漢字変換では、変換元となる文字列は、「ひらがな」や「数字」のみです。
それに対して、交ぜ書き変換は、変換元となる文字列に「漢字」が含まれる事を許容します。


例えば、よくある例ですが、「きしゃ」という語句を変換したい場合、通常の仮名漢字変換では、少なくとも3つは候補が考えられます。

  • 汽車
  • 貴社
  • 記者

交ぜ書き変換では、例えば、変換元となる文字列として、「汽しゃ」のような漢字混じりの文字列を許します。その場合の変換結果は、当然「汽車」となります。
このように、変換元となる文字列に「漢字」を交ぜる事で変換精度の向上を望めます。


この交ぜ書き変換では、漢字の直接入力を行う T-Code や TUT-Code の補助入力方式としてひろく使われています。
普通の IME では、漢字の直接入力ができないため、変換元となる文字列に漢字を含む事がないので、おそらくあまり使われる事はないのではないかと思います。

SKK で交ぜ書き変換

skk-mazegaki.el

SKK で交ぜ書き変換を行うために、以下の elisp を作ってみました。

この elisp を使うには、交ぜ書き変換用のエントリが登録された辞書が必要です。
これは、エントリ数は非常に少い(例えば、上の「きしゃ」の例は単語登録されていない…)ですが、SKK で用意されています。

自分でも SKK-JISYO.L 等から、交ぜ書き辞書を作成するスクリプトを作成してオリジナルの交ぜ書き辞書を作成したのですが、
スクリプトが整理できておらず、色々問題をはらんでいるため、そこらへんが解決できたら公開しようと思っています。
(12/27 追記) 公開しました: http://d.hatena.ne.jp/khiker/20101225/ddskk_mazegaki_dict


なお、ddskk のソースコード中 tut-code ディレクトリ以下に skk-mkmgk.el という交ぜ書き辞書を作る elisp がありますが、
古い存在しない SKK の関数を使っていたりと、現状動きません。
# それらを直したとしても、現在の SKK-JISYO.L の内容に適応できていないため、求めるレベルの辞書を作れないです…。

設定

skk-mazegkai.el を load-path の通ったディレクトリに起き、以下のコードを .emacs に追加すれば OK です。

(require 'skk-mazegaki)
(setq skk-rom-kana-rule-list
          (append skk-rom-kana-rule-list
                 '(("fj" nil skk-mazegaki-henkan))))
(setq skk-rule-tree
      (skk-compile-rule-list
       skk-rom-kana-base-rule-list skk-rom-kana-rule-list))

この場合、変換は、SKKskk-j-mode (日本語入力をするモード)で「fj」と押すと行えます。

概要

skk-mazegaki.el では、「確定してしまったけど、やっぱり変換したい語句」の変換を行います。
この確定済みの文字列を対象とする理由は、通常の SKK の入力では、漢字の直接入力ができないためです。
# skk-tutcode などを使えば別ですが…


例えば、「主きおくそうち」という単語の「ち」のあとにポイントがあったときに、変換(上記「設定」項でのキーバインドだと fj)を行うと、以下の単語が変換候補として現れます。

  • 主きおくそうち
  • きおくそうち
  • そうち
  • うち

これらの候補を「<」や「>」キーで選択し、SPC キーで実際に変換を開始します。
これらの候補を選択し、実際に SPC キーで変換した際の変換結果の例としては以下のようになります。

  • 主きおくそうち → 主記憶装置
  • きおくそうち → 記憶装置
  • そうち → 装置、送致 ...
  • うち → 内、打ち ...
  • ち → 血、地 ...

キーバインドをまとめると以下のようになります。

  • 候補の選択: < >
  • 変換: SPC
  • 中止: C-g

SPC で行う「変換」は、通常の ddskk の変換となります。


この skk-mazegaki は、以下の点で SKK の既存の似た機能よりも利点があると考えています。

  • 「通常の SKK の変換」
    • 語句を確定した後に変換ができない
      • skk-mazegaki は、語句を確定した後に変換ができる
  • skk-set-henkan-point 関数」
    • 自分で変換の開始位置を決めなければならない
      • skk-mazegaki は、変換の開始位置を推定する事ができるので、自分で変換の開始位置を決める必要がない
  • skk-backward-and-set-henkan-point 関数」
    • どこに変換の開始位置が飛ぶのか想像しづらい
      • skk-mazegaki は、オーバレイがかかるのでまだ分かり易い
    • 漢字混じりの語句を対象とはできない
      • 漢字混じりの語句が使っている SKK-JISYO にあれば、変換対象とできる

skk-mazegaki では、確定済みの文字列の再変換ができます。
そのため、漢字混じりの文字列の変換だけでなく、通常の SKK における日本語入力を行う際の補助的な入力として役立つかもしれないです。

その他

この skk-mazegaki.el は、Emacs 23 以上でしか動作しません。22 以下では、未確認ですが、変換の開始位置の推定機構がうまく動かないものと思われます。
その他、skk-mazegaki.el の頭の方のコメントに簡単に書いてありますので、御参照頂ければ幸いです。

まとめ

SKK で漢字混じりの変換をできるようにするために、skk-mazegaki.el という elisp を作ってみました。
まだできたてで、バグが多々あると思われますが、よろしければ遊んでみていただけると幸いです。
# 何かバグを発見したり、機能に要望があったならば、教えて頂けると嬉しいです。


ちなみに最終的な目標は、ddskk の tut-code 以下にあるような形で、SKK で T-Code 等の漢直をもっと便利に使えるようにする事だったりです。
# まだ私自身が漢直を使えなかったりと問題だらけですがw


なお、明日(というか今日orz)の Emacs Advent Calendar は、hitode909 さんです。お楽しみに。

その他

Emacs Advent Calendar の他に今回紹介した SKK を題材とした、SKK Advent Calendar という Advent Calendar も行われています。
これは、12/21 現在 4 名ほどの空きがあるので、SKK にさえかすっていれば内容は何でも問題ないので、よろしければ参加してみてくださいー。

参考

追記(12/27)

試しに操作風景を動画にとってみて、ニコニコにあげてみました。
エンコードをニコニコまかせにしたせいか、動画は、かなり汚いですが、ご容赦下さい。すみません。
撮影は、xvidcap を使って行いました。


更新時刻

  • 2010/12/21/01:25
  • 2010/12/27/21/30