PR TIMESデザイナー&エンジニアブログ BREAK TIMES

PR TIMES Developer Blog(デザイナー&エンジニアによる開発者ブログ)

PR TIMES Developer Blog
デザイナー&エンジニアによる開発者ブログ

PR TIMESに検索サジェスト(入力補完) その2

PR TIMESエンジニアの山田です。

前回(検索サジェストに関する投稿)のつづきです。
breaktimes.hatenablog.com

Natural Language APIに送るキーワードに配列は使えません。
そのままではキーワードが10個あると10回APIにリクエストを送ることになってしまいます。

Pricing  |  Cloud Natural Language API Documentation  |  Google Cloud
こちらにもあるように月5,000回以上のリクエストは1,000件あたり1ドルです。(2018年7月現在)
1回の検索につき10リクエストしてしまうと検索回数が多くなるほどリクエストも膨大に増えていき、相当な料金かかってしまいますね。

そこで1回のリクエストにSuggest APIから返ってきた最大10個の語句をすべて含めてしまうことにします。
ただし単純につなげただけでは、1つの文章として認識され1つのポジティブ・ネガティブ度合いしか返ってきませんので、工夫して単語ごとに“div”で囲ったHTMLとして送りましょう。

たとえばSuggest APIから返ってきたのがこちらだった場合。

[
  'pr times',
  'pr times 料金',
  'pr times ログイン',
  'pr times 株価',
  'pr times評判',
  'pr times 会社概要',
  'pr times 採用',
  'pr times ir',
  'pr times tv',
  'pr times スタートアップ'
]


PHPでは以下のようにAPIを呼び出します。

$html=‘<div>pr times</div><div>pr times 料金</div><div>pr times ログイン</div><div>pr times 株価</div><div>pr times評判</div><div>pr times 会社概要</div><div>pr times 採用</div><div>pr times ir</div><div>pr times tv</div><div>pr times スタートアップ</div>’;
$url = 'https://language.googleapis.com/v1/documents:analyzeSentiment?key=●●●●●●●●●●●●●●’;
$document = array('type' =>'HTML','language' =>'ja','content' =>$html);
$postdata = array('encodingType' => 'UTF8', 'document' => $document);
$json_post = json_encode($postdata);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_post);
$result = curl_exec($ch);
curl_close($ch);
$result_array = json_decode($result,true);


これでjson形式でそれぞれのキーワードに対するポジティブ・ネガティブ度合いが取得できます。

{
  "documentSentiment":{"magnitude":1.4,"score":0.1},
  "language":"ja",
  "sentences":[
    {
      "text":{"content":"pr times","beginOffset":5},
      "sentiment":{"magnitude":0,"score":0}
    },
    {
      "text":{"content":"pr times 料金","beginOffset":24},
      "sentiment":{"magnitude":0,"score":0}
    },
    {
      "text":{"content":"pr times ログイン","beginOffset":51},
      "sentiment":{"magnitude":0.1,"score":0}
    },
    {
      "text":{"content":"pr times 株価","beginOffset":84},
      "sentiment":{"magnitude":0.3,"score":0.3}
    },
    {
      "text":{"content":"pr times評判","beginOffset":111},
      "sentiment":{"magnitude":0.1,"score":0.1}
    },
    {
      "text":{"content":"pr times 会社概要","beginOffset":136},
      "sentiment":{"magnitude":0.2,"score":0.2}
    },
    {
      "text":{"content":"pr times 採用","beginOffset":169},
      "sentiment":{"magnitude":0,"score":0}
    },
    {
      "text":{"content":"pr times ir","beginOffset":196},
      "sentiment":{"magnitude":0.1,"score":0.1}
    },
    {
      "text":{"content":"pr times tv","beginOffset":219},
      "sentiment":{"magnitude":0.1,"score":0.1}
    },
    {
      "text":{"content":"pr times スタートアップ","beginOffset":242},
      "sentiment":{"magnitude":0,"score":0}
    }
  ]
}