LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-28

前回まで

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

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プログラミング入門

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0