Kazuhiro's blog
ようこそ! Kazuhiro's blog
土曜日, 3月 06 2021 @ 11:49 午後 JST
 記事を友人にメールする 印刷用画面 

SDIC辞書のインデキシングを最適化する

Lookup

とか書くと偉そうに聞こえますが、自作のコードで必要な部分だけのインデックスポイントを書きださせることで、インデックスのサイズを小さくするという話です。 既存のアイデアではありますが、こういうのはスクリプト言語でやった方が楽じゃないかなぁという事で、紹介します。

SDICを使ってSDIC形式の辞書を検索する時、SUFARY(あるいはSary)を使ってインデキシングを行うことで検索の高速化が可能になります。 しかし、速くなるのはいいのですが、mkary等でインデキシングを行うと元のSDIC辞書のおよそ3倍という、結構な大きさのインデックスファイルが必要になります。 SDIC形式な辞書の場合、コメントの部分や、タグや実体参照の途中等からマッチさせる必要はありません。というか、されるとうれしくありません。 ですので、この部分についてはインデックスポイントを出力しないようにしてみます。 これにより、インデックスのサイズがおよそ2割前後小さくなりました。 また、全文検索を捨てて検索語だけでインデックスを作ったり、後方一致検索も捨てることで更に小さくできます。

mkary 最適化 検索語のみ 前方一致検索のみ
gene.sdic.ary 9,591,548 7,754,864 3,007,944 229,480
jedict.sdic.ary 10,397,976 7,422,524 2,245,376 452,778

一応公開しておきます。使い方ですが

% perl sdic_dumpip.pl gene.sdic

の様に使います。検索語のみでインデックスを作成する場合は

% perl sdic_dumpip.pl --index=keyword gene.sdic

の様にしてください。前方一致検索用のインデックスを作成する場合は

% perl sdic_dumpip.pl --index=prefix gene.sdic

の様にしてください。いずれの場合でも書き出し後にmkary(あるいはmksary)によるインデックスのソートが必要です。

% mkary -so gene.sdic
% mksary -s gene.sdic

タグ:SDIC Lookup

(2008/09/08 追記) <K>以外のタグもスキップするように変更しました。

 記事を友人にメールする 印刷用画面 

FreePWING 1.5 is released

general

本日、FreePWING 1.5がリリースされました。 これには、sound patchと私が加えていた変更がそのまま取り込まれていますので、私が行っていた改造版の公開は終了しました。

(特に私がサボっていた)ドキュメントの記述等、作者の笠原さんにも色々と作業いただきましてどうもありがとうございました。

タグ:FreePWING

 記事を友人にメールする 印刷用画面 

mkdirhierのバグ

general

imakeに入っているmkdirhierがCygwin環境では動作しない(事がある)というお話しです。

なんでいきなりimakeなのかというとFreePWINGにこのmkdirhierが入っているからです。 簡単に書くと、Cygwin環境でmkdirhierに絶対パスを引数として与えるとディレクトリの作成に失敗するというものです。 何故失敗するかというと、絶対パス名が与えられると先頭の'/''//'に変更してディレクトリを掘ろうとするためです。 以前からあった問題なのかは知りません。 UNIX環境では問題にならないようですが、Cygwin環境ではUNC名として解釈されるので予期しない動作を来します (大抵の場合はエラー)。

ちなみに、最近のmkdirには同等の動作をするオプション (-p) があるので、mkdirhierがなくてもあまり困らないかもしれません。 改造版のFreePWINGは修正しました。

タグ:FreePWING

 記事を友人にメールする 印刷用画面 

よくわからない解説

Lookup

UbuntuのeblookでEBGの辞書がひけない話の続きです。 EBGに対して(だけかどうか不明ですが)、ウムラウトの入った文字を含む単語を検索しようとするとLookupが反応しなくなったそうです。 呼ばれもしないのにしゃしゃり出ていろいろ試していただいた結果、一応解決したようです。 途中、解決しなかったらどうしようかと思いましたが。

過程はコメント欄でのやり取りを見て頂くとして、結局Readlineとiconvのサポートを切る事でうまく動作するようになりました。今のところ一番あやしいのはReadlineサポートです。 (コメント欄ではiconvも切るように書きましたが、iconvでおかしくなっているのであればshell-modeでも症状が再現するはずなので、その可能性は低いと思っています。) 何故Readlineサポートが有効だとダメなのかは追求していません。

通常、Lookupから呼ばれたeblookはReadlineサポートを無効にしますが、Emacsがターミナル上で動作している場合などはReadlineサポートは有効のまま動作します。ちなみに、以下のようなコードで判定を行っています。

if (!isatty(fileno(stdin))) interactive_mode = 0;

今回はこの判定がおかしかったのかもしれませんがやっぱり追求していません。 とりあえず思いついた、eblookのReadlineサポートを無効にする手段は以下の通りです。

eblookのReadlineサポートを無効にしてビルドする

eblookを使うのがLookupからだけであればReadlineサポートは必要ありません。

eblook-1.6.1+media (とLookup 1.4+media)を使う。

eblook-1.6.1+mediaにはReadlineサポートを無効にするオプションがあります。

また、eblookにおける日本語の文字コードですが、Lookup 1.4.1のデフォルトでは常にeuc-jpになります。 ndeb-process-coding-systemのデフォルト値もUNIX環境ではeuc-jpになるはずです。 Lookup 1.3ではeblookの文字コードはeblookの自動判定に任せますから、環境変数の値等に依存しています。 その為、ndeb-process-coding-systemもそれに合わせる必要があります。

(追記) Lookup 1.4+mediaでも、Readlineを有効にした状態のeblookにiso-8859-1な文字列を送ると動作がおかしくなりました。 Readlineを無効にすると解消したので、やはりReadline機能が問題になっているようです。

タグ:eblook Lookup

 記事を友人にメールする 印刷用画面 

Meadow でユニコードテキストをクリップボードとやり取りする

general

NTEmacsでは、selection-coding-systemutf-16le-dosだったりすると、ユニコードテキストをコピー&ペーストで他のアプリとやり取りできるようになっています。

Meadowではクリップボードまわりは独自のルーチンを使っており、他のアプリとのユニコードテキストのやり取りは困難ですが、複数起動されたMeadow間でテキストのコピー&ペーストができるようになっているらしいです。 個人的にはNTEmacsの動作の方が(今となっては)便利そうなので、自分が使うMeadowはNTEmacsのルーチンを使うようにしました。

(2008/05/02 追記) Meadowのtrunkもそのようになりました。

タグ:Meadow