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
あとは、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という関数がないというエラーが出ていました。。
そこで、以下の実行結果を眺めていて、はたと気づきました。
phpinfo();
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を同様に編集してくださいね。
というようには呼び出せず、
としなければならない、ということも知りました。 ネットや本の以前のコードを参考にする時には、注意が必要です。
以上、Meuでした。