形態素解析「MeCab」と「php_mecab」を使った(複合)名詞の抽出
PHPでutf-8用の形態素解析を利用するために「MeCab」と「php_mecab」をインストールしてみました。 ついでに、テキスト文から名詞を配列で抽出するサンプルも作ってみましたよ。
サーバー環境
今回は以下のような環境で構築してみます。
- OS: CentOS 5.3 (Final)
- PHP: 5.1.6
- MeCab: 0.98
追記:MeCabは2012/2/12以降、sourceforgeからgooglecodeにダウンロード先が変わり、バージョンも変わっています。 詳しくはこちら。
追記:今はGitHubで管理されているようです。
MeCabのダウンロード&インストール
まず、SSHでrootユーザーになり、rootディレクトリに移動
#su - (パスワード) #cd
MeCabのソースをダウンロード
# wget http://sourceforge.net/projects/mecab/files/mecab/0.98/mecab-0.98.tar.gz/download# wget http://mecab.googlecode.com/files/mecab-0.98.tar.gz Resolving jaist.dl.sourceforge.net... 150.65.7.130, 2001:200:141:feed::feed Connecting to jaist.dl.sourceforge.net|150.65.7.130|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 1424588 (1.4M) [application/x-gzip] Saving to: `mecab-0.98.tar.gz' ...
展開&インストール
インストール時に容量削減のため、UTF-8サポートのみのモードにします。
# tar zxfv mecab-0.98.tar.gz # cd mecab-0.98 # ./configure --enable-utf8-only # make # make install
辞書のダウンロード&展開&インストール
辞書がないと使えないので辞書もインストール。辞書は標準の「ipadic」よりも後継である「naist-jdic」が良いとのことなので、naist-jdicの最新版であるVer.0.6.3をインストールしてみます。
# wget http://iij.dl.sourceforge.jp/naist-jdic/48487/mecab-naist-jdic-0.6.3-20100801.tar.gz # tar zxvf mecab-naist-jdic-0.6.3-20100801.tar.gz # cd mecab-naist-jdic-0.6.3-20100801 # ./configure --with-charset=utf8 # make # make install
辞書とMeCabを紐付け
MeCabの設定ファイルを編集して、辞書をnaist-jdicに紐付けます。
# vi /usr/local/etc/mecabrc ----------------------------------------------- ;dicdir = /usr/local/lib/mecab/dic/ipadic (コメントアウト) dicdir = /usr/local/lib/mecab/dic/naist-jdic (追加) (後略) -----------------------------------------------
MeCab用のPHPモジュール「php_mecab」のインストール
ダウンロード&設定
ダウンロードし、解凍します。
# wget http://www.opendogs.org/pub/php_mecab-0.3.0.tgz # tar zxvf php_mecab-0.3.0.tgz
次に、インストール用のパラメーターである「php-config」の場所と「mecab-config」の場所を確認します。
# which php-config /usr/bin/php-config # which mecab-config /usr/local/bin/mecab-config
ビルド&インストール
phpizeでビルドし、先ほどのパラメーターを付与してconfigure後、インストールします。
# cd php_mecab-0.3.0 # phpize # ./configure --with-php-config=/usr/bin/php-config --with-mecab=/usr/local/bin/mecab-config # make # make install
これで、PHPのモジュール用ディレクトリに「mecab.so」が出来れば完成です。
# ls -l /usr/lib/php/modules/|grep mecab -rwxr-xr-x 1 root root 135476 Apr 4 16:11 mecab.so
MeCabを使ってみよう
PHPから利用する場合は、php.iniファイルをいじって「extension=mecab.so」を追加するか、PHPのプログラム内で「dl()」関数を使って拡張モジュールをロードします。
php.iniをいじる場合
extension=mecab.so
書き換えたら保存して、apacheを再起動しましょう。
dl()関数を使う場合
<?php dl("mecab.so"); ... ?>
テキストから名詞だけを抜き出して配列に格納してみる(複合名詞対応版)
では、ちょっと実践的なコードを。 テキストの中で名詞だけを抜き出してみたい、という場合にMeCabを使って名詞の配列データを作ってみましょう。
さらに、MeCabのデフォルト状態では複合名詞に対応していませんが、名詞が連続していれば複合名詞として扱うようにして、軽く複合名詞対応版にしてみます。
<?php dl('mecab.so'); $mecab = new MeCab_Tagger(); $txt = "経堂に拠点を構え、ビジネス用のホームページの企画・制作・運営を行っています。"; $meisi = array(); //名詞配列 $word = ''; //複合名詞保存用バッファ変数 //名詞が見つかったらバッファに連結保存。 //名詞ではなかったらバッファの文字列(複合名詞)を名詞配列に追加し、バッファクリア。 for($node=$mecab->parseToNode($txt); $node; $node=$node->getNext()){ if($node->getStat() != 2 && $node->getStat() != 3 && mb_strpos($node->getFeature(), '名詞', NULL, 'utf-8')===0){ $word .= $node->getSurface(); } else if ($word != '') { array_push($meisi, $word); $word = ''; } } //最後が名詞で終わった場合用の追加処理。 if ($word != '') array_push($meisi, $word); //名詞の重複削除 $meisi = array_unique($meisi); print("<pre>"); print_r($meisi); print("</pre>"); ?>
実行結果はこちら。
Array ( [0] => 経堂 [1] => 拠点 [2] => ビジネス用 [3] => ホームページ [4] => 企画 [5] => 制作 [6] => 運営 )
MeCab + php_mecab による形態素解析はPHPの可能性を広げる技術ですので、ぜひ利用してみてくださいね。
2011-04-04
1 件のコメント
MacOSの場合は
php_mecabは使わないで通常のshell_execで実行しています
自分の場合はmecab+unidicです
MacOSXのSafariブラウザで
形態素解析の結果を表示したり
APPLE辞書やウィキペディア
などの検索結果をブラウザ内で直接プリントアウトできたりします
その他
バーコード付き商品アイテムの作成やプリントアウトにも対応しています
またブラウザの操作だけでゆうちょ銀行の払込取扱票に直接プリントする機能もあったりします
ぜひお試しください
http://snowjobs.blog.jp/archives/cat_mecab.html (最後尾に最初の記事があります)
http://snowjobs.blog.jp/detail_item/201710011251/4547597950043