辞書結合 〜SKK-JISYO.LLを作ってみる〜

ノリでSKK Advent Calendarに参加してみたが、他の面子の凄さに若干気後れしていたり。正直SKKヘビーユーザな皆様にとっては、復習にしかならないかもしれないが、こんなので許していただきたい。

モチベーション

一般のSKKではSKK-JISYO.Lが標準の辞書として、最初から使えるようになっている場合が多い。この辞書は最低限必要な変換辞書+α程度は搭載されているが、もっと沢山の語が欲しいときがある。その場合、以下ページ

SKK辞書 : http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1

で配布されている拡張辞書を使うと、更にSKKを賢く快適に使うことができる。(個人的には駅名辞書とzipcode辞書が大好きである)

ところが、uim-skk等のいくらかのSKKでは複数辞書がサポートされない。従って辞書を統合する作業が必要となる。

本題に入る前に

実はskkimeは複数辞書がサポートされているので、この日記は最後以外役に立たないかもしれない。個人的に、skkimeは今最も進んでいるSKKのIMじゃないかなどと思ったりする。

辞書ツール

辞書結合をする為に辞書ツールを落としてくる。以下のサイト

辞書メンテナンスツール : http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=%BC%AD%BD%F1%A5%E1%A5%F3%A5%C6%A5%CA%A5%F3%A5%B9%A5%C4%A1%BC%A5%EB

から落とすか、Ubuntuなら

# apt-get install skktools

でOK。

辞書結合は、基本的に

$ skkdic-expr2 source1 + source2 > output

で行う。演算子は+だけでなく、-や^(共通集合)も使える。

…というのが一般的なやり方だが、他にも、

$ cat source1 >> source2
$ skkdic-expr2 source2 > OUTPUT

というやり方でも良い。skkdic-expr2は自動で整形を行うので、catで結合しても適切な処理をしてくれる。

SKK-JISYO.LLを作ってみる

あとは適当に欲しい辞書を全部繋げるだけである。Ubuntuユーザなら、とりあえず

# apt-get install skkdic-extra

とかやっておけば、使えそうな辞書データを全部引っ張って/usr/share/skkに置いてくれる。

そして、次のようなスクリプトを走らせる。これは、指定ディレクトリ内のSKK-JISYOから始まる辞書ファイルを全部結合してSKK-JISYO.LLとして出力する。(各自の環境に合わせて書き換えを推奨)

#!/bin/bash

temp=OUTPUT
dic_dir=/usr/share/skk

touch $temp

for f in $(find dic_dir -name "SKK-JISYO*" | xargs)
do
	cat $f >> $temp
done

skkdic-expr2 $temp > SKK-JISYO.LL

rm $temp

あとは生成したファイルを、辞書登録すれば宜しい。

Ubuntu + uim-skk環境であれば、管理者権限で/usr/share/skkにmvし、/etc/alternativesのSKK-JISYOのリンク先を、先程mvしたファイルへのシンボリックリンクに置き換えて再起動すれば良い。(こちらも好みで)

メモリ量やパフォーマンスについて

skkdic-extraパッケージでインストールされる辞書を全部結合した場合、辞書サイズは17MBになる。結構多いようだが、ベースのL辞書と比べて4倍程度である。そこそこ性能の低いマシンで動かしているが、正直体感速度の違いは全くない。

メモリに関しても、大した量ではない、というのが私の考えである。

余談 SKKユーザ辞書の文字コードについて

Windowsskkimeのユーザ辞書とuim-skkのユーザ辞書の結合で大変悩んだことであるが、どうやらskkimeの辞書はUTF-16で生成されているようだ。

従って、skkimeの辞書を結合したい場合、UTF-16からEUC-JPに変換する必要がある。

だが更に困ったことに、文字コード変換で一般に使われるnkfにはバグがあるらしい。私の場合、EUC-JP→UTF-16が上手く扱えなかった。

この為、EUC-JPからUTF-16への変換は以下のPythonコードで凌いでいる。

euc2utf16.py : http://ponkotuy.com/other/euc2utf16.py

追記

nkfではなくiconvを使えば全く問題は発生しない。今後はiconvの使用をお勧めする