メニュー |
ようこそ! Kazuhiro's blog
月曜日, 11月 23 2009 @ 12:48 午後 JST SDIC辞書のインデキシングを最適化する![]() とか書くと偉そうに聞こえますが、自作のコードで必要な部分だけのインデックスポイントを書きださせることで、インデックスのサイズを小さくするという話です。 既存のアイデアではありますが、こういうのはスクリプト言語でやった方が楽じゃないかなぁという事で、紹介します。 SDICを使ってSDIC形式の辞書を検索する時、SUFARY(あるいはSary)を使ってインデキシングを行うことで検索の高速化が可能になります。 しかし、速くなるのはいいのですが、mkary等でインデキシングを行うと元のSDIC辞書のおよそ3倍という、結構な大きさのインデックスファイルが必要になります。 SDIC形式な辞書の場合、コメントの部分や、タグや実体参照の途中等からマッチさせる必要はありません。というか、されるとうれしくありません。 ですので、この部分についてはインデックスポイントを出力しないようにしてみます。 これにより、インデックスのサイズがおよそ2割前後小さくなりました。 また、全文検索を捨てて検索語だけでインデックスを作ったり、後方一致検索も捨てることで更に小さくできます。
一応公開しておきます。使い方ですが
% 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
(2008/09/08 追記) <K>以外のタグもスキップするように変更しました。 よくわからない解説![]() 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における日本語の文字コードですが、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の文字コードについて![]() UbuntuのLookupでEBGの辞書がひけないという話があったのでちょっと調べた結果のメモ。 ただし確認できる環境がないので未確認です。 とりあえずEUC-JP以外の文字コードを設定した場合はEBGはひけなさそうな気がします。 eblookは起動後に(日本語の)入出力に使う文字コードを決定し、出力時には内部コード(EUC-JP)を変換し、入力時にはEUC-JPへと変換します。 EUC-JPが指定されている場合は変換処理を行いません。 が、この文字コード変換処理はEBGの書籍を選択した時にも内部コードをEUC-JPとみなしたまま行われているような気がします。 これを回避するにはeblookをEUC-JPで使い、変換処理を行わせないようにする必要があります。 パッケージのことは分かりませんが、Lookup 1.4.1の場合はndeb-program-argumentsがデフォルト値のままであれば
(setq ndeb-process-coding-system 'euc-jp)
で、EUC-JPで動きます。 Lookup 1.3で動いていたものがLookup 1.4.1で動かないという部分と、:codingオプションが効かないという部分はよくわかりませんでした。 Lookup 1.3と1.4.1の間では、eblookの起動時にeuc-jpを使用するようになったくらいで、それ以外の文字コードの扱いは、:codingオプションも含めて変わっていないはずです (eblook側は追っかけてません)。 ですので、上記のようにEUC-JPでeblookを使うようにし、エージェントオプションとして:codingを指定すればよさそうな気がするのですが。 (更にバグっぽい動きも見つけてしまったので)本当はeblookを変更すべきですが、自分のところでは動作の確認が全くできないうえに、EBXA-Cについても視野に入れると大きな変更になりそうなのでちょっと手を出しにくいです。 EB Library 4.3.2 is released![]() 気付くのに遅れましたが、EB Library 4.3.2が公開されました。 UNIX環境において、ファイル名に大文字を含む動画は、小文字に変換しないと読み込めないバグが修正されています。 eblook 1.6.1+mediaのバイナリも更新しました。 タグ:EB Library eblook |
新着情報記事-コメント 最近 2 日-トラックバック 最近 2 日- |
| Copyright © 2009 Kazuhiro's blog 本ページのすべての商標と著作権はそれぞれの所有者に帰属します。 |
Powered By Geeklog ページ作成時間: 0.22 秒 |