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

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

[AWSでAIサービスを使ってみる〜第13回personalize編その③〜](https://qiita.com/AInosukey/items/39f65363a49a656e3e9f)

今回は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の使い方: リストの要素とインデックスを取得](https://note.nkmk.me/python-enumerate-start/)
・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の使い方: リストの要素とインデックスを取得](https://note.nkmk.me/python-enumerate-start/)
[AWSでつくるAIプログラミング入門](https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-AI%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4798059056)