by GoodImages under CC BY-NC-ND
写真は、イギリスのSphinx Statueというやつだそうで。本当の名前かは知らないけど。
以前に行った、Sphinxの検索の多国語対応ですが、ちょっと修正を加えて、1.0対応しました。Sphinx-Users.jpのぺージのビルドに使うSphinxも、この日本語検索対応版にしました。
MeCab対応の強化とYahoo!形態要素解析対応の削除
基本的な設定は前回から変わっていませんが、今回は、MeCabの対応を強化しました。
mecabライブラリ検索の自動化、ライブラリ関連オプション追加
ctypesにfind_libraryというのがあったので、これを使うようにしました。MacやLinuxであれば、何も設定しなくても(html_search_language='ja'と、html_search_language_option={"type":"mecab"}だけで)、MeCabを読みに行きます・・・はずですが、MacPortsのMeCabを読み込もうとすると、バージョン番号の取得はうまくいくのに、いざ分かち書きをさせるとPythonごと落ちるという事象に悩まされたので、純正のMeCab-Pythonインタフェース(easy_installでは入れられません)が入っていれば、それを使うようにしました。なお、Windowsも、dllが検索パスに入っていればライブラリパスの設定なしで行けるはずです。
前回は"mecab"の時には必ず、mecabの拡張ライブラリ(dll, so, dylibなど)の絶対パスを指定する必要がありましたが、そのlibpathオプションがなくなっています。代わりに以下のオプションが追加になりました。
- lib: 単独のファイル名、もしくは絶対パス。ctypesで読む場合に利用。省略時は自動検索。
- dic_enc: 辞書ファイルのエンコード。utf-8, euc-jpなどPythonで使えるコーデック名で指定。省略時はutf-8。
- dict: 辞書ファイルのパス。標準と違うファイルを利用したい場合に。
Yahoo!形態要素解析の削除
パフォーマンスが悪すぎるために削除しました。
実装してみたものの・・・
MeCabを使わない場合(デフォルト)では、TinySegmenterのPython移植を利用するようになっています。そのため、辞書ファイルなどをダウンロードしなくても日本語分かち書きができるのですが、これ以外の分かち書き(例えば、ひらがな、カタカナ、漢字の境界で分割)も併用して、検索インデックスを増やすなどの対応をする必要がありそうです。
Sphinxでは、make html実行時にsearchindex.jsというインデックスファイルが作られ、Sphinxのファイルを見ているマシンのブラウザ上で検索が行われます。その検索の品質を左右するのが、このインデックス作成です。もちろん、インデックスファイルを配信するので、N-Gramみたいなインデックスが巨大になる方式は使えません。また、CJK言語のためにでかい辞書をバンドルしてもらうのも難しいです。無駄をなるべく減らすというチャレンジは色々できそうです。また、今は単語のありなしだけでしか見てませんが、用語の登場頻度、セクションタイトルでの利用している場合などの重み付けをする、ということも考えられます(Sphinx本体に手を加える必要が出てきますが)。
SphinxのMLに投稿したのは、言語ごとのインデックス作成をできるようにする、というものですが、言語の特徴によって色々なインデックス作成アルゴリズムを選択できる、あるいは組み合わせるようにする、というのがいいのかな、と思っています。具体的には、拡張機能として実装して、組み合わせを設定できるようにする、というものです。
例えば、フランス語やドイツ語などの場合は、アクセント記号を外したインデックスを作成する、といったことが考えられます。現在対応していない言語も、ユニコードの文字種の境目で分割というアルゴリズムを適用すれば、最低限のインデックスは作れるようになると思います。ただ、どれか1つしか使わない、というのではなくて、インデックスの大きさや、対象となる言語、文章によって選べるようにするのがいいと思います。あ、ステミング処理は言語と密接に関連していますけどね。
ということで、今のパッチのまま提案するのではなく、拡張機能として使えるように、ベースとなるインタフェースクラスを用意して、それを継承して登録するという方式のコードにして、それを提案しようと思います。