人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP Mecab

http://qiita.com/eme-fes456/items/7d5d481a167743f00c5e

でパイプラインでPHPからMecabにデータを送っているのですが、大量のデータを送る場合はどのようにすればよいでしょうか?

一気に大量のデータを上のパイプラインで送ると、Mecabから何もデータが帰ってきません。

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● cubick
●100ポイント

"--input-buffer-size"というオプションがあるようなので、こちらを調節してみては。

http://www.mwsoft.jp/programming/munou/mecab_command.html#input-buffer-size


2 ● 牛乳先生(tukihatu)
●100ポイント

コメントの質問に一応回答しておきます。
作っている物の中で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へのアクセスを緩やかにしてみるといいかとおもいます。


webtomakeさんのコメント
牛乳先生、ありがとうございます! Windowsで動かしてみたのですが、Array ( ) とだけしか表示されないようです。 エラー解決案なにかありますでしょうか?

牛乳先生(tukihatu)さんのコメント
$MeCabという変数にMeCabをインストールしているパスを入れないとうごかなかったり? $exe_pathのようにかけばOK それでも動かない場合はコードがどこかまちがってるんだろうなあ。。。 $handleのあとでecho $handle;などすればエラーがわかるかもしれませんが

webtomakeさんのコメント
ありがとうございます! >$handleのあとでecho $handle;などすればエラーがわかるかもしれませんが Resource id #2Array ( ) と表示されますね。。。 うまく値をコマンドに渡せてないのかなぁ..

牛乳先生(tukihatu)さんのコメント
帰りを見る限り通信は成功している?ようなので変数にうまく格納できていないのかもしれません。 $get_MeCabをechoしてみれば(ちゃんと成功していれば)mecabからの返り値がすべて確認できるはずです。 もしかしたら、最後に表示させるときecho $keywordとかにしてませんか?その場合array()と表示されると思います。 正しくはver_dump($keyword);でやってみてください。もしくはecho $keyword[0]とか

牛乳先生(tukihatu)さんのコメント
まちがえたvar_dump($keyword);でした
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