「cannaはお馬鹿さん」と良く言われるが、それは、canna標準の辞書が貧弱で あることの原因が大きい。元々の canna に付属するシステム辞書(iroha)は、 約4万語しか単語を持っていない。iroha では、例えば、「試料」「分光」 「分光器」「異方性」「等方性」などの単語もないため、これを使って、分光 学的な日本語文書を書くことは、不可能に近い。
市販の日本語入力ソフトに付随する辞書の単語数は、例えば、 Macintosh で古くから使われてきた EGbridge の場合、
http://www4.airnet.ne.jp/koabe/com_inet/im/feature.html によれば、 「メイン辞書=約27万語、地名人名辞書=28万3千語、医学辞書=15万4千語」 らしい。
canna 辞書を強化するプロジェクトが進行 中で、現在(2004.1)、14万語が収録されている。iroha辞書を、この成果物で ある、gcanna 辞書に入れ換えるだけで、上記の、「試料」...などの5つの単 語が変換可能になる。更に、インターネット上には、多くのフリーのかな漢字 変換辞書があるので、それらを利用することで、cannaの変換効率を上げるこ とができる。
ここで用いているスクリプトプログラムなどは、
http://www.stex.phys.tohoku.ac.jp/~ohba/misc/canna-util.tar.gz
にまとめてある。
FreeBSDでは、ports の japanese/cannadic をインストールすればよい。 インストール後、
/usr/local/share/doc/cannadic/README.FreeBSDの指示にしたがって、dics.dir ファイルの変更などを行う必要がある。こ の辺りは、どのような辞書の場合も同じなので、次節の一般的な辞書ファイ ルの追加の方法を参照。
ダウンロードした canna 用の辞書ファイルが、テキスト形式の場合は、 バイナリー辞書に変換する。テキスト形式の canna 用辞書は、*.t または、*.ctd の名前である。
% mkbindic hoge.ctd (または、hoge.t)
これで、hoge.cbd(バイナリー辞書本体) と hoge.cld(頻度ファイル) ができる。
作成したバイナリー辞書を、canna の辞書 directory にコピーして、dics.dir ファイルに追加した辞書の情報を書き加える。これには、管理者権限が必要。
# cp foge.cbd /usr/local/share/canna/dic/canna/ # cp foge.cld /usr/local/share/canna/dic/canna/ # vi /usr/local/share/canna/dic/canna/dics.dir
dics.dir は、
辞書のファイル名(その辞書の中の辞書名) -辞書名---の形式である。canna のバイナリー辞書は、ひとつのファイルに複 数の辞書を持つことができるので、()内の情報は必要。テキスト辞書は、ひとつ の辞書しか持てないので、()内の名前は省略できる。()内の辞書の拡張子は、自 立語辞書は .mwd、付属語辞書は .swd になる。最後の -辞書名-- は、クライ アントから見たときの辞書名(lsdic したときに見える)である。また、バイナリー ファイルについては、辞書本体(.cbd)と頻度情報ファイル(.cld)の両方を書いて おく。頻度ファイルを書かないと、個人用頻度ファイルの作成(mkdic -fq)がで きないようだ。dics.dir ファイルの
fuzokugo.cbd(fuzokugo.swd) -fuzokugo--- iroha.cbd(iroha.mwd) -iroha--- iroha.cld(iroha.mwd) -iroha--- iroha.cbd(bushu.mwd) -bushu--- bushu.cld(bushu.mwd) -bushu--- hojoswd.ctd(.swd) -hojoswd--- ....ここに、mkbindic でできたふたつのファイル(辞書本体と頻度ファイル)に 付いての記述、
hoge.cbd(hoge.mwd) -hoge--- hoge.cld(hoge.mwd) -hoge---を追加すれば良い。なお、canna の辞書ファイルのファイル名は、拡張子を除い て、アルファベット9文字までしか使えないようだ。それよりも長い名前を用い てもエラーは出さないが、lsdic しても現れないので注意が必要。
以上の後で、cannaserver をリスタートする。
# /usr/local/etc/rc.d/canna.sh stop # /usr/local/etc/rc.d/canna.sh start
以上の操作で、cannaserver は新しい辞書を使えるようになったが、実際に どの辞書を使うかは、ユーザー毎に選択可能である。一般ユーザーで、
% lsdic -a -cs cannaserverのホスト名
で、新しく追加した辞書が見えるようになったはずである。これを使 えるようにするには、kinput2 と canna/mule では、 /.canna ファイルに
(use-dictionary "fuzokugo" "hojomwd" ... "hoge" ; <= 追加 :bushu "bushu" :user "user" )
を追加し、kinput2(または mule)を再起動。
tagago4/emacs では、 /.eggrc ファイルに
(canna-add-dict "hoge" nil)
を加えれば良い。
以下の辞書は基本的にはフリーなものであるが、再配布について条件を付けてい るものもあるので、それぞれの README ファイル等を参照すること。
これを入れると、``9808578'' という入力が、 ``宮城県仙台市青葉区荒巻字青葉2-1 東北大学 (理学部・薬学部等)`` と変換できるようになる。
この他にも、 http://www.vector.co.jp/vpack/filearea/data/writing/dic/index.html には、多くの辞書がある。
いくつかのテキスト辞書の形式を以下に示す。
例) あーべるへんかん #T35 アーベル変換 あぼがどろ #JN アボガドロ
読み、単語、品詞名 の順に並んでいる(区切り文字は、コンマ)。
例) あーべるへんかん、アーベル変換、一般名詞 あぼがどろ、アボガドロ、固有人名
読み /漢字1/漢字2/... と、一つの読みに対し、複数の漢字を書ける。 品詞の概念は基本的にはない。ただし、動詞や形容動詞など、送り仮名が活 用で変化するものに付いては、最後は子音のアルファベットで終わっ ている。
例) いじょう /以上/異常/≧/ とk /溶/解/[け/溶/]/[き/解/]/
したがって、ATOK辞書をcanna辞書に変換するためには、ATOK の品詞名を canna の品詞コードに変換し、並び順を変え、区切り文字をコンマからスペー スに変えればよい。また、SKK辞書を変換するためには、読みと漢字を 1:1 に してから、動詞や形容動詞(アルファベットで終わっている読み)を取り除き、 残ったものを名詞として、並べればよい。以下で、変換のために用いているス クリプトは、 配布パッケージ に含まれている。
参考 ATOKやcannaの品詞情報
http://hp.vector.co.jp/authors/VA014135/fep2.htm
http://www.tanu.org/~sakane/doc/public/howto-canna.html
フリーな辞書たちの物理用語集(physics.lzh)を例にして、 手順を示す。
http://www.vector.co.jp/soft/data/writing/se039662.html
から、ダウンロードした physics.lzh を解凍する。
% lha -x physics.lzh
これでできた、physics.txt が、変換したいテキスト辞書である。
% nkf -e < physics.txt > p.t
まず、nkf -e を通して、EUCコードに変換。これで、半角カナは全角カナにな り、区切り文字は、"、"になった。 次に品詞を変換して、canna形式にする。
% perl atok2canna.pl < p.t > physics.t
これでできた physics.t をmkbindic にかければ、 システムバイナリー辞書の出来上がり。
skk 辞書の、
よみ /漢字1/漢字2/...
の形式を、
よみ 漢字1 よみ 漢字2 ...
の形式の変換する。
% skk2list SKK-JISYO.L > skk.1
skk2list は、skk のパッケージに含まれている perl スクリプト。
動詞や形容動詞を表す、
わるs 悪 わるk 悪
や、接頭語や接尾語を表すと思われる、
こ> 小 こ> 故 >あい 愛 >あじ 味
の単語を除く。
% meishi < skk.1 > skk.2
残った単語の中には、人名や地名などが含まれているが、それらを区別する 方法がないので、すべて「名詞」として、変換する。
% list2canna < skk.2 > skk.t
上記に使ったスクリプトは、すべて、
配布パッケージ
に含まれている。
複数の辞書をシステム辞書に追加していくと、dics.dir は長くなり、 lsdic -a したときに表れる辞書名も多くなり、繁雑になる。また、異なっ た辞書には重複した単語も登録されているので、無駄が多い。そこで、ここで は、複数の辞書をひとつのまとめたり、追加する辞書から、すでに登録されて いる単語以外の単語だけを抜き出す方法を述べる。
以下の操作は、「読み 品詞コード 単語」形式のテキスト辞書を対 象としている。バイナリー辞書しかない場合に、テキスト形式辞書に変換 する必要がある。必要なプログラムは、すべて、cannaに付属しているもの で、/usr/local/bin/ 以下にある。
% dpbindic gcanna.cbd dpxdic gcanna.cbd gcanna.mwd [ Thu Dec 18 19:49:25 2003 ] = 146230 + 90687
これから、gcanna.cbd は、単語数146230/読みの数90687 の自立語辞書 (gcanna.mwd)だけからできていることがわかる。
% dpbindic gcanna.cbd gcanna.mwd > gcanna.1
これで、テキスト辞書が、gcanna.1にできる。
このファイル(gcanna.1)は、
読み 品詞コード 単語1 単語2 ...
となっているので、1行1単語に変換し、ついでに重複を除く。
% splitword gcanna.1 | sort | uniq > gcanna.t
% merge_tdic.pl dic.1 dic.2 dic.3 ... | sort | uniq > all.t
dic1, dic2, ... は、「読み 品詞コード 単語」形式のテキストファイルに 形に変換しておく。ただし、skk 辞書は、人名も地名もすべて名詞として登 録されているので、それらは、sort | uniq しても、重複は除けない。
単純に辞書を追加していくと、すでに登録されているものが、重複して登録 されてしまう。そのためには、登録されていないものだけを抜き出す操作が 必要。GNU版 diff を使えば、ふたつのファイルに対して、最初のファイル だけにある行(-old-line-format)、ふたつめだけにある行 (-new-line-format)、両方にある行(-unchanged-line-format)を、それぞ れ出力することが簡単にできる。
cannadicプロジェクトの gcanna.t(146230単語) と skk.t(162543単語) に 対して、
% diff --old-line-format="%L" --new-line-format=""\ --unchanged-line-format="" gcanna.t skk.t > only-gcanna.t % diff --old-line-format="" --new-line-format="%L"\ --unchanged-line-format="" gcanna.t skk.t > only-skk.t % diff --old-line-format="" --new-line-format=""\ --unchanged-line-format="%L" gcanna.t skk.t > common.t
を行うと、
only-gcanna.t 106463 onky-skk.t 122706 common.t 39794
で、約4万語近くが重複していた(skk辞書は、すべての単語の品詞を名詞で 登録しているので、実際の重複はもっと多い)。gcanna がシステム辞書とし て、動いている場合は、only-skk.t をバイナリー辞書に変換して登録すれ ば良い。