December 29(Thu), 2011
php_mecabのインストールに凄くハマりました(時間を費やしたという意味で)
otoge.netの音ゲーの数が増えてきたので、そろそろMecabを使用した検索機能を実装しようと思い、調べた記事を参考に作業を進めていたのですが、MecabをPHPから利用するためのモジュールであるphp_mecabのインストールで数時間程はまってしまい、凄く嫌な思いをしたので備忘録として残しておきます。
まず、事前にイカサイトにてMecabと辞書をインストールしておきます。
MeCab: Yet Another Part-of-Speech and Morphological Analyzer
そして、php_mecabをイカのようにインストールします。
pear channel-discover pecl.opendogs.org pear remote-list -c opendogs sudo pear install opendogs/mecab-beta
普通はこれで上手くいくはずなのですが、
略 tmp/pear/temp/mecab/mecab.c: In function ‘php_mecab_node_list_func’: /tmp/pear/temp/mecab/mecab.c:1521:37: error: ‘mecab_node_t’ has no member named ‘sentence_length’ /tmp/pear/temp/mecab/mecab.c:1524:9: error: ‘mecab_node_t’ has no member named ‘sentence_length’ /tmp/pear/temp/mecab/mecab.c:1528:23: error: ‘mecab_node_t’ has no member named ‘end_node_list’ /tmp/pear/temp/mecab/mecab.c:1528:52: error: ‘mecab_node_t’ has no member named 略 make: *** [mecab.lo] エラー 1
その後色々調べてみても、原因っぽいものは中々見つからなかったのですが、調べた中で少し気になる記事を見つけました。
その記事はPHPではなくRubyの話だったのですが、Mecabとモジュールのバージョンの違いでインストールに失敗した、的な内容でした。
それを見て、php_mecabのインストールの参考にしていた記事が比較的最近のものだったという点と、php_mecabのREADMEにMecabのバージョンに関する記述は特に無かったという点から、バージョンに関しては、そういえば余り気にしていなかったと思い、Mecabのサイトを改めて参照してみると、僕がインストールしていたMecabは0.99で、その更新日は一週間前の2011-12-24と、凄くタイムリーなバージョンとなっていました。
2011-12-24 MeCab 0.99
MeCab::Model, MeCab::Lattice クラスを追加
マルチスレッド環境でのユーザビリティの向上。複数スレッドが同一辞書を共有しながら解析可能に
同一辞書を参照する場合、辞書へのリファレンスを自動的に共有する機能の削除。 (MeCab::Model を使って同一のことが可能なため)
解析中にアトミックに辞書をアップデートする機能の追加 Model::swap()
online learning, HMM, EM learning の各実験コードを削除
MeCab::Node:(begin|end)_node_list メンバの削除
細かいバグの修正
となっており、先ほどのエラーメッセージと凄く関連していてそうな変更点が記述してありました。
ほぼ間違いなくこれが原因のような気がするじゃなイカ、ということでMeCab 0.98を改めてインストールした後、php_mecabをインストールしてみると普通に成功しました。
結果としては、ただのバージョン違いでしたが何だか凄く疲れました。
終わり

