MeCabを使う

作成日:2006-07-29
最終更新日:

1. わかち書きとMeCab

Namazu は、検索インデックスを作るために、 わかち書きのシステムを起動する。 従来は、わかち書きのシステムとして Kakasi が使われるのが一般的であった。 しかし、新しいわかち書きシステムとして、MeCab (和布蕪) が登場した。 ここでは LINUX に MeCab をインストールし、Namazu へ組み込んだ結果を述べる。

  1. まず MeCab をインストールする。インストール方法は、 MeCab 0.98 のインストール方法 (www.asahi-net.or.jp) 参照。
  2. Namazu を再コンパイルする。
    % make clean
    % make
  3. Namazu を再インストールする。
    % sudo make install
  4. mknmz を -b オプションをつけて起動する。
    % mknmz -b 
    検索対象のファイルを調べています... ***ファイルは更新されています (中略) *個のファイルがインデックス作成の対象として見つかりました (中略) [追加] 日付: Sat Jul 29 06:53:44 2006 追加された文書の数: 16 更新された文書の数: 10 サイズ (bytes): 92,034 合計の文書数: 1,129 追加キーワード数: 387 合計キーワード数: 94,307 わかち書き: module_mecab -Owakati -b 8192 経過時間 (秒): 23 ファイル/秒: 1.13 システム: linux

「わかち書き」欄に、module_mecab と表示されていれば、 MeCab が正しくインストールされている。

2. MeCab の優位性

では、MeCab と Kakasi の違いは何だろうか。 MeCab は当初から、日本語のわかち書きを目標としている。 一方、Kakasi は、もともと日本語をローマ字で表すために作られた。 そのため、わかち書きの精度が MeCab に比べて劣る。 特に、ひらがなだけで作られた文章のわかち書きで、その差が顕著だ。

例:「新しいわかち書きシステム」という文を、 それぞれのシステムでわかち書きさせる

MeCab
新しい わかち書き システム
Kakasi
新し いわかち 書き システム

上の通り、MeCab が優れている。

3. なぜ MeCab を採用したか

世の中の常として、優れているものが採用されるとは限らない。 Namazu にしても、わかち書きシステムに MeCab を採用しているのは、 少ないだろう。その理由は、わかち書きシステムは Kakasi で稼働していて、 これで何ら問題ないからだろう。 システムは安定稼働して初めて意味がある。 MeCab は、まだ実績が少ない。

にもかかわらず、なぜ私は MeCab を採用したか。 一つには、優れたシステムが広まる一助になってほしいからだ。 また、私のWEBページの全文検索である Namazu は趣味のページであるため、 稼働率がどうなろうと、自分の自由となるからである。 そして、最後の理由は、自分のページでひらがなを多く使っているからだ。 特に「つれあい」ということばが多い。 これを Kakasi を使ってわかち書きすると、つれあいの前後の言葉を拾って、 キーワードを切り出してしまう。そのため、「つれあい」のヒット率が落ちる。

ちなみに、Kakasi が切り出した「つれあい」を含むキーワードは 205 個もあった。

%  grep -c "つれあい" NMZ.w 
205

短いキーワードは、もちろん「つれあい」4文字である。 長いキーワードを、いくつか挙げる。

これらは、適度に漢字を混ぜれば、 これほど長いキーワードにはならなかったろう。 「美味しい」、「言う」、「色々」、「殆ど」、「任せっきり」 など。しかし、「美味しい」、「色々」、「殆ど」は、 使いたくない。文章が固くなるからだ。

そんなことで悩んでいたら、Namazu が MeCab に対応した、ということを聞き、 インストールすることにした。

4. MeCab の長所と短所

さて、MeCab をインストールして、インデックスを作りなおした。 すると、「つれあい」を含むキーワードは、1つだけになった。 以前は205個だったのだから、劇的な減少である。

作りなおしたインデックスで、「つれあい」を検索すると、 181文書がヒットする。1文書で2個所以上、 「つれあい」という言葉を使うことが多いから、妥当な数字だろう。これは長所である。 以前の Kakasi を使ったシステムで、「つれあい」を検索すると、 15文書しかヒットしない。ワイルドカードを使って「*つれあい*」とすれば 181文書がヒットするが、 わざわざワイルドカードを利用者に強制するのは酷だろう。

短所もある。一つは辞書が大きいことだ。しかし、私は気にしていない。 もう一つは、中黒(・)のある単語を前後まとめて扱ってしまうことである。 例えば、アリスター・コーバーンは一つの単語として扱う。 したがって、「アリスター」を入れただけでは、 アリスター・コーバーンと続けて書かれている文書にはヒットしない。 これは短所である。お手数であるが、ワイルドカード*を使って頂きたい。

