形態素解析「MeCab」と「php_mecab」を使った(複合)名詞の抽出

presented by 役に立つかもしれないBlog

PHPでutf-8用の形態素解析を利用するために「MeCab」と「php_mecab」をインストールしてみました。 ついでに、テキスト文から名詞を配列で抽出するサンプルも作ってみましたよ。

サーバー環境

今回は以下のような環境で構築してみます。

追記:MeCabは2012/2/12以降、sourceforgeからgooglecodeにダウンロード先が変わり、バージョンも変わっています。 詳しくはこちら

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の可能性を広げる技術ですので、ぜひ利用してみてくださいね。

    このエントリーをはてなブックマークに追加

このページに関連のある記事はこちら

コメントフォーム