PHP Mecab


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

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

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

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2015/09/03 09:19:00
  • 終了:2015/09/10 09:20:03

回答(2件)

id:cubick No.1

cubick回答回数123ベストアンサー獲得回数352015/09/03 17:36:04

ポイント100pt

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

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

id:tukihatu No.2

牛乳先生(tukihatu)回答回数180ベストアンサー獲得回数322015/09/04 11:11:57

ポイント100pt

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

他3件のコメントを見る
id:tukihatu

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

2015/09/07 11:25:43
id:tukihatu

まちがえたvar_dump($keyword);でした

2015/09/07 11:26:37
  • id:tukihatu
    Mecabならまかせろー!と意気込んでみましたが、私が以前書いたものもコマンドライン取得でした…あれ?
    大量のデータってどんなのでしょうか…?
    コマンドラインだろうがphp-mecabだろうが大量のデータ(1万文字以上とか)は一度に扱えないと思いますので分割するしかないと思いますよ。
  • id:webtomake
    牛乳先生

    コメントありがとうございます!

    10万文字を一気に投げてました。
    改行なしの、1行10万文字です。。それでは動かないですよね。。。

    ちなみにhttp://qiita.com/eme-fes456/items/7d5d481a167743f00c5e の形で
    100万行の文字を形態素解析し、1つの連想配列に結果を格納するためには
    どのような形になるのでしょうか?

    よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません