このままでいっか

アニメとか,プログラミングとか,研究とか,思ったことそのまま書く感じで

MAMPのPHPからMecabを使おうとしたら少しハマった話!

MAMP上でPHPを使い,そこからMecabを使うときに少しハマって時間がもったいなかったので誰のためというわけでもない備忘録的な何かを.

前提条件

Exec/Systemの実行でエラー

MAMPMecabのインストールはたくさん記事があるのでそちらを参照してください.

PHPからMecab(や外部プログラム)を呼び出すときは以下のようにExecやSystem関数を使えばできます.

<?php
  $input_str = $_GET["str"];
  $command = "echo ".$input_str." | mecab";
  exec($command, $output, $return_value);
  print_r($output);
?>

これは何も難しいところはなく,何かしらの文字列をGETで受け取り,その文字列をそのままmecabに投げてパースした結果が格納された配列をそのまま表示するという意図のコードです.

これをindex.phpとして保存し,呼び出します.期待する結果は以下のようなものですね.

bash-3.2$ curl http://localhost/index.php?str=冴えない彼女の育て方は面白いよね
Array
(
    [0] => 冴え    動詞,自立,*,*,一段,未然形,冴える,サエ,サエ
    [1] => ない    助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
    [2] => 彼女    名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ
    [3] => の   助詞,格助詞,一般,*,*,*,の,ノ,ノ
    [4] => 育て    動詞,自立,*,*,一段,連用形,育てる,ソダテ,ソダテ
    [5] => 方   名詞,接尾,特殊,*,*,*,方,カタ,カタ
    [6] => は   助詞,係助詞,*,*,*,*,は,ハ,ワ
    [7] => 面白い 形容詞,自立,*,*,形容詞・アウオ段,基本形,面白い,オモシロイ,オモシロイ
    [8] => よ   助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
    [9] => ね   助詞,終助詞,*,*,*,*,ね,ネ,ネ
    [10] => EOS
)

それはさておき,本来上記の出力があってほしいわけですが,MAMPの場合,設定などを何もしない状態だと以下のような出力になってしまいます.

bash-3.2$ curl http://localhost/index.php?str=冴えない彼女の育て方は面白いよね
Array
(
)

中になにも入っていない配列が返ってきているようです. Execのエラーコードを確認するためにindex.phpを以下に書き換えて実行します.

<?php
  $input_str = $_GET["str"];
  $command = "echo ".$input_str." | mecab";
  exec($command, $output, $return_value);
  echo $reurn_value;
?>
bash-3.2$ curl http://localhost/index.php?str=冴えない彼女の育て方は面白いよね
127

0でないステータスコード127が返ってきていますので,実行時に何かエラーが起きていることがわかります.

解決策

ググりと試行錯誤の後に見つけました.

stackoverflow.com

このあたりで,PHPがコマンド(今回の場合,mecab)を見つけられていない可能性に言及していましたので,Stackoverflowのやり取りにあるように,絶対パスで指定するようにしてみます.

bash-3.2$ which mecab
/usr/local/bin/mecab

なので,

  $command = "echo ".$input_str." | mecab";

この部分を

  $command = "echo ".$input_str." | /usr/local/bin/mecab";

に変えて実行してみます.

bash-3.2$ curl http://localhost/index.php?str=冴えない彼女の育て方は面白いよね
Array
(
    [0] => 冴え    動詞,自立,*,*,一段,未然形,冴える,サエ,サエ
    [1] => ない    助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
    [2] => 彼女    名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノジョ
    [3] => の   助詞,格助詞,一般,*,*,*,の,ノ,ノ
    [4] => 育て    動詞,自立,*,*,一段,連用形,育てる,ソダテ,ソダテ
    [5] => 方   名詞,接尾,特殊,*,*,*,方,カタ,カタ
    [6] => は   助詞,係助詞,*,*,*,*,は,ハ,ワ
    [7] => 面白い 形容詞,自立,*,*,形容詞・アウオ段,基本形,面白い,オモシロイ,オモシロイ
    [8] => よ   助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
    [9] => ね   助詞,終助詞,*,*,*,*,ね,ネ,ネ
    [10] => EOS
)

できました.

phpinfoを見ると,

f:id:dbym4820:20171018165925p:plain

ということで,PATHが通っていないという話でした.

Neologdを添えて...

というわけで,くだらない問題に時間をかけてしまいました.

https://github.com/neologd/mecab-ipadic-neologd 最後にNeologdを用いて同じ文章をパースするPHPスクリプトだけ書いて終わります.

github.com

当然ですが,ほぼさっきと同じです.

<?php
  $input_str = $_GET["str"];
  $command = "echo ".$input_str." | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd";
  exec($command, $output, $return_value);
  print_r($output);
?>

単にmecabコマンドの後ろに,Neologdの絶対パスを指定すればいいだけですね. 呼び出してみます.

bash-3.2$ curl http://localhost/index.php?str=冴えない彼女の育て方は面白いよね
Array
(
    [0] => 冴えない彼女の育て方    名詞,固有名詞,一般,*,*,*,冴えない彼女の育て方,サエナイヒロインノソダテカタ,サエナイヒロインノソダテカタ
    [1] => は   助詞,係助詞,*,*,*,*,は,ハ,ワ
    [2] => 面白い 形容詞,自立,*,*,形容詞・アウオ段,基本形,面白い,オモシロイ,オモシロイ
    [3] => よ   助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
    [4] => ね   助詞,終助詞,*,*,*,*,ね,ネ,ネ
    [5] => EOS
)

いい感じですね.

おわりに

簡単なことですが,意外と足を救われることがあるのかもしれない...