5. MeCab の辞書への単語追加

Mecab の辞書へ、ユーザ定義の単語を追加する(登録する)方法は、 MeCab: 単語の追加方法(mecab.sourceforge.jp)を参照して頂きたい。 なお、追加時の「品詞細分類」が具体的に何を意味するかは、 Yusuke MATSUBARA さんの 形態素解析器 MeCab に単語を追加する:POS ID ( www-tsujii.is.s.u-tokyo.ac.jp ) に書かれている。mecab-ipadic/pos-id.def も参照のこと。

6. Windows での Mecab

以上述べたことは、Linux 上での Mecab であった。 2008年11月からは訳あって Windows XP を使っている。そのときに、 Kakasi に戻したのだった。

Windows でも Mecab は使えるはずなので、試してみた。 準備は次の2つである。

  1. mecab 用の辞書とPerl Moduleを設定する。Mecab に関する Namazu のブログ参照。
  2. namazurc で次の設定をする。
    $WAKATI = $MECAB;

1. の注意でも書かれているが、Windows 版の Mecab を入手する必要はない。

これで無事 Mecab での分かち書きが行われた。

7. FreeBSD での Mecab

今度は、レンタルサーバ上での Mecab が使えるかを試してみることにした。 レンタルサーバは、FreeBSD で動いている。 どうやら、mecab コマンドはあるようだ。まずはコマンドを打ってみた。

% mecab
tagger.cpp(133) [load_dictionary_resource(param)] param.cpp(30) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc

これは、辞書が /usr/local/lib/mecab/dic/ipadic/dicrc にはないことを示している。 そこでレンタルサーバの中の辞書を探したが、みつからなかった。

辞書がなければ作るしかない。sourceforge から辞書を入手し、configure → make をしてみたのだが、 次のエラーで停止してしまった。

terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
reading ./Verb.csv ... *** Signal 6

各所を見ると、このエラーはメモリが足りないことを表している。 レンタルサーバなので、個人の権限ではメモリを増やせないのだろうか。

今度は、FreeBSD の Ports を入手してはどうかと考えた。これならコンパイルは必要ないはずだ。 これで

% mecab -d hogehoge/mecab/dic/ipadic
tagger.cpp(143) [tokenizer_.open(param)] tokenizer.cpp(107) [unkdic_.open(create_filename(prefix, UNK_DIC_FILE).c_str())] dictionary.cpp(50) [version_ == DIC_VERSION] incompatible version: 102

バージョンが違うらしい。mecab のバージョンはサーバにあるのが 0.93 である。 では、mecab のほうも最新バージョンを ports で持ってきてみよう。動くだろうか。

% .mecab
/libexec/ld-elf.so.1: Shared object "libstdc++.so.6" not found, required by "mecab"

シェアドオブジェクトがない。ちなみに、サーバにあるのは libstdc++.so.5 である。 ああ、これは mecab の最新版を作るために make から行わないといけないようだ。

8. FreeBSD での Mecab(続)

その後、ふと考えて、レンタルサーバーの管理者に「辞書を入れてくれ」と頼めばよいことに気が付いた。 依頼を出して数日後に、インストールしました、との回答があった。 まずサーバーに ssh でログインして、
% mecab
を試してみたら、エラーメッセージは消えた。 その後の文章入力でも正しい分かち書きの結果が得られた。( 2009-12-06 )

9. Kakasi と Mecab の比較

私の検索のページでは、 Kakasi の検索結果と Mecab の検索結果の両方を試すことができる(同時にはできない)。 ( 2009-12-06 )

10. MeCab の不具合

今さらながら、Namazu がうまく働かないことに気づいた。下記がログの状態である。

No matching function for overloaded 'new_Tagger' at /usr/local/lib/perl5/site_perl/mach/5.20/MeCab.pm line 355.

http://www.namazu.org/pipermail/namazu-win32-users-ja/2007-December/001083.html

あたりを見て自分でなんとかすることにした。

% echo test | /usr/local/bin/mecab 
		viterbi.cpp(50) [tokenizer_->open(param)] tokenizer.cpp(130)
    [sysdic->isCompatible(*d)] incompatible dictionary:
    /home/**/**/***/mecab/dic/namazu.dic

困りましたね。
https://taku910.github.io/mecab/dic.html にしたがって、辞書を作り直した。 % /usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic -u foo.dic -f euc-jp -t euc-jp namazu.csv

まりんきょ学問所全文検索システム Namazu > MeCabを使う


MARUYAMA Satosi