PHPで「kizasi.jp」を利用する

(1/1)
kizasi サーチエンジンは、1 日約 20 万のブログエントリーを収集・索引化し、話題を見つける、話題の世界をサマる、話題とさまざまな情報をつなげることをコンセプトとする検索エンジンである。kizasi では、API「kizAPI (きざっぴ) 」を公開している。

サンプル・プログラムの実行例

PHPで「kizasi.jp」を利用する

サンプル・プログラム

WebAPI:kizAPI

2007 年(平成 19 年)5 月現在、以下の「kizAPI」が公開されている。
  • 関連語検索
  • KWIC(KeyWord In Context)検索
  • きざしランキング
  • チャンネル共起検索
これらの「kizAPI」は、いずれも、入力パラメータ(IN)は GET 渡しで、出力結果(OUT)は XML で戻るという形である。ここでは、指定したキーワードと関連する語を返す「関連語検索」を利用していくことにする。
WebAPIのURL
URL
http://kizasi.jp/kizapi.py

入力パラメータ
項目名 フィールド名 内  容
間隔 span string 期間;24 or 1w or 1m
検索語 key_expr string UTF-8をURLエンコードする。
タイプ type string 'coll' 固定
応答データ構造(xml) rss channel item title 見出し pubDate 関連語を測定した日時 link kizasi.jpでの検索結果URL guid 同上 description 1日/1週間/1ヶ月におけるkizasi.jpでの検索結果へのURL (CDATA)

サンプル・プログラムの解説:WebAPI部分

プログラムの流れは、「Yahoo! ウェブ検索Web サービス」プログラムとほぼ同じ。
kizAPI」の OUT に合わせ、ユーザー関数 getResult の要素名テーブル $tbl の内容を変更してある。
また、検索に成功したかどうかのステータスがないので、その部分のエラーチェックは省略した。

0136: /**
0137:  * kizAPI(関連語検索)から必要な情報を配列に格納する
0138:  * @param array  $items   情報を格納する配列
0139:  * @param array  $query   検索語
0140:  * @return int ヒット数
0141: */
0142: function getResults_kizAPI(&$items$query) {
0143: //受信データの要素名
0144: $tbl = array(
0145:     'title',        //関連語
0146:     'pubDate',        //関連語を測定した時刻
0147:     'link',            //kizasi.jpでの検索結果のURL
0148:     'guid',            //同上
0149:     'description',    //1日/1週間/1ヶ月におけるkizasi.jpでの検索結果へのURL(CDATA) 
0150: );
0151: 
0152:     $url = getURL_kizAPI($query);        //リクエストURL
0153: 
0154: //PHP4用; DOM XML利用
0155:     if (isphp5over() == FALSE) {
0156:         if (($dom = read_xml($url)) == NULL)    return FALSE;
0157:         $resultset = $dom->get_elements_by_tagname("channel");
0158:         $results = $resultset[0]->get_elements_by_tagname("item");
0159:         //検索結果取りだし
0160:         $cnt = 1;
0161:         foreach ($results as $element) {
0162:             foreach ($tbl as $name) {
0163:                 $node = $element->get_elements_by_tagname($name);
0164:                 if ($node != NULL) {
0165:                     $items[$cnt][$name] = $node[0]->get_content();
0166:                 }
0167:             }
0168:             $cnt++;
0169:         }
0170: 
0171: //PHP5用; SimpleXML利用
0172:     } else {
0173:         $rss = simplexml_load_file($url);
0174:         //レスポンス・チェック
0175:         if (isset($rss->channel->item) == FALSE)  return FALSE;
0176:         //検索結果取りだし
0177:         $cnt = 1;
0178:         foreach ($rss->channel->item as $element) {
0179:             foreach ($tbl as $name) {
0180:                 if (isset($element->$name)) {
0181:                     $items[$cnt][$name] = $element->$name;
0182:                 }
0183:             }
0184:             $cnt++;
0185:         }
0186:     }
0187: 
0188:     return ($cnt - 1);
0189: }

サンプル・プログラムの解説:表示処理

kizaAPI」の OUT は、キーワードと共に語られた回数の多い順に表示される。そこで、kizasi.jp のように、回数の多い見出し語については大きなフォントで表示するようにしてみた。これがユーザー関数 getTitle である。
大きい文字と小さい文字をランダムに並べた方がそれらしいので、あらかじめ shuffle 関数で順番がランダムになるようにしてある。

0191: /**
0192:  * ランダム見出し作成
0193:  * @param array  $items 情報を格納した配列
0194:  * @return string ランダム見出し
0195: */
0196: function getTitle($items) {
0197:     //表示フォントサイズ(%)
0198:     $tbl = array(200, 190, 170, 160, 150, 140, 130, 120, 110, 100);
0199: 
0200:     if (count($items) <= 0)     return;
0201: 
0202:     //ランダム並べ替え用配列を作る
0203:     $numbers = range(1, count($items));
0204:     srand((float)microtime() * 1000000);
0205:     shuffle($numbers);
0206: 
0207:     //ランダム表示
0208:     $res = '';
0209:     $n = count($numbers);
0210:     $j = 1;
0211:     foreach ($numbers as $i) {
0212:         $fsize = ($i < count($tbl)) ? $tbl[$i - 1] : end($tbl);
0213: $res .=<<< EOT
0214: <a href="{$items[$i]['link']}">
0215: <span style="font-size: {$fsize}%;">
0216: {$items[$i]['title']}
0217: </span>
0218: </a>
0219: 
0220: EOT;
0221:         //最後の,は省く
0222:         if ($j < $n)    $res .= '';
0223:         $j++;
0224:     }
0225:     return $res;
0226: }

(この項おわり)
header