Ubuntu Weekly Recipe

第175回SKKで快適な日本語入力を体験しよう

Ubuntuの日本語入力には、インプットメソッドにIBus、かな漢字変換にAnthyが採用されています。また最近人気のMozcもUniverseリポジトリから簡単にインストールできるようになっていますので、利用されているユーザも多いのではないでしょうか。

しかし今週のレシピはそんな時流に逆らって、Emacs上で快適な日本語入力を実現するSKKを紹介します。

SKKとは

SKKはSimple Kana to Kanji conversion programの略で、Emacs上で動作する日本語インプットメソッドです。Elispによって実装されているためEmacsが動くなら、UbuntuでもWindowsでもMacでも、はたまた他のOSであっても同じ日本語入力環境を構築することができます。

SKKの最大の特徴であり、他のインプットメソッドと大きく異なる部分が、プログラムによる形態素解析を行なわないところです。一般的なインプットメソッドでは、入力された文章を自動で形態素解析し、品詞を特定し、部分ごとに変換を行ないます。しかしどんなにプログラムの精度を上げても「解析ミス」をゼロにすることはできません。これは有名な例文「ここではきものをぬいでください」を、入力者の意図通りに変換することが不可能なことからも解ります。そこでSKKは「漢字と送り仮名の区切りをユーザが手動で指定する」という方法で、解析ミスを無くしています。プログラムの解析ミスがそもそもあり得ないため、変換時に文節区切りを指定しなおすなどという二度手間とは無縁です。仮にミスしたとしてもそれは入力した自分の責任ですので、⁠他人のせいにできないので)イライラが軽減されるというメリットもあるかもしれません。

また入力中にシームレスな辞書登録や登録削除が行なえるため、辞書にない単語をその場で登録し、その直後から変換可能にできるのも便利な特徴です。これはSKKは品詞を区別しないため、単語と読みの対応のみで辞書を形成でき、辞書登録のコストを低く抑えられるからこそできる特徴です[1]⁠。

EmacsでSKKを使う

ddskkのインストール

本家のSKKは既に開発が終了しており、現在はSKK Openlabが開発しているDaredevil SKK(ddskk)を使用するのが一般的でしょう。Ubuntuでのパッケージ名はddskkです。ssdkkをインストールすると依存関係により、後述する辞書サーバであるdbskkd-cdb[2]や、cdbフォーマットのSKK辞書であるskkdic-cdbパッケージも同時にインストールされます。

Emacsとddskkのインストール
$ sudo apt-get install emacs ddskk

ddskkで日本語入力

Ubuntuのパッケージからインストールした場合は、特に設定を行なわなくてもddskkを使いはじめることができます。Emacsを起動したらC-x C-jと入力してください。モードラインに「かな」と表示され、SKKによる日本語入力が可能になります。

SKKでは入力を行なうと、ひらがなが確定された状態で入力されます。Anthyなどとは異なり、ひらがな確定入力の状態でスペースキーを押しても漢字変換は行なわれません。漢字や送り仮名の始点では、ローマ字入力字にSHIFTキーを押す必要があります。SHIFTキーを押すことで、ひらがな確定入力モードから漢字変換モードに遷移します。

例えば前述の例文を「ここでは着物を脱いでください」と変換したい場合は、⁠kokodeha Kimono wo NuI dekudasai」と入力します。

カタカナを入力したい場合は、かなモードで'q'キーを押します。モードラインの表記が'かな'->'カナ'に変化し、カタカナを入力することが可能になります。ひらがなに戻す際にはもう一度qを押してください。あるいは、SHIFTを押して漢字変換モードで入力を行ない、変換時にスペースキーではなく'q'キーを押すことでも、カタカナに変換することも可能です。

同様にASCII文字を入力したい場合はかなモードで'l'キーを押します。モードラインの表記は'SKK'となり、キーボードの印字通りの文字を入力することが可能になります。また'L'を押すことで全角英数モードに遷移します。この場合、モードラインの表記は'全英'となります。ASCIIモードや全英モードからかなモードに戻るには、C-jを押してください。

M-x skk-tutorialを実行すれば、ddskkのチュートリアルを行なうことができます。SKKは入力方法が独特ですので、SKKが初めてという場合は一度通して実行しておくと、基本操作を身につける助けになるでしょう。

図1 ddskkを使ってEmacsで日本語入力
図1 ddskkを使ってEmacsで日本語入力

単語登録と削除

変換しようとした単語が辞書になかった場合、または変換候補を最後まで辿っても希望する候補が出てこなかった場合、再帰的単語登録モードに遷移します。ミニバッファに登録対象となる読み仮名が表示されますので、その後に半角スペースを空けて登録したい漢字を入力してください。

また、単語を変換候補に出した状態で'X'キーを押すと、登録した単語を削除することができます。

図2 変換できない単語は、その場で登録ができる
図2 変換できない単語は、その場で登録ができる

dired-xを使う場合の問題

本連載第131回でEmacs上で動くファイラ、diredを紹介しました。diredの拡張版であるdired-xには、⁠カレントバッファのファイルが保存されているディレクトリをdiredで開く」dired-jumpという機能が実装されています。これは非常に便利な機能なのですが、デフォルトでSKKの起動キーであるC-x C-jにバインドされているため、dired-xをロードしているとSKKを起動させることができなくなってしまいます。

そんな場合には、C-x C-jにskk-modeをバインドしなおすか、skk-modeの起動を別のキーにバインドしてしまうとよいでしょう。筆者はddskkに乗り換える前にanthy-elを使用していたことから、anthy-elと同じC-\でSKKを起動できるように設定をしています。

dired-xをロードした場合、C-x C-jにskk-modeをバインドしなおす
(when (require 'dired-x nil t)
  (global-set-key "\C-x\C-j" 'skk-mode))
筆者の設定例。C-\にskk-modeをバインドする
(when (require 'skk nil t)
  (global-set-key "\C-\\" 'skk-mode))

ddskkのコードネーム

様々なソフトウェアがそうであるように、ddskkにもバージョンごとにコードネームがつけられています。Ubuntuの「頭韻を踏んだ形容詞+動物名」のように、ddskkのコードネームにもまた命名規則があります。それは「公共の交通機関の駅名を連続して使ってゆく」です。

始発駅はなんと、⁠Ubuntuとも関わりの深い)大阪府箕面市の箕面(Mino-o)でした。箕面から阪急箕面線を辿り、石橋(Ishibashi)で阪急宝塚線に乗り換えて、現在のUbuntuパッケージのバージョン、14.0.91のコードネームは庄内(Syounai)となっています。もうすぐリリースされるあろうバージョン14.3では、阪急十三駅に到着する予定です[3]⁠。

Emacsの外でもSKKを使う

慣れると手放せないSKK。それがEmacsの中だけでしか使えないのは勿体ないですね。どうせならばUbuntu全体で使いたいと思うのは当然のことです。そんな時はIBus-SKKをインストールして、IBusでもSKKを使いましょう。まずibus-skkパッケージと、辞書であるskkdicをインストールします。

$ sudo apt-get install ibus-skk skkdic

次にデスクトップ右上のインジケータから、IBusを再起動してSKKを認識させます。IBusが再起動したら、インジケータから "設定" -> "インプットメソッド" を開き、"日本語" -> "SKK" を選択して"追加"をクリックします。インプットメソッドの一覧にSKKが追加されますので、"上へ" をクリックしてSKKを最上位に持ってくるとよいでしょう。もしAnthyを使わないというのであれば、Anthyを削除してしまっても構いません。

これでCtrl+Spaceで日本語入力を開始すれば、IBus-SKKを使った日本語入力が可能になります。

図3 インジケータからIBusの設定を行なう
図3 インジケータからIBusの設定を行なう
図4 インプットメソッドに日本語-SKKを追加する
図4 インプットメソッドに日本語-SKKを追加する
図5 IBus-SKKを使って、GNOME上で日本語入力をする
図5 IBus-SKKを使って、GNOME上で日本語入力をする

SKKと辞書

辞書のしくみ

ここでSKKの辞書について説明しておきましょう。SKKはシステムで共有している書き換え不能な辞書と、ユーザごとに用意される個人辞書を併用して変換を行ないます。ここで面白いのは、個人辞書には個人が登録した単語だけでなく、そのユーザの変換履歴が含まれるところです。この個人辞書を最優先に変換を行なうので、使用頻度の高い単語ほど優先的に変換候補に挙げられることになります。これがSKKの高いヒット率の秘密でもあります。

SKKは、この辞書をバッファに読みこんで変換を行ないます。そのため、大きな辞書をフロントエンド毎に抱えこむことになるのですが、これは非効率です。そこでSKKには辞書サーバ(SKKサーバ、後述)と呼ばれる機能がオプションで用意されています。

複数の辞書を扱う

ibus-skkと同時に、skkdicをインストールしました。skkdicをインストールすることで、SKK-JISYO.Lという、ある程度の人名地名や複合語を含んだ一般的な辞書を使うことが可能になります。ですが、SKK_JISYO.Lだけではカバーできない変換も当然存在します。例えば郵便番号から地名へ変換したり、人名、法律用語、駅名などといった特殊な用語を変換する場合には、専用の辞書が必要になります。こういった辞書を集めたパッケージが、skkdic-extraです。

ibus-skkでは使用する辞書ファイルを一つしか指定することができないため、これらの辞書を使うためには辞書のマージ作業が必要になります。しかし後述する辞書サーバは複数の辞書を束ねて検索することが可能なため、お手軽に複数辞書を使用することが可能になります。

各種辞書ファイルをインストールする
$ sudo apt-get install skkdic-extra

辞書サーバを利用する

dbskkd-cdb

ddskkのインストールの項で述べたように、ddskkはデフォルトで辞書サーバを使用するように設定されており、辞書サーバ用にcdb形式に変換されたskkdic-cdbを共有の辞書として利用しています。辞書サーバとフロントエンドはskkservというプロトコルで通信を行ない、入力文字列から変換結果を受け取れるようになっています。

IBus-SKKではskkdicに含まれる/usr/share/skk/SKK-JISYO.Lを共有の辞書として使用していますが、辞書サーバを使用することも可能です。

まずIBusの "設定" -> "一般" から "言語パネルの表示" を "アクティブであるとき" に設定します。これでIBusを起動するとデスクトップ上に言語パネルが表示されるようになりますので、パネル上の "SKKの設定" ボタンをクリックします。IBus-SKKの設定を開いたら、"辞書" タブにある "SKKサーバを使う" にチェックを入れてください。ポートはデフォルトで1178が指定されていますが、特に変更する必要はありません。

skkservはデフォルトでTCP:1178を使用し、これは/etc/servicesからも確認できます。TCP:1178への接続はinetdが待ち受けており、サーバである/usr/sbin/dbskkd-cdbはinetd経由でキックされます。これは/etc/inetd.confで確認ができます。

これでddskkと同じ辞書サーバをIBus-SKKからも使用することが可能になりました。

図6 IBus-SKKからskkservを利用する
図6 IBus-SKKからskkservを利用する
ポートとサービスの対応を確認する
$ grep 1178 /etc/services
skkserv		1178/tcp
inetdの設定を確認する
$ sudo netstat -plt
(...略...)
tcp        0      0 *:skkserv               *:*                     LISTEN      1161/inetd

$ cat /etc/inetd.conf
(...略...)
skkserv		stream	tcp	nowait	nobody	/usr/sbin/tcpd	/usr/sbin/dbskkd-cdb

yaskkserv

ddskkやibus-skkは、バックエンドの辞書サーバを選びません。辞書サーバには複数の実装がありますが、その中からdbskkd-cdbを敢えて選ぶ理由はそろそろなくなりそうです。なぜなら現在のUbuntuパッケージには含まれていないものの、ddskkはcdb形式の辞書ファイルを、サーバを経由せずに検索することが可能だからです。ですので、どうせなら別実装の辞書サーバを使ってみることにしましょう。Ubuntuにはyaskkservという辞書サーバのパッケージが用意されています。

yaskkservのインストール
$ sudo apt-get install yaskkserv (※4)

yaskkserはインストール時に、システムにインストールされているSKK辞書を変換し、/usr/share/yaskkserv以下に取りこみます※5⁠⁠。しかし、デフォルトではSKK-JISYO.L.yaskkservのみしか使用されません。他の辞書を同時に使用したい場合は、/etc/default/yaskkservを編集し、使用する辞書を列挙してください。使用できる辞書がコメントアウトされた状態になっているため、行頭の'#'を削除し、二重引用符の位置を変更するだけで設定は完了です。設定が完了したら、yaskkservを再起動しておきましょう。

使用する辞書を追加する例
$ sudo vi /etc/default/yaskkserv
DICS="SKK-JISYO.L \
SKK-JISYO.zipcode \   ←コメントアウトを解除して郵便番号辞書を追加
SKK-JISYO.station \   ←コメントアウトを解除して駅名辞書を追加
"                     ←二重引用符を閉じる
#SKK-JISYO.requested \
(...略...)
$ sudo /etc/init.d/yaskkserv restart

server completionを使う

yaskkservは、server completionという機能に対応しています。これは辞書サーバを前方一致で全検索する機能です。この機能を利用するには、.emacsに以下の設定を行ないます。この設定方法や機能の詳細は/usr/share/emacs/site-lisp/ddskk/skk-server-completion.elの先頭部分に記述されていますので、こちらも参照してください。

server completionの設定
(add-to-list 'skk-search-prog-list
          '(skk-server-completion-search) t)
(add-to-list 'skk-completion-prog-list
          '(skk-comp-by-server-completion) t)

;;また、`~' を付けた変換結果を個人辞書に学習してしまうのをやめるためには
;;以下を追加してください。

(add-hook 'skk-search-excluding-word-pattern-function
       #'(lambda (kakutei-word)
           (eq (aref skk-henkan-key (1- (length skk-henkan-key)))
               skk-server-completion-search-char)))

設定を完了したら、実際に変換を行なってみましょう。変換モードで文字の後ろにチルダ(~)をつけて変換を行なうと、server completionが辞書サーバを前方一致検索し、マッチした語句を変換候補として列挙します。

server completionの利用例
▽ひっさつ~
==> "ひっさつしかけにん" "必殺仕掛人" "ひっさつしごとにん" "必殺仕事人" "ひっさつわざ" "必殺技" ..

おわりに

SKKは独特な日本語入力方法ですが、Emacsが動作するあらゆる環境で利用することができます。さらにMac上で動作するAquaSKKや、Windows用のSKKIMEといった実装も存在するため、最近ではEmacsの外でも問題なくSKKを利用することができます。バックエンドに辞書サーバを持つことで、より強力で柔軟な変換能力を持たせることもできるSKKを、ぜひ体験してみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