search
LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

AWSでAIサービスを使ってみる〜第14回personalize編その④〜

前回まで

前回はレコメンデーションを取得するまでのソリューションの構築とキャンペーンを作成しました。

AWSでAIサービスを使ってみる〜第13回personalize編その③〜

今回はpersonalize最終回!レコメンデーションを取得していきます。

レコメンデーションの取得

それではこれまでにPersonalizeに登録してきた諸々のデータや仕組みを用いてレコメンデーション(商品のオススメ)を取得していきます。

レコメンデーション取得のプログラムの全体です。

pers_recommend.py
import boto3
import sys

#コマンドライン引数
if len(sys.argv) != 2:
  print('python', sys.argv[0], 'user-id')
  exit()

personalize = boto3.client('personalize')

#personalizeruntimeサービスクライアントを作成
personalize_runtime = boto3.client('personalize-runtime')

#データセットグループを取得
for group in personalize.list_dataset_groups()['datasetGroups']:
    #名前注意
    if group['name'] == 'Personalize_TestGroup':
      break
group_arn = group['datasetGroupArn']

#ソリューションを取得
for solution in personalize.list_solutions(
      datasetGroupArn=group_arn)['solutions']:
    #名前注意
    if solution['name'] == 'Solution_Test':
      break
solution_arn = solution['solutionArn']

#キャンペーンを取得
for campaign in personalize.list_campaigns(
      solutionArn=solution_arn)['campaigns']:
    #名前注意
    if campaign['name'] == 'Campaign_Test':
      break
campaign_arn = campaign['campaignArn']

#レコメンデーションを取得
result = personalize_runtime.get_recommendations(
  campaignArn=campaign_arn, userId=sys.argv[1])

#アイテム名を読み込む
with open('item.txt', 'r') as file:
  name = list(file)

#順位とアイテム名を表示
for rank, item in enumerate(result['itemList'], 1):
  print('{:2} {}'.format(rank, name[int(item['itemId'])]), end='')
インポートとサービスクライアントの作成
pers_recommend.py
import boto3
import sys

#コマンドライン引数
if len(sys.argv) != 2:
  print('python', sys.argv[0], 'user-id')
  exit()

personalize = boto3.client('personalize')
#personalizeruntimeサービスクライアントを作成
personalize_runtime = boto3.client('personalize-runtime')

・sysをインポート。コマンドライン引数を指定してif文で引数であるuser-idが未入力の
場合、user-idを入力するよう表示します。
・レコメンデーションを取得する際にはpersonalize_runtimeを使用します。

今まで作成したもろもろの取得
pers_recommend.py
#データセットグループを取得
for group in personalize.list_dataset_groups()['datasetGroups']:
    #名前注意
    if group['name'] == 'Personalize_TestGroup':
      break
group_arn = group['datasetGroupArn']
#ソリューションを取得
for solution in personalize.list_solutions(
      datasetGroupArn=group_arn)['solutions']:
    #名前注意
    if solution['name'] == 'Solution_Test':
      break
solution_arn = solution['solutionArn']
#キャンペーンを取得
for campaign in personalize.list_campaigns(
      solutionArn=solution_arn)['campaigns']:
    #名前注意
    if campaign['name'] == 'Campaign_Test':
      break
campaign_arn = campaign['campaignArn']

#レコメンデーションを取得
result = personalize_runtime.get_recommendations(
  campaignArn=campaign_arn, userId=sys.argv[1])

・データセットグループ、ソリューション、キャンペーンを取得。(それぞれ作成したarnの名前を入力)
・get_recommendationsメソッドでレコメンデーションを取得。

アイテム名の読み込みとアイテム名の表示
pers_recommend.py
#アイテム名を読み込む
with open('item.txt', 'r') as file:
  name = list(file)

#順位とアイテム名を表示
for rank, item in enumerate(result['itemList'], 1):
  print('{:2} {}'.format(rank, name[int(item['itemId'])]), end='')

・with openでアイテム名が書かれたtxtファイルを読み込みます。list関数を使い読み込んだファイルの各行からリストを作成します。
・for文で順位とアイテムを表示します。enumerate()でリストのインデックスを表示、引数1でインデックスを1から表示します。
参考:Python, enumerateの使い方: リストの要素とインデックスを取得
・format()のname[int(item['itemId'])]ではitem内のitemIdを整数に変換し、変換した値をname内のリストのインデックスとして使いアイテムIDに対応するアイテム名を取得します。

レコメンデーションの取得を実行
python pers_recommend.py 1

ユーザーIDを指定しファイルを実行
実行結果はこちら

 1 金色イヌ
 2 金色ネズミ
 3 黄色サル
 4 銀色ウマ
 5 銀色トラ
   .....
20 銀色ヒツジ
21 緑色サル
22 赤色イノシシ
23 黄色ウサギ
24 赤いスイトピー
25 赤色イヌ

ユーザーID:1のユーザーのレコメンデーションです。
1~25番目までのお勧めが表示されています。
なんと!24番目には隠しアイテムの'赤いスイトピー'がお勧めされてます(笑)

まとめ

personalizeでレコメンデーションを取得するまでのプログラムでした。
登録するものが多いですね(汗)

追記:キャンペーンがpersonalize上に存在する間は課金が発生します。放置しておくとあっという間に無料枠を超えてしまうため、不要になったらキャンペーンをコンソールから削除しましょう。

personalize編は以上で終了です。そろそろGCPとか触ってみたいですね。

参考文献サイト

Python, enumerateの使い方: リストの要素とインデックスを取得
AWSでつくるAIプログラミング入門

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0