サジェストAPIを使って、各サービスのサジェストワードを取得する

JavaScript

Googleを始めとした検索システムにおいて、検索ワードのテキストボックスにキーワードを入力すると候補文字列が表示されます。
これを「サジェスト」と呼び、日本語訳では「予測変換」になります。


このサジェスト文字列は、各サービスからAPIで提供されており、個別で実行可能になります。


今回は、各サービス毎のサジェストAPIの実行方法と、取得結果について紹介していきます。


環境情報


PHPでAPIを実行して、取得結果の表示をおこないます。


  • PHP 5.5.35

APIのURL


各APIのURLは以下になります。
取得形式はXMLだったらJSONだったりするのですが、できるだけ様々なパターンを試してみたいので、両方のパターンを実施してみます。


サービス 取得形式 URL
Google XML http://www.google.com/complete/search?hl=en&output=toolbar&q=keyword
Yahoo XML http://ff.search.yahoo.com/gossip?output=xml&command=keyword
Bing JSON https://api.bing.com/osjson.aspx?market=ja-JP&query=keyword
Youtube JSON http://clients1.google.com/complete/search?hl=en&ds=yt&client=firefox&q=keyword
Amazon JSON http://completion.amazon.co.jp/search/complete?search-alias=aps&mkt=6&q=keyword
wikipedia JSON https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=keyword

※「keyword」が、予測変換したい文字列になります。


各APIのパラメータ詳細については、各サービスの正式ドキュメントを参照ください。


実行プログラムと実行結果


実行プログラムと実行結果を紹介していきます。
サービスによっては、APIの返り値には予測変換以外の属性情報が格納されている様なのですが、今回はあくまで予測変換文字列のみを抽出します。


なので、各プログラムで予測変換文字列以外は除外しています。


Google


一番メジャーな(気がする)Googleのサンプルコードです。
XMLで結果を取得して表示するプログラムになります。

