目次

前のトピックへ

Sphinx と git

次のトピックへ

Sphinx on windows (Admin権限なし版)

このページ

日本語検索強化

Sphinx の日本語検索について

Sphinxの検索を日本語対応にする のとおり、sphinxの日本語検索は、クライアント側だけで動作するようにjavascriptを利用しており、その辞書は make html 時に searchindex.js というファイルに生成されます。

過去は日本語に対応していませんでしたが、現在(Ver 1.1以降)のところは対応するようになっています。

しかし、デフォルトでは html生成時に TinySegmenter で検索語を生成するので、日本語ばりばりのドキュメントな環境で利用する場合、イマイチ賢くない感じがする。

ということで、html_search_options にある mecab を使ったわかち書きでの検索インデックス生成を試してみる。

日本語検索関連の conf.py でのオプション

ノート

本家 からの抜粋です

html_search_language

Language to be used for generating the HTML full-text search index. This defaults to the global language selected with language. If there is no support for this language, "en" is used which selects the English language.

Support is present for these languages:

  • en – English
  • ja – Japanese

バージョン 1.1 で追加.

html_search_options

A dictionary with options for the search language support, empty by default. The meaning of these options depends on the language selected.

The English support has no options.

The Japanese support has these options:

  • type'mecab' or 'default' (selects either MeCab or TinySegmenter word splitter algorithm)
  • dic_enc – the encoding for the MeCab algorithm
  • dict – the dictionary to use for the MeCab algorithm
  • lib – the library name for finding the MeCab library via ctypes if the Python binding is not installed

バージョン 1.1 で追加.

mecab のインストール

brew で有るか探してみる

$ brew search mecab
mecab          mecab-ipadic
$ brew info mecab
mecab 0.993
http://mecab.sourceforge.net/
Not installed
http://github.com/mxcl/homebrew/commits/master/Library/Formula/mecab.rb

ありました☆

Install と 動作試験

$ brew install mecab mecab-ipadic
==> Downloading http://mecab.googlecode.com/files/mecab-0.993.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/mecab/0.993
==> make install
/usr/local/Cellar/mecab/0.993: 17 files, 2.9M, built in 18 seconds
==> Downloading http://downloads.sourceforge.net/project/mecab/mecab-ipadic/2.7.
######################################################################## 100.0%
==> ./configure --disable-debug --prefix=/usr/local/Cellar/mecab-ipadic/2.7.0-20
==> make install
/usr/local/Cellar/mecab-ipadic/2.7.0-20070801: 5 files, 16K, built in 17 seconds

なお、mecab は mecab-ipadic とセットでインストールする必要があります。 mecabのみインストールすると、使うときに

param.cpp(69) [ifs] no such file or directory: /usr/local/Cellar/mecab/0.993/lib/mecab/dic/ipadic/dicrc

の様なエラーが出ます。

さて、入ったんで単体で使ってみる

$ mecab
ほげほげほげほげ
ほ      動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ      名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
ほ      動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ      名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
ほ      動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ      名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
ほ      動詞,自立,*,*,五段・ラ行,体言接続特殊2,ほる,ホ,ホ
げ      名詞,接尾,一般,*,*,*,げ,ゲ,ゲ
EOS
隣の客はよく柿食う客だ
隣      名詞,一般,*,*,*,*,隣,トナリ,トナリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
客      名詞,一般,*,*,*,*,客,キャク,キャク
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
よく     副詞,一般,*,*,*,*,よく,ヨク,ヨク
柿      名詞,一般,*,*,*,*,柿,カキ,カキ
食う     動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客      名詞,一般,*,*,*,*,客,キャク,キャク
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS

python に mecab をバインディングする

ノート

ちなみに、バンディングせずに使ってみよとしたが、残念ながらうまくいかない。(search/ja.pyを書き換えても、Segmentation faultになる ..orz)

mecab のライブラリサイト からpythonのバインディング用パッケージを取得する。

$ wget http://mecab.googlecode.com/files/mecab-python-0.993.tar.gz
$ tar xvzf mecab-python-0.993.tar.gz
$ cd mecab-python-0.993
$ python ./setup.py build
running build
running build_py
creating build
creating build/lib.macosx-10.4-x86_64-2.7
copying MeCab.py -> build/lib.macosx-10.4-x86_64-2.7
running build_ext
building '_MeCab' extension
creating build/temp.macosx-10.4-x86_64-2.7
/usr/bin/llvm-gcc -fno-strict-aliasing -O3 -march=core2 -w -pipe -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/Cellar/mecab/0.993/include -I/usr/local/Cellar/python/2.7.2/include/python2.7 -c MeCab_wrap.cxx -o build/temp.macosx-10.4-x86_64-2.7/MeCab_wrap.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
/usr/bin/llvm-g++ -bundle -undefined dynamic_lookup -L/usr/local/Cellar/readline/6.2.1/lib build/temp.macosx-10.4-x86_64-2.7/MeCab_wrap.o -L/usr/local/Cellar/mecab/0.993/lib -lmecab -lstdc++ -o build/lib.macosx-10.4-x86_64-2.7/_MeCab.so

