リクルートのAI「Listing API」を使ったレコメンドの作り方
ユーザーデータが集まってくると、データ群から「この人にはこの商品がおすすめ」というデータが見えてくると思います。
しかし、そういったレコメンドを作成するには専用のプログラムが必要で実装するのにも大変・・・。
そんな時、リクルート様より無料で提供されている A3RT の Listing API というAPIを使うことで、比較的簡単にレコメンドリストを作成することが可能です。
今回は、そんなレコメンドリストの作り方を記載します。
目次
開発環境
今回の開発環境は下記のとおりです。
PHP | 7.1.11 |
---|---|
cURL | 7.29.0 |
また、今回のAPIを実行するにあたり curl が必要となります。
APIキーを取得する
まずはAPIキーを取得しましょう。
A3RT の Listing API ページ下にある 「API KEY 発行」 ボタンからAPIキーを作成しましょう。
この時、利用規約を最下部までスクロールしないと、同意するボタンが押せません。
メールアドレスを入力し、確認後には登録したメールアドレスにAPIキーが送られてきます。
アップロードするCSVファイルを作る
リコメンドリストを作成するため、集計データを作成しましょう。
集計データは 「ユーザーID」「商品ID」「タイムスタンプ」 の3項目が必要となります。
今回は下記のようなデータを用意しました。
このCSVファイルは、各項目をダブルクォートで囲んでいません。
アップロードするURLを取得する
まずはアップロードするURLを取得するところから始まります。
get_upload_url というエンドポイントにアクセスすると、URLを取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
require_once 'const.php'; $data = [ 'apikey' => "[APIキー]", ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.a3rt.recruit-tech.co.jp/listing/v1/get_upload_url"."?".http_build_query($data)); // リクエストメソッド curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // 証明書検証をしない curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 結果を文字列で取得 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); // タイムアウト時間を設定 curl_setopt($ch, CURLOPT_TIMEOUT, 60); $responseJsonStr = curl_exec($ch); // エラーチェック $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); if (CURLE_OK !== $errorNo) { echo sprintf("[CurlErrorCode: %s] %s", $errorNo, $errorMsg); } curl_close($ch); // 結果を配列に変換 $response = json_decode($responseJsonStr, true); print_r($response); |
上記プログラムを実行した結果は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 |
Array ( [status] => 0 [message] => ok [result] => Array ( [url] => https://www.example.com ) ) |
この result -> url にあるURLが、アップロードURLになります。
CSVファイルをアップロードする
続いてデータCSVファイルをアップロードしましょう。
取得したURLに対して、アップロードのプログラムを実行していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
$uploadUrl = "[先ほど取得したアップロードURL]"; $mimeType = 'text/plain'; $header = [ 'Content-Type: '.$mimeType, ]; $fileName = 'data.csv'; $filePath = dirname(__FILE__).DIRECTORY_SEPARATOR.$fileName; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $uploadUrl); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($filePath)); $responseJsonStr = curl_exec($ch); // エラーチェック $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); if (CURLE_OK !== $errorNo) { echo sprintf("[CurlErrorCode: %s] %s", $errorNo, $errorMsg); } curl_close($ch); // 結果を配列に変換 $response = json_decode($responseJsonStr, true); print_r($response); |
ここのポイントは 「curl の ––upload-file を CURLOPT_POSTFIELDS で指定していること」 です。
この方法、実は検索してもほとんどヒットしないので、とてもマイナーではありますが実用性があるのではないでしょうか?
アップロードのステータスを取得する
アップロードが成功したら、次に演算処理開始しましょう。
アップロードしただけでは演算されない、というところがポイントです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$data = [ 'apikey' => "[APIキー]", ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.a3rt.recruit-tech.co.jp/listing/v1/start_w2v"."?".http_build_query($data)); // リクエストメソッド curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // 証明書検証をしない curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 結果を文字列で取得 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); // タイムアウト時間を設定 curl_setopt($ch, CURLOPT_TIMEOUT, 60); $responseJsonStr = curl_exec($ch); // エラーチェック $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); if (CURLE_OK !== $errorNo) { echo sprintf("[CurlErrorCode: %s] %s", $errorNo, $errorMsg); } curl_close($ch); // 結果を配列に変換 $response = json_decode($responseJsonStr, true); print_r($response); |
演算のステータスを取得する
演算開始をしたら、ステータスで状態を確認しましょう。
ここでエラーが出た場合は、最初からやり直しです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$data = [ 'apikey' => "[APIキー]", ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.a3rt.recruit-tech.co.jp/listing/v1/status_w2v"."?".http_build_query($data)); // リクエストメソッド curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // 証明書検証をしない curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 結果を文字列で取得 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); // タイムアウト時間を設定 curl_setopt($ch, CURLOPT_TIMEOUT, 60); $responseJsonStr = curl_exec($ch); // エラーチェック $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); if (CURLE_OK !== $errorNo) { echo sprintf("[CurlErrorCode: %s] %s", $errorNo, $errorMsg); } curl_close($ch); // 結果を配列に変換 $response = json_decode($responseJsonStr, true); print_r($response); |
この時、下記のようなレスポンスが返ってきたら演算が終了した、ということです。
これ以外は処理中、もしくはエラーとなります。
1 2 3 4 5 |
Array ( [status] => 0 [message] => SHUTDOWN instance ) |
演算結果のダウンロードURLを取得する
演算が終了したあとは、結果をダウンロードするURLを取得します。
ちょっと面倒かもしれませんがあと少しです、頑張りましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$data = [ 'apikey' => "[APIキー]", ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.a3rt.recruit-tech.co.jp/listing/v1/get_download_url"."?".http_build_query($data)); // リクエストメソッド curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); // 証明書検証をしない curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 結果を文字列で取得 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); // タイムアウト時間を設定 curl_setopt($ch, CURLOPT_TIMEOUT, 60); $responseJsonStr = curl_exec($ch); // エラーチェック $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); if (CURLE_OK !== $errorNo) { echo sprintf("[CurlErrorCode: %s] %s", $errorNo, $errorMsg); } curl_close($ch); // 結果を配列に変換 $response = json_decode($responseJsonStr, true); print_r($response); |
上記プログラムを実行した結果は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 |
Array ( [status] => 0 [message] => ok [result] => Array ( [url] => https://www.example.com ) ) |
この result -> url にあるURLが、ダウンロードURLになります。
結果ファイルのダウンロード
最後に結果ファイルをダウンロードしましょう。
これもcurlでダウンロードできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$downloadUrl = "[取得したダウンロードURL]"; $outputFileName = "outputList.csv"; $fp = fopen($outputFileName, "w"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $downloadUrl); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); // エラーチェック $errorNo = curl_errno($ch); $errorMsg = curl_error($ch); if (CURLE_OK !== $errorNo) { echo sprintf("[CurlErrorCode: %s] %s", $errorNo, $errorMsg); } curl_close($ch); fclose($fp); echo 'OK'; |
画面に OK という文字が出ればダウンロード成功です。
うまくできない場合
うまくいかない場合、ファイルフォーマットなどを確認してみましょう。
今回アップロードしたcsvファイルは、最後に空行がありません。
また、APIの仕様に基づき 同一APIを60秒以内に投げた場合、エラーが返る というものがあります。
その他、細かい仕様もありますので、一度公式APIをよく読みましょう。
結果を見てみる
では、ダウンロードできたファイルの中身を見てみましょう。
それぞれ 「item_id: スコア値, item_id: スコア値 …」 という感じになっています。
このスコア値が高いほど、item_idを買う可能性が高いよ、ということです。
このAPIの良いところは 「ユーザーIDと商品ID(という名の一意のもの)と購入(実行)日時があれば、相関リストを作成できる」 というところだと思います。
かなり実用的なAPIではないでしょうか?
さいごに
今回は Listing API に注目してみましたが、需要があれば他のAPIの使い方も解説してみたいと思います。
- おすすめ記事
POPULAR
のえる
Full-stack Developer