skkserv[1] の代替品です。
SKK の辞書に含まれる見出し語には以下のような性質があります。
SKK-JISYO.L (2003/03/05 現在で、120665語) で平均 5.99 文字
SKK-JISYO.L (2003/03/05 現在で、120665語) で計 180 文字
これらの性質を利用して索引の構造を工夫すると、外部のデータベースライブ ラリに頼らずとも高速な検索が実現できそうです。fskkserv では、索引に二 進トライの一種である、パトリシア木を採用することで高速化を図っています。
$ make
native code を生成するには "make opt" とします。
$ ./mkpat /usr/local/share/skk/SKK-JISYO.M
カレントディレクトリに SKK-JISYO.M.pat というファイルができるはずです。
"-c" オプションを付けて起動すると、圧縮した索引を出力します。 この場合、生成される索引のファイル名は、SKK-JISYO.M.pacb となります。
$ tcpserver 127.0.0.1 1178 \
./fskkserver /usr/local/share/skk/SKK-JISYO.M ./SKK-JISYO.M.pat
ckskkserv[3] を用い、SKK-JISYO.L の全見出し語を変換し、一単語あたりの 平均所要時間を求めました。実験は各 skkserv 毎に三回行いました。
最初の一単語の検索には初期化処理が含まれるので、ckskkserv を改造して、 二回目以降の単語変換のみ計算に入れるようにしてあります。
実行環境は以下の通りです:
185.678090, 188.390796, 180.536258
1582.044346, 1566.993461, 1546.381771
95.557308, 102.267188, 105.024655
169.222030, 142.852176, 135.996760
331.054929, 339.838560, 332.032089
407.911498, 363.328524, 387.214985
見出し語を一文字ずつ切り分け、リストに収めます。 次に、以下のルールで各文字に 1 から 283 までの数値(キーコード)を割当てます。
加えて、見出し語文字列の終端を表すために 0 をリストの末尾に加えます。
辞書中の全見出し語における文字の出現頻度から、ハフマン符号化を行い、 1. で求めたリストを可変長のビット列に変換します。
2. で求めたビット列をキーに、元の辞書ファイル中の位置との対応をパトリ シア木に挿入します。
以下の二種類の対応表をシリアライズしてファイルに保存します。
GPL2 or later.
Daiki Ueno <ueno@unixuser.org>