MeuDesign -僕のデザイン-

PHP/jQuery/WordPress/HTML5/CSS3やらでサイトを作っていきます

MeCabをPHP7.1で動かしてみたらハマったけど、解決

Meuです。

 

MeCabをConoHaのVPSに入れてみました。MeCabとは、形態素解析のライブラリです。形態素解析については以下を参照。

https://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90

 

以下のコマンドでインストールします。(OSはUbuntu)

 
sudo apt-get install mecab libmecab-dev mecab-ipadic
sudo aptitude install mecab-ipadic-utf8

 

無事インストールできたので、コマンドから試してみました。

 

$ mecab
完璧な文章などといったものは存在しない。完璧な絶望が存在しないようにね。
完璧  名詞,形容動詞語幹,*,*,*,*,完璧,カンペキ,カンペキ
な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
文章  名詞,一般,*,*,*,*,文章,ブンショウ,ブンショー
など  助詞,副助詞,*,*,*,*,など,ナド,ナド
といった    助詞,格助詞,連語,*,*,*,といった,トイッタ,トイッタ
もの  名詞,非自立,一般,*,*,*,もの,モノ,モノ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
存在  名詞,サ変接続,*,*,*,*,存在,ソンザイ,ソンザイ
し   動詞,自立,*,*,サ変・スル,未然形,する,シ,シ
ない  助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
。   記号,句点,*,*,*,*,。,。,。
完璧  名詞,形容動詞語幹,*,*,*,*,完璧,カンペキ,カンペキ
な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
絶望  名詞,サ変接続,*,*,*,*,絶望,ゼツボウ,ゼツボー
が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
存在  名詞,サ変接続,*,*,*,*,存在,ソンザイ,ソンザイ
し   動詞,自立,*,*,サ変・スル,未然形,する,シ,シ
ない  助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
よう  名詞,非自立,助動詞語幹,*,*,*,よう,ヨウ,ヨー
に   助詞,副詞化,*,*,*,*,に,ニ,ニ
ね   助詞,終助詞,*,*,*,*,ね,ネ,ネ
。   記号,句点,*,*,*,*,。,。,。
EOS

 

このように、単語ごとに分解して、品詞やら読み仮名やらの情報を表示してくれました。この情報を、PHPから使うサイトを作ってみたいと思います。

そのための環境構築は以下のようにしました。

 

$ php --version
PHP 7.1.0-5+deb.sury.org~xenial+1 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.1.0-5+deb.sury.org~xenial+1, Copyright (c) 1999-2016, by Zend Technologies
# PHP7.1が入っていたので、(PHPのバージョンに合わせて)php7.1-devを入れる
$ sudo apt-get install php7.1-dev
$ git clone https://github.com/rsky/php-mecab.git
$ cd php-mecab/mecab/
$ phpize
$ ./configure
$ make
$ make test
$ sudo make install

 

すなわち、php-mecabをインストールしたのですね。

 

あとは、mecab.iniを以下のように作成しました。

 

sudo vi /etc/php/7.1/mods-available/mecab.ini

 

内容は以下。

 

extension=mecab.so

 

さらに、/etc/php/7.1/cli/conf.d/にシンボリックリンクを置きます。

 

$ sudo ln -s /etc/php/7.1/mods-available/mecab.ini /etc/php/7.1/cli/conf.d/20-mecab.ini

 

そしてApacheを再起動。

 

$ sudo /etc/init.d/apache2 restart

 

以下のphpコードで動作テストしてみます。

 

<html>
<head>
<title>PHP Mecab Test</title>
</head>
 
<body>
<?php
$str = "完璧な文章などといったものは存在しない。完璧な絶望が存在しないようにね。";
 
echo $str." の形態素解析:<br><br>";
 
$mecab = new \MeCab\Tagger();
$nodes = $mecab->parseToNode($str);
 
foreach ($nodes as $i) {
        $word = $i->getSurface();
        $info = $i->getFeature();
        echo $word." ".$info."<br>";
}
?>
</body>
</html>
 

が、動かない。。 以下のようにしてコマンドで実行してみると、MeCab_Taggerという関数がないというエラーが出ていました。。

 

$ php php_mecab_test.php

 

そこで、以下の実行結果を眺めていて、はたと気づきました。

 

phpinfo();

 

  1. Apache上では、PHP7.1でなく7.0が動いていること。
  2. mecab.iniが読み込まれていないこと。

1番目については、いろいろ調べた挙句、以下のようにして、シンボリックリンクを7.0のものから7.1のものに変更してApache再起動で、Apache上でも7.1が動くようにしました。

 

$ sudo unlink php7.0.conf
$ sudo unlink php7.0.load
$ sudo ln -s ../mods-available/php7.1.conf ./php7.1.conf
$ sudo ln -s ../mods-available/php7.1.load ./php7.1.load

 

2番目については、Apache上で動かす場合には、/etc/php/7.1/apache2/conf.d/以下にもシンボリックリンクが必要なようなので、作成。

 

$ cd /etc/php/7.1/apache2/conf.d

$ sudo ln -s /etc/php/7.1/mods-available/mecab.ini ./20-mecab.ini

 

そしてApacheを再起動。

 

$ /etc/init.d/apache2 restart

 

無事、動きました。

以下で実際に動作を試すことができます。

http://meuapp.xyz/php_mecab_test.php

なお、mecab.iniを作らずとも、/etc/php/7.1/apache2/php.iniに

 

extension=mecab.so

 

と追記してApache再起動するだけでも動くことも確認できました。 どっちのやり方でやるかは好みなのかな? ちなみにphpコマンドからもMecabを使いたい場合は、/etc/php/7.1/cli/php.iniを同様に編集してくださいね。

あと、PHP7用のphp-mecabでは、かつてのように

 

MeCab_Tagger()

 

というようには呼び出せず、

 

\MeCab\Tagger()

 

としなければならない、ということも知りました。 ネットや本の以前のコードを参考にする時には、注意が必要です。

 

以上、Meuでした。