try {
    $searchWord = "wordPress";
    $url = "http://www.google.com/complete/search?hl=en&output=toolbar&q=" . $searchWord;
    $result = simplexml_load_file($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    foreach ($result->CompleteSuggestion as $item) {
        echo "suggestWord=" . 
            $item->suggestion->attributes()->data . "
"; } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpress
suggestWord=wordpress login
suggestWord=wordpress download
suggestWord=wordpress themes
suggestWord=wordpress tutorial
suggestWord=wordpress plugin
suggestWord=wordpress hosting
suggestWord=wordpress php
suggestWord=wordpress api
suggestWord=wordpress free

Yahoo


YahooもGoogleと同じようにXMLでの結果取得が可能です。
XMLの構造がYahooとは異なるので、微妙にコーディングが異なります。

try {
    $searchWord = "wordPress";
    $url = "http://ff.search.yahoo.com/gossip?output=xml&command=" . $searchWord;
    $result = simplexml_load_file($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    foreach ($result as $item) {
        echo "suggestWord=" . 
            $item->attributes()->k . "
"; } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpress.com
suggestWord=wordpress login
suggestWord=wordpress.org
suggestWord=wordpress.com login
suggestWord=wordpress download
suggestWord=wordpress themes
suggestWord=www.wordpress.com login
suggestWord=wordpress login wp-admin
suggestWord=wordpress.org download
suggestWord=wordpress templates

Bing


BingからJSON形式で取得します。
XMLとはプログラムは異なりますが、基本的な構造は変わりません。


また、取得結果の配列は2段階になっているので、結果の配列構造も意識したプログラムとなります。

try {
    $searchWord = "wordPress";
    $url = "https://api.bing.com/osjson.aspx?market=ja-JP&query=" . $searchWord;
    $result = file_get_contents($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    $result = json_decode($result, true);
    for ($lc = 0; $lc < count($result); $lc++) {
        if (is_array($result[$lc])) {
            $searchWord = $result[$lc];
            for ($slc = 0; 
                $slc < count($searchWord); $slc++) {
                echo "suggestWord=" . 
                    $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpress
suggestWord=wordpress ログイン
suggestWord=wordpress 使い方
suggestWord=wordpressとは
suggestWord=wordpress インストール
suggestWord=wordpress テーマ
suggestWord=wordpress ログインできない
suggestWord=wordpress テンプレート
suggestWord=wordpress log in

Youtube


YoutubeはBingと同じプログラムで結果を取得できます。
APIのURLが違うだけです。


結果は以下になります。


実行結果

suggestWord=wordpress
suggestWord=wordpress tutorial
suggestWord=wordpress 使い方
suggestWord=wordpress website
suggestWord=wordpress blog
suggestWord=wordpress theme
suggestWord=wordpress speed optimization
suggestWord=wordpress plugins
suggestWord=wordpress マナブ
suggestWord=wordpress php

Amazon


Amazonは、BingとYoutubeと基本的に同様なのですが、結果配列の3階層目にも情報が格納されているようです。
サジェストワードは2階層目なので、3階層目を除外する制御を入れています。

try {
    $searchWord = "wordPress";
    $url = "http://completion.amazon.co.jp/search/complete?search-alias=aps&mkt=6&q=" . $searchWord;
    $result = file_get_contents($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    $result = json_decode($result, true);
    for ($lc = 0; $lc < count($result); $lc++) {
        if (is_array($result[$lc])) {
            $searchWord = $result[$lc];
            for ($slc = 0; 
                $slc < count($searchWord); $slc++) {
                if (is_array($searchWord[$slc])) {
                    continue;
                }
                echo "suggestWord=" . 
                    $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=wordpressの教科書
suggestWord=wordpress
suggestWord=wordpress 本
suggestWord=wordpress php
suggestWord=wordpress ブログ
suggestWord=wordpress カスタマイズ
suggestWord=wordpressデザインレシピ集
suggestWord=wordpress 仕事の現場でサッと使える デザイン教科書
suggestWord=wordpress デザイン
suggestWord=wordpress レッスンブック

wikipedia


wikipediaは、他サービスとちょっと異なります。
実行プログラムは他のJSON形式と同一なのですが、結果にURLが格納されています。

※親切ですね


以下のサンプルプログラムでは、他結果との違いが分かりやすいように、キーワードを「wordPress」ではなく「japan」(結果がたくさん返ってくる)にしています。
また、空欄の結果文字列は除外しています。

try {
    $searchWord = "japan";
    $url = "https://ja.wikipedia.org/w/api.php?action=opensearch&format=json&search=" . $searchWord;
    $result = file_get_contents($url);
    if (!isset($result)) {
        echo "not result.";
        exit;
    }
    $result = json_decode($result, true);
    for ($lc = 0; $lc < count($result); $lc++) {
        if (is_array($result[$lc])) {
            $searchWord = $result[$lc];
            for ($slc = 0; 
                $slc < count($searchWord); $slc++) {
                if (is_array($searchWord[$slc])) {
                    continue;
                }
                if (strlen($searchWord[$slc]) == 0) {
                    continue;
                }
                echo "suggestWord=" . 
                    $searchWord[$slc] . "
"; } } } } catch (Exception $e) { echo "message=" . $e->getMessage() . "
"; exit; }

実行結果

suggestWord=Japan
suggestWord=JAPAN COUNTDOWN
suggestWord=JAPAN FM LEAGUE
suggestWord=Japan Expo
suggestWord=JAPAN (アルバム)
suggestWord=JAPANサッカーカレッジ
suggestWord=JAPAN JAM
suggestWord=JAPANNEXT
suggestWord=JAPANARIZM
suggestWord=Japan Skeptics
suggestWord=https://ja.wikipedia.org/wiki/Japan
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_COUNTDOWN
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_FM_LEAGUE
suggestWord=https://ja.wikipedia.org/wiki/Japan_Expo
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_(%E3%82%A2%E3%83%AB%E3%83%90%E3%83%A0)
suggestWord=https://ja.wikipedia.org/wiki/JAPAN%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E3%82%AB%E3%83%AC%E3%83%83%E3%82%B8
suggestWord=https://ja.wikipedia.org/wiki/JAPAN_JAM
suggestWord=https://ja.wikipedia.org/wiki/JAPANNEXT
suggestWord=https://ja.wikipedia.org/wiki/JAPANARIZM
suggestWord=https://ja.wikipedia.org/wiki/Japan_Skeptics