Kazuhiro's blog
ようこそ! Kazuhiro's blog
水曜日, 12月 04 2024 @ 02:27 午前 JST
 記事を友人にメールする 印刷用画面 

EPWINGの全文検索 その2

Lookup

約15年前にEPWINGの全文検索を試みた事があったのですが、それの焼き直しです。

Hyper Estraierを利用するの前回と同様ですが、専用のインデキサを用意して、直接インデックスを作成できるようにしました。 Lookup 1-4+mediaに対応コードを入れたので、インデックスがあれば自動的に使用できます。

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

lsd-fuw is released

Lookup

ライフサイエンス辞書は2010年版まではJIS X 4081版のデータも公開されていましたが、現在はその公開も中止されています。 そこで、もう少し新しいデータを利用しており、再配布が許可されている、Firefox 用のアドオンであるライフサイエンス辞書ツールに含まれるデータを利用してLookup 1.4+mediaから検索できるようにしてみました。 ちなみに、最も新しい版のデータは「ライフサイエンス生き字引」という名前のAndroid及びiPhoneアプリに含まれているようです (データの構造はよく分かりませんでしたが、少なくともAndroid用の体験版には含まれているようでした)。

ライフサイエンス辞書ツールに含まれる辞書データはSQLite3のデータベースになっています。 当初は直接データベースを検索するエージェントを作って検索していましたが、日本語見出しに対する検索にものすごく時間がかかりました。 その為、結局FreeUWINGを使って変換するツールを作りました。 ちなみに、変換時も日本語見出しになると変換速度が一気に落ちます。

タグ:FreeUWING

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

Lookup 1.99の更新 その2

Lookup

以前にも紹介したLookup 1.99ですが、川幡さんが色々と対応書籍の拡充を図っており、PDIC/Unicodeの辞書 (要するに英辞郎 第四版) も検索できるようになりました。詳しくはスクリーンショット対応辞書の一覧を確認してください。 Lookup 1.4+mediaで拡張された機能もほとんど取り込まれていたと思いますが、例によってEmacs 23でしか動かないそうです。 興味のある方はどうぞ。

タグ:Lookup PDIC

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

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>以外のタグもスキップするように変更しました。

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

よくわからない解説

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