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

このページをシェアする

1 件のコメント

  • snowjobs より:

    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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

2011-04-04