さくらサーバ上でPHPから形態素解析(Mecab)を使用してみる php_mecab導入編


Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 700

Warning: Invalid argument supplied for foreach() in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 707

Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 700

Warning: Invalid argument supplied for foreach() in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 707

前回(Mecab導入編)からの続きで、今回はMecabをPHP上から利用できるように、PHP用のエクステンションの導入と、PHPからの使用を説明します。

php_mecabのコンパイル&インストール

以下のコマンドでphp_mecabをダウンロード&コンパイル&インストールします。
インストールの設定は、mecabの情報取得に前回導入したmecabのmecab-configを使用するようにします。
※インストール先がホームディレクトリなので、make installを使用せずに直接モジュールをコピーしています。

mkdir -p ~/local/lib/php/extensions
git clone https://github.com/rsky/php-mecab.git
cd php-mecab/mecab
phpize
./configure --with-mecab=`echo ~`/local/bin/mecab-config
make
cp modules/mecab.so ~/local/lib/php/extensions/

次に先ほどインストールしたphp_mecabモジュールをphpに読み込ませる設定を、wwwディレクトリ下のphp.iniに書き込みます。

printf "extension=`echo ~`/local/lib/php/extensions/mecab.so\n\n" >> ~/www/php.in

php.iniへのモジュール読み取り設定が完了したら、php_mecab使用の準備は整いました。

PHPからMecabを利用
インスタンス化

phpからmecabを呼び出すには、Mecabクラスをインスタンス化します。

$mecab = new MeCab_Tagger();

上の文では、標準のIPA辞書を使って解析を行います。
Neologd辞書で解析を行いたい場合は、以下のようにオプションで指定します。
※環境に応じて”ホームディレクトリ”の部分は”/home/ユーザ名/”に修正してください。

//Mecabの使用ディレクトリ指定
$options = array(
    "-d", "ホームディレクトリ/local/lib/mecab/dic/ipadic-neologd"
);

$mecab = new MeCab_Tagger($options);
解析

先ほどインスタンス化したMecabクラスを使用して、文の解析を行います。
解析は、以下のようにparseToNodeメソッドに解析文を渡して行います。

//解析対象文
$target_str =<<<EOL
μ's(ミューズ)は、メディアミックス作品群『ラブライブ!』に登場する
架空の9人組女性スクールアイドルグループ、および劇中のパフォーマンスを
担当声優が再現する実在の9人組女性声優ユニットの双方の名称である。
現実世界における所属レーベルはランティス。
EOL;
$node = $mecab->parseToNode($target_str);
結果表示

最後に、以下のようにWhileループで結果を表示します。

while($node){
    echo "・語句:     ".$node->getSurface()."\n";
    echo "|_要点:     ".$node->getFeature()."\n";

    //次の語句へ移動
    $node = $node->getNext();
}

以上のスクリプトを実行すると、以下のような結果が得られます。


img1
以上の実行文全文を以下に載せます。

<?php
//Mecabの使用ディレクトリ指定
$options = array(
    "-d", "/home/neginium/local/lib/mecab/dic/ipadic-neologd"
);

$mecab = new MeCab_Tagger($options);

//解析対象文
$target_str =<<<EOL
μ's(ミューズ)は、メディアミックス作品群『ラブライブ!』に登場する
架空の9人組女性スクールアイドルグループ、および劇中のパフォーマンスを
担当声優が再現する実在の9人組女性声優ユニットの双方の名称である。
現実世界における所属レーベルはランティス。
EOL;

//文を解析
$node = $mecab->parseToNode($target_str);

//語句ごとに処理
while($node){
    echo "・語句:     ".$node->getSurface()."\n";
    echo "|_要点:     ".$node->getFeature()."\n";

    //次の語句へ移動
    $node = $node->getNext();
}
?>
応用編

次は、ただ結果を表示するだけではなく、名詞のみを抜き出し、同時に読みまで表示してみましょう。

以下にソースコードを載せます。

<?php
//Mecabの使用ディレクトリ指定
$options = array(
    "-d", "/home/neginium/local/lib/mecab/dic/ipadic-neologd"
);

$mecab = new MeCab_Tagger($options);

//解析対象文
$target_str =<<<EOL
μ's(ミューズ)は、メディアミックス作品群『ラブライブ!』に登場する
架空の9人組女性スクールアイドルグループ、および劇中のパフォーマンスを
担当声優が再現する実在の9人組女性声優ユニットの双方の名称である。
現実世界における所属レーベルはランティス。
EOL;

//文を解析
$node = $mecab->parseToNode($target_str);

//語句ごとに処理
while($node){
    //始点(BOS)・終点(EOS)以外を処理
    if($node->getStat() != 2 &&
        $node->getStat() != 3
    ){

        //文の要点を分解
        $feat_list = explode(",", $node->getFeature());

        //名詞のみを表示
        if(count($feat_list) > 0 && $feat_list[0] === "名詞"){
            if(count($feat_list) >= 8){
                //読みがある場合表示
                echo $node->getSurface()."(".$feat_list[7].")\n";
            }else{
                //無い場合読みを省略
                echo $node->getSurface()."\n";
            }
        }
    }
    //次の語句へ
    $node = $node->getNext();
}
?>

ソースコードを実行すると、以下のような結果が得られます。

img2

最後に

いかがだったでしょうか?Mecabは応用次第では、Twitterなどのツイートに含まれる語句の頻出語を抜き出したりと、色々と使えそうですね。私も、新しいツールをMecabで作ってみたくなりました。
この投稿が、アイデアの創出に役立てたらなによりです。
それでは、失礼します。

スポンサーリンク

シェアする

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

フォローする