『かんな』の部屋


○ 『かんな』とは

『かんな』はNECの今 昭さんらによって開発された、かな漢字変換方式の日 本語入力システムです。UNIX上で動作する『かんな』はフリーソフトウェアとし て配布されています。『かんな』の特徴は…いろいろあります。詳しくは NECの『かんな』のホームページを 見てください。

ちなみに、私は以下の理由で『かんな』を愛用しています。

『かんな』を使い初めてはや四年、『かんな』で書いた文章はかなりの量になり ます。その間に、cannaserverが死んだとか誤動作したという経験はないし、メー リングリストで報告されたこともないし、まわりで聞いたこともないです。

○ UNIX版『かんな』の最新版

UNIX版『かんな』の最新版はCanna Ver3.5 β2です。NECの『かんな』の ダウンロードページから入手可能です。

○ 非公式パッチ

Canna Ver3.5 β2には、と 早稲田大学の狩野さんが作成して かんなメーリングリストに流している、変換効率を改善するための非公式 パッチがあります。

メーリングリストの内容は、NetNewsのニュースグループ tnn.forum.cannaで読むこともできます。

狩野さんのパッチについて
狩野さんの文法パッチは、主に文節区切りの誤りのうち、文法ファイルや 辞書の修正で解決が可能なものを対象としています。

わかりやすい例を一つあげると、Canna32p2では「僕の部屋」と変換しよう とすると、「僕のへや」と一文節になってしまいます。これは、格助詞の 「へ」と「や」が接続しているために発生した誤変換で、この種の誤変換 は文法ファイルの修正で直すことができます。

私のパッチについて
私が文法ファイルの誤りを修正することもありますが、この二、三年は問 題点の指摘だけで、修正は狩野さんにまかせることが多いです。この手の 問題については、彼の方が圧到的にセンスがいいですから。

私のパッチは、文法ファイルや辞書の修正でカバーしきれない問題点のう ち、変換ロジックのささいな修正で直せるものを対象としています。

例えば、『かんな』の変換ロジックには、「胃(い)」など一文字の自立語 を含む文節、例えば「胃が」を変換して学習すると、その後に「い」の直 前で文節を切る癖があります。これは、後で紹介する私のパッチで直せます。

対象外の問題点
文法ファイルが誤っているのではなく、単に学習情報の問題で文節区切り を間違えてしまう場合については、僕も狩野さんも手を付けていません。

例えば、「簡単に入る」と変換しようとして、「簡単には入ル」となるの は、「入る(はいる)」と「入ル(いる)」の間の優先関係が学習されていな いために起こる誤変換なので、特に対策は講じてません。

正しい位置で文節が切れているのに、選択された候補が正しくない場合に ついても、『かんな』の変換ロジックの根本的な仕様の問題もあって手を 付けていません。

非公式パッチ一覧

統合パッチ
これは、私がCanna 4983 (Canna nnnnはメーリングリストの記事番号です)で流したもので、 それまでに流れていた非公式パッチをまとめたものです。

具体的には、狩野さんの Canna 4716Canna 4721の 文法パッチ(README)のうち patches.510以外と、私のCanna 4789の 変換ロジックパッチ2を当てて、 dic/ideo/words/obsolete.dirのミスを直したものです。

ディレクトリがCanna35になっていたのをCanna35b2に直しました (1997/10/20)

統合パッチ2(1998/4/13)
統合パッチを当てた時点で残っている問題のうち、比較的無難なものを修 正しています。具体的には 僕のパッチ(Canna 4997Canna 5003)と 狩野さんの指摘(Canna 5013Canna 5014Canna 5015)を反映しています。

