http://qiita.com/eme-fes456/items/7d5d481a167743f00c5e
でパイプラインでPHPからMecabにデータを送っているのですが、大量のデータを送る場合はどのようにすればよいでしょうか?
一気に大量のデータを上のパイプラインで送ると、Mecabから何もデータが帰ってきません。
"--input-buffer-size"というオプションがあるようなので、こちらを調節してみては。
http://www.mwsoft.jp/programming/munou/mecab_command.html#input-buffer-size
コメントの質問に一応回答しておきます。
作っている物の中でMecabのコードがあったので読みやすくして乗っけておきます。参考にしてください。
(今はいろいろあってMecapiを使っているので動作チェックはしてないです)
<?php //mecab(文字分解) function mecabdate($contents){//$contentsが100万行の文字列 global $MeCab;//mecabパス $keywords = array();//配列を用意しておく //1行ずつ取り出して単語に分解する $str = strtok($contents, "\n"); while ($str != FALSE) { parsing2($MeCab, $str, $keywords);//処理内容が$keywordsに蓄積 $str = strtok("\n"); } return $keywords; } function parsing2($MeCab, $str, &$array) { $str = mb_convert_encoding($str,'SJIS');//SJISインストールだったのでSJISに $intarray = array(); //形態素解析をしたい文章を渡しつつ、MeCabへのハンドルオープン $handle = popen("echo '$str' | $MeCab", "r"); //-JH -s //結果を1行ずつ取得 while ($get_MeCab = fgets($handle)) { $get_MeCab = mb_convert_encoding($get_MeCab,'UTF8','SJIS');//SJIS戻りをUTF8に //MeCabの結果を分解 $result = $get_MeCab; $result = split("\t",$result); $result[0] = mb_ereg_replace("[\(\)\[\]][()「」」「<>『』・\-:;/”’\"\'【】。、“]","",$result[0]); $result[0] = mb_ereg_replace(" "," ",$result[0]); //結果を配列に格納する(重複可) if (!preg_match("/EOS|\'|\"/",$result[0]) && $result[0] != '') { $intarray[$result[0]] = 1; $array[] = $result[0]; } /* //結果を配列に格納する(重複不可) if (!preg_match("/EOS|\'|\"/",$result[0]) && $result[0] != '') { if (isset($intarray[$result[0]])){$intarray[$result[0]]++;} else{ $intarray[$result[0]] = 1; $array[] = $result[0]; } } */ } pclose($handle); } ?>
コードでは、Mecabで判定したデータを整形するところまでやっています。
たぶん形容詞とか動詞とかの情報はいらなかったので削除し、括弧とかも文字としていらない情報だったので結果に出ないようにしてるみたいです。
すべての結果を出したいなら$array[]=$get_MeCab;で終わりでいいと思います。
これでも100万行だと膨大すぎるので止まるかも。
止まる場合は時間制限を解除してみたり(set_time_limit)
http://php.net/manual/ja/function.set-time-limit.php
sleep(1);やusleepなどを使ってMecabへのアクセスを緩やかにしてみるといいかとおもいます。
帰りを見る限り通信は成功している?ようなので変数にうまく格納できていないのかもしれません。
2015/09/07 11:25:43$get_MeCabをechoしてみれば(ちゃんと成功していれば)mecabからの返り値がすべて確認できるはずです。
もしかしたら、最後に表示させるときecho $keywordとかにしてませんか?その場合array()と表示されると思います。
正しくはver_dump($keyword);でやってみてください。もしくはecho $keyword[0]とか
まちがえたvar_dump($keyword);でした
2015/09/07 11:26:37