2007-10-15 22:40:12
PHPのproc_openの使い方がどうもよく判らなかった。いろいろなことを他のプログラムにさせることができそうなのだが、あまりPHPの解説本にも載っていないのだ。PHPでmecabを動かすときにも読込ませたいテキストをみっともなくファイルに保存してから読込んで実行させていたのだ。これは何とかしたいと思い、ネット上を彷徨って私にも判りそうな記述を集めて少し理解した(ような気がする)。そこで、少し理解が進んだかどうかを検証するために、Yahooの検索で集めてきたサイトの"summary"情報をmecabで分解して名詞だけを取りだし、その数を集計するスクリプトを作ってみた。
#!/usr/bin/php
<?php
//最初はYahooAPIで検索#########################
$base = "http://api.search.yahoo.co.jp/WebSearchService/V1/\\
webSearch?appid=(id)&query=";
$key = urlencode($argv[1]);
$xml = simplexml_load_file($base.$key);
foreach($xml->Result as $item){
$nouns = array();
$result = "";
$summary = $item->Summary;
$summary = ereg_replace("\.\.\.","",$summary);
$summary = ereg_replace("\"","",$summary);
$summary = ereg_replace(" ","",$summary);
$summary = ereg_replace("\("," ",$summary);
$summary = ereg_replace("\)"," ",$summary);
echo $summary."\n";
//ここからproc_openでSummary情報をmecabで######
//処理する操作が始まる########################
$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w")
);
$process = proc_open("mecab",$descriptorspec,$pipes);
if(is_resource($process)){
fwrite($pipes[0], $summary);
fclose($pipes[0]);
while(!feof($pipes[1])){
$result .= fread($pipes[1], 4096);
}
fclose($pipes[1]);
proc_close($process);
$lines = explode("\n",$result);
foreach($lines as $line){
$tab = explode("\t",$line);
$res = explode(",",$tab[1]);
if($res[0]=="名詞"){
array_push($nouns,$tab[0]);
}
}
}
$words = array_count_values($nouns);
$no = count($nouns);
arsort($words);
$i=1;
foreach($words as $key => $val){
echo $key.":".$val."回\n";
//結果表示はとりあえず最初の10件#################
if($i>10){
break;
}
$i++;
}
echo "合計".$no."語\n\n";
}
?>
ここで(id)となっているところは各自のYahoo Japan用のappidを入れる。たとえば、proctest.phpという名で保存して
php proctest.php マングースなどと打ち込んでみれば、
マングースはインド原産の食肉目の動物で、コブラの天敵として知ら れている。そこで東大の先生がマングースに注目、ハブと戦わせる実 験を行った。マングースはハブにかまれても死ぬことはなく、最後は ハブの頭に食いついて、見事にしとめたのだ。 ハブ:3回 マングース:3回 実験:1回 注目:1回 こと:1回 最後:1回 の:1回 見事:1回 頭:1回 先生:1回 東大:1回 合計23語というような感じになって、ここではマングースとハブが関係深いことが窺われる。これを利用して検索結果の分類に使えたりしないだろうかと思ったわけだ。しかし、面倒臭いのでこれ以上追究はしない。
mecabは何とかなりそうなことが判ったので、今度はRを少し操作してみたい。