このパッチには、○や×などの記号類の品詞を一般名詞(#T35)から単漢字 (#KJ)に振り直した、狩野さんのパッチ(patches.510)を取り消す修正が含 まれています。「まるは」と入力しても、「○は」が出てこなくて、僕は それが不快なので戻してしまいました。

文節区切り学習(only experimental)
version 3.2以降の『かんな』は、単語の優先度の学習と、文節長の学習の 二つの変換学習機能を持っていますが、実際には後者はまったく機能して いません(Canna 4982Canna 5005)。

dic/ideo/wordsこのパッチを 当てて、辞書をインストールし直すと文節長学習が効くようになります。 ただし、文節長学習は実装されて以来、まったく使われていなかった機能 なので、有効にすると何か問題が生じるかもしれません。

ロジックパッチ (only experimental)(1998/4/13)
『かんな』の文法ファイル(gram.goto)は2品詞間の関係しか記述 できないので、3つ以上付属語が連結したときに日本語としてあり得ない表 現が生じることがあります。従来は品詞を細分類することで、あり得ない 連結を消していましたが、このパッチを当てると、より直接的に連結を打 ち消すことができます。

統合パッチ2まで当ててから、 このパッチを当ててください。このパッチには文節区切り学習を有効にす るパッチが含まれています。すでに当てていると、patchが文句を言うので よしなにしてください。

このパッチを当てて半年ほど使っていますが、その間に二回cannaserverが 死にました。文節区切り学習と、接続を打つ消すロジックのどちらに問題 があるのかは、まだ調べてません。

○ 『かんな』の変換ロジックについて

『かんな』の変換ロジックの解説書としては、三年前に僕がメーリングリストに 流したものがあります(Canna 2257)。 古くなったところもかなりありますが、基本的な変換ロジックは今でも同じなの で、雰囲気はつかめると思います。

ちなみにこれは、僕が修士過程のサブテーマ(修士研究とは別に、M1の間に別の 講座で行う小さな研究)で、cannaserverに文章末処理を組み込んだときに書いた 報告書の一部です。

統計パッチ

これは、Canna 2257の文中に登場する「変換ログを 取る仕掛け」を、Canna35b2に当たるように直したものです。 lib/RKの下でpatch < Canna35b2-stat1.patchと当てると、 /tmpの下にばりばり変換ログが出力されるようになります。

本当にやっつけで作ったもので、動作確認も真面目にやってません。当時、問い 合わせに応じて数人に配布したものは、やっつけ仕事が過ぎて、いんてるはいっ てるとログが化けてましたが、さすがにそれは直しました。

cannaserverのデバッグ

Canna 2257を書くときには、cannaserverをデバッガ で追いました。そのとき覚えたことを書いておきます。 いや、「はっかーずぱらだいす」 からリンクされたので、それっぽいことも書いとこーかなぁと思って。
デバッグ情報入りのバイナリを作る
lib/RK/libRK.aが変換ロジックに関係しているので、 適当にコンパイラに-gを渡して、libRK.aを作り直しま す。libRK.aを作り直したら、server/でcannaserverを makeします。ネットワークまわりを追う場合には、server/の下 も-g付きでコンパイルします。

cannaserverに-dオプションを指定する
普通にcannaserverを起動するとdaemonになってしまっていろいろ面倒なの で、-dを付けて起動します。-dを付けるとdaemonにな らずに、標準出力にばりばりデバッグ情報を吐きながら起動します。

cannaserverに-pオプションを指定する
普通に起動すると、すでに起動しているcannaserverとぶつかるので、 -p 1を付けて別のポート番号を指定します。クライアントを接続 するときには、:1を付けてサーバを指定します。例えば、 -cs unix:1とかね。cannakillで殺すときは cannakill 1と、単に-pで指定した番号を指定します。

辞書ホームを指定する
デバッグ中のcannaserverに辞書を壊されたりすると悲惨なので、適当なディ レクトリに、$(cannaLibDir)/dicの中身をpermissionを変えずに コピーして、そのディレクトリをcannaserverを起動するときにオプション なしで指定します。

RkwBgnBun()が漢字変換の入口です
lib/RK/bun.cRkwBgnBun()が漢字変換の入口です。最 近は、cannaserverから呼ばれるlibRK.aの関数のマニュアルが、 lib/RKに入っています。RkwBgnBun()のマニュアルは、 RkBgnBun.{jmn,man}です。

calcSplit()が文節区切り位置を決めてます
文節区切り位置の決定は、nword.cで定義されている calcSplit()がやってます。この辺のソースのコメントが、僕の 非公式パッチを当てると、適切な日本語になります^^;


藤枝のホームページ
Last modified: 2006/02/14 15:29:40 JST