$ sudo python ./setup.py install
Password:
running install
running build
running build_py
running build_ext
running install_lib
copying build/lib.macosx-10.4-x86_64-2.7/_MeCab.so -> /usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages
copying build/lib.macosx-10.4-x86_64-2.7/MeCab.py -> /usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages
byte-compiling /usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/MeCab.py to MeCab.pyc
running install_egg_info
Writing /usr/local/Cellar/python/2.7.2/lib/python2.7/site-packages/mecab_python-0.993-py2.7.egg-info

Sphinx の conf.py で有効にする

sphinx の conf.py に以下の2行を追加

html_search_laguage = 'ja'
html_search_options = {'type':'mecab'}

これでもう少し日本語検索が賢くなるはずだ。

たとえば、mecab使用前だと とりあえず なんて言葉は検索してくれないが、mecab後は上手い具合に検索してくれる様になった。

mecab にユーザ辞書を追加する

分ち書きなどで特定単語を判断できるようにするために、ユーザ辞書を追加することが出来ます。

手順はざっくり以下の通り

  1. ユーザ辞書csvファイルを作成
  2. ユーザ辞書csvファイルをバイナリの.dicにビルド
  3. ユーザ辞書 .dic を参照する様に mecabrc を更新

ユーザ辞書csvファイルを作成

ユーザ辞書は以下の書式を csv ファイルで作成し、ビルドすることで作成できます。

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

文脈IDは空にしておくと mecab-dict-index が自動的に ID を付与します。 活用形などは * にしておけば良い。

作成例

工藤,1223,1223,6058,名詞,固有名詞,人名,名,*,*,くどう,クドウ,クドウ
ほげほげ,,,0,名詞,一般,*,*,*,*,ほげほげ,*,*
ふがふが,,,0,名詞,一般,*,*,*,*,ふがふが,*,*

また、カラムを増やして備考を追記しても良い。(以下の例は最後に “追加エントリ” を追加)

ユーザ設定,,,10,名詞,一般,*,*,*,*,ユーザ設定,ユーザセッテイ,ユーザセッテイ,追加エントリ

なお、dicは任意の所に生成できるが、今回は ipadic と同じ階層に userdic ディレクトリを作ってみる。

$ cd /usr/local/Cellar/mecab/0.993/lib/mecab/dic
$ mkdir userdic
$ cd userdic
$ pwd
/usr/local/Cellar/mecab/0.993/lib/mecab/dic/userdic
$ cat myDict.csv
ほげほげ,,,0,名詞,一般,*,*,*,*,ほげほげ,*,*
ふがふが,,,0,名詞,一般,*,*,*,*,ふがふが,*,*

ユーザ辞書csvファイルをバイナリの.dicにビルド

ビルドはmecab付属のコマンド mecab-dict-index を使う

辞書のコンパイル時のオプションは

  • -d DIR: システム辞書があるディレクトリ
  • -u FILE: FILE というユーザファイルを作成
  • -f charset: CSVの文字コード
  • -t charset: バイナリ辞書の文字コード
$ pwd
/usr/local/Cellar/mecab/0.993/lib/mecab/dic/userdic
$ /usr/local/Cellar/mecab/0.993/libexec/mecab/mecab-dict-index -d/usr/local/Cellar/mecab/0.993/lib/mecab/dic/ipadic \
> -u myDict.dic -f utf8 -t utf8 myDict.csv
reading myDict.csv … 2
emitting double-array: 100% |###########################################|

done!

$ ls -tlrs
total 24
 8 -rw-r--r--  1 joey  staff   170  6  3 06:21 myDict.csv
16 -rw-r--r--  1 joey  staff  4389  6  3 06:22 myDict.dic

ユーザ辞書 .dic を参照する様に mecabrc を更新

ユーザ辞書の参照は mecab/dic/ipadic/dicrc もしくは etc/mecabrc に以下を追加することで追加できる。

userdic = /home/foo/bar/foo.dic

今回は mecabrc に追記した。

$ cd /usr/local/Cellar/mecab/0.993/etc/
$ cp mecabrc mecabrc_bak
$ vi mecabrc
$ diff -u mecabrc_bak mecabrc
--- mecabrc_bak        2012-06-03 06:13:37.000000000 +0900
+++ mecabrc    2012-06-03 06:19:23.000000000 +0900
@@ -6,6 +6,7 @@
 dicdir =  /usr/local/Cellar/mecab/0.993/lib/mecab/dic/ipadic

 ; userdic = /home/foo/bar/user.dic
+userdic = /usr/local/Cellar/mecab/0.993/lib/mecab/dic/userdic/myDict.dic

 ; output-format-type = wakati
 ; input-buffer-size = 8192