Yahoo!の形態素解析APIをPHPから使う

そんな話はそこら中にあるでしょうが、まあ念のため。
結果をいただくだけなら大したことないけど、結果の使い方を忘れちゃうので。
ひょっとしたら変なこと、やばいことをしている可能性もありますが。

まずは結果をいただくところ。


/**
 * Yahoo!形態素解析を行う。
 * @param $appid string アプリケーションID
 * @param $text string 解析対象テキスト
 * @param $results string 結果の種類 "ma" or "uniq" or "ma,uniq"
 * @return SimpleXML 結果
 */
function yahoo($appid, $text, $results = "uniq") {
	$data = array("appid" => $appid, "sentence" => $text, "results" => $results);
	
	$response = http_post("http://api.jlp.yahoo.co.jp/MAService/V1/parse", $data);
	if ($response === false) {
		return false;
	} else {
		return simplexml_load_string($response);
	}
}

/**
 * http postを行う。
 * @param $url string URL
 * @param $data array postするデータ。連想配列で渡す。?a=1&b=愛 なら array('a'=>1, 'b'=>'愛')
 * @param $optional_header array 追加で渡したいリクエストヘッダ
 * @return string 結果
 */
function http_post($url, $data, $optional_header = null) {
	$data = http_build_query($data, "", "&");
	
	//header
	$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		"Content-Length: ".strlen($data)
	);
	if (null !== $optional_header) {
		array_push($header, $optional_header);
	}
	$context = array(
		"http" => array(
			"method"  => "POST",
			"header"  => implode("\r\n", $header),
			"content" => $data
		)
	);
	
	return file_get_contents($url, false, stream_context_create($context));
}

yahoo()にappid(Yahoo!デベロッパーなんたらでもらえる)=$appidと解析対象のデータ=$textを渡せばSimpleXMLで結果を返します。$resultsは”uniq”か”ma”を渡すことができて、”uniq”だと形態素がディスティンクトされて(同じものはマージされて)帰ってきます。”ma”ならそんなことせずに返します。まあ、実は両方渡せたり(”ma,uniq”)、ほかにもいろいろパラメータあったりしますがそんなのはめんどくさいので無視です。できるだけ簡単に使いたいんです。
http_post()は特にyahooに特化しているわけではないです。単にpostする関数です。どっかから拾ってきてぱくってきた気がします。

で、結果を使うとき。


$xml = yahoo("xxxxxx", "特にyahooに特化しているわけではないです。単にpostする関数です。どっかから拾ってきてぱくってきた気がします。", "ma");
foreach ($xml->ma_result->word_list->word as $word) {  // "uniq"にしたときは$xml->uniq_result
        // ma_resultの下にあるword_listのさらに下にwordがいっぱいぶら下がってます。
	$words[] = (string)$word->surface;  // 形態素はsurfaceです。「特化」とか「いる」とか「関数」とかそんなん。
	if ($word->pos == "名詞") {
                // 品詞はposに入っています。
                // 形容詞,形容動詞,感動詞,副詞,連体詞,接続詞,接頭辞,接尾辞,名詞,動詞,助詞,助動詞,特殊
                // があります。
		$meishi[] = (string)$word->surface;
	}
}

投げっぱなしですが・・・・

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: PHP, Tips パーマリンク

コメントを残す

メールアドレスが公開されることはありません。