Y!J の日本語形態素解析 Web サービスを使ってみる
いやなんとなくやってみようかと思いまして。
PHP5 でやるとして、まずは curl_multi_exec をラップしたクラスを作成。こんな感じ。
PHP:
-
<?php
-
-
class MultiHttpRequest {
-
private $_mh = null;
-
-
-
-
public function __construct() {
-
$this->_mh = curl_multi_init();
-
}
-
-
public function add_get($id, $url) {
-
return false;
-
}
-
return false;
-
}
-
return false;
-
}
-
$h = curl_init($url);
-
if ($h === false) {
-
return false;
-
}
-
$this->_conn[$id] = $h;
-
CURLOPT_FOLLOWLOCATION => true,
-
CURLOPT_FOLLOWLOCATION => 2,
-
CURLOPT_CONNECTTIMEOUT => 10);
-
if ($post) {
-
$options[CURLOPT_POST] = true;
-
}
-
curl_setopt_array($this->_conn[$id], $options);
-
curl_multi_add_handle($this->_mh, $this->_conn[$id]);
-
return true;
-
}
-
-
public function add_post($id, $url, $params) {
-
return false;
-
}
-
return false;
-
}
-
return false;
-
}
-
$h = curl_init($url);
-
if ($h === false) {
-
return false;
-
}
-
$this->_conn[$id] = $h;
-
CURLOPT_FOLLOWLOCATION => true,
-
CURLOPT_POST => true,
-
CURLOPT_FOLLOWLOCATION => 2,
-
CURLOPT_CONNECTTIMEOUT => 10,
-
CURLOPT_POSTFIELDS => $params);
-
curl_setopt_array($this->_conn[$id], $options);
-
curl_multi_add_handle($this->_mh, $this->_conn[$id]);
-
return true;
-
}
-
-
return false;
-
}
-
$mrc = CURLM_CALL_MULTI_PERFORM;
-
$active = false;
-
while ($mrc === CURLM_CALL_MULTI_PERFORM) {
-
$mrc = curl_multi_exec($this->_mh, $active);
-
}
-
while ($active && $mrc === CURLM_OK) {
-
if (curl_multi_select($this->_mh) != -1) {
-
$mrc = CURLM_CALL_MULTI_PERFORM;
-
while ($mrc === CURLM_CALL_MULTI_PERFORM) {
-
$mrc = curl_multi_exec($this->_mh, $active);
-
}
-
}
-
}
-
if ($mrc != CURLM_OK) {
-
return false;
-
}
-
foreach ($this->_conn as $id => $conn) {
-
if (($err = curl_error($conn)) === '') {
-
$this->_contents[$id] = curl_multi_getcontent($conn);
-
} else {
-
}
-
curl_multi_remove_handle($this->_mh, $conn);
-
curl_close($conn);
-
}
-
return true;
-
}
-
-
public function get_content($id) {
-
return false;
-
}
-
return '';
-
} else {
-
return $this->_contents[$id];
-
}
-
}
-
}
-
-
?>
MultiHttpRequest.inc って名前で保存。
ほんで 日本語形態素解析Webサービスこの辺見ながら、アプリケーション ID とか適当にもらってやってみる。
PHP:
-
<?php
-
-
require_once('MultiHttpRequest.inc');
-
-
$mhr = new MultiHttpRequest;
-
$url = 'http://api.jlp.yahoo.co.jp/MAService/V1/parse';
-
// 1 番目のリクエストを追加
-
$id1 = 'jlp1';
-
'sentence' => '安倍政権発足後、初の大型国政選挙となった第21回参院選は29日午前7時から、全国約5万1000カ所の投票所で一斉に投票が始まった。投票は一部地域を除いて午後8時に締め切られた後、順次開票される。30日未明には大勢が判明する見通しだ。',
-
'results' => 'ma', // 形態素解析の結果のみ取得する
-
'filter' => '9', // 名詞のみ取得する
-
);
-
if (false === $mhr->add_post($id1, $url, http_build_query($params1))) {
-
}
-
// 2 番目のリクエストを追加
-
$id2 = 'jlp2';
-
'sentence' => '参院選には選挙区で218人、比例代表で159人の計377人が立候補し、121議席を争う。選挙戦では、年金や「政治とカネ」の問題などが争点となった。与党は過半数維持が目標だが、厳しい情勢だ。民主党は選挙区、比例代表とも善戦しており、参院第一党を目指している。',
-
'results' => 'ma', // 形態素解析の結果のみ取得する
-
'filter' => '9', // 名詞のみ取得する
-
);
-
if (false === $mhr->add_post($id2, $url, http_build_query($params2))) {
-
}
-
// リクエストを実行
-
if (false === $mhr->exec()) {
-
}
-
// 1 番目の結果を取得
-
$content1 = $mhr->get_content($id1);
-
if ($content1 === false) {
-
}
-
// 2 番目の結果を取得
-
$content2 = $mhr->get_content($id2);
-
if ($content2 === false) {
-
}
-
// SimpleXML を使って 1 番目の結果から単語を取り出す
-
$xml1 = new SimpleXMLElement($content1);
-
$word_list1 = $xml1->ma_result->word_list;
-
foreach ($word_list1->word as $word) {
-
$elems1[] = (string)$word->surface;
-
}
-
// SimpleXML を使って 2 番目の結果から単語を取り出す
-
$xml2 = new SimpleXMLElement($content2);
-
$word_list2 = $xml2->ma_result->word_list;
-
foreach ($word_list2->word as $word) {
-
$elems2[] = (string)$word->surface;
-
}
-
// 結果をマージ
-
// 重複する要素を削除
-
-
?>
へー。http_build_query と SimpleXML は便利ですね。

No comments
Jump to comment form | comments rss [?] | trackback uri [?]