re:Invent 2023のセッション情報をBedrockで分析してみた。

生成AIではモデルにより文字列のベクトル化が行えます。
Amazon Bedrockでは、「[Titan Embeddings](https://aws.amazon.com/bedrock/titan/?nc1=h_ls)」というモデルが提供されています。
Titan Embeddingsのユースケースのひとつに **semantic similarity（意味的類似度）** というものがあります。

**意味の近い言葉は、近くに来るよ**ということだと思います。

この機能を使って、re:Invent 2023のセッションを可視化してみました。

## データの取得

Chromeのデベロッパーツールを開いた状態で[こちら](https://hub.reinvent.awsevents.com/attendee-portal/catalog/)のサイトにアクセスます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e86caa95-67cb-c3eb-c0d4-0e25d1c58012.png)

`public-catalog/`へのアクセスを探し、右クリック → Copy → Copy as cURL でコマンドをコピーします。コピーしたコマンドを、Bashで実行し、JSONファイルを保存します。

## データのベクトル化

* ライブラリーの取得

    ```bash
    pip install -Uq pandas python-dotenv boto3
    pip install -Uq scikit-learn matplotlib
    ```

* importとベクトル化関数の定義

    ```python
    import json
    import boto3
    from dotenv import load_dotenv
    
    load_dotenv(override=True)
    
    bedrock = boto3.client('bedrock-runtime')
    
    def embeddings(input: str):
    
      params = {
        'modelId': 'amazon.titan-embed-text-v1',
        'contentType': 'application/json',
        'accept': '*/*',
        'body': json.dumps({
          'inputText': input
        })
      }
    
      response = bedrock.invoke_model(**params)
      return json.loads(response['body'].read().decode('utf-8'))['embedding']
    ```

* JSONファイルの読み込み

    ```python
    import pandas as pd
    
    with open('./public-catalog.json') as f:
      catalog = json.load(f)
    
    df = pd.read_json(json.dumps(catalog['data']))
    ```

    `df['description']`に、各セッションの詳細説明が入ってますので、これをベクトル化し、`embedding`列に追加します。

    ```python
    def description(input):
      return json.dumps(embeddings(input))
    
    df['embedding'] = df['description'].apply(description)
    ```

* ベクトルーデータの位置を算出

    [openai-cookbook](https://github.com/openai/openai-cookbook/)の[Visualizing the embeddings in 2D](https://github.com/openai/openai-cookbook/blob/main/examples/Visualizing_embeddings_in_2D.ipynb)を参考にしました。

    ```python
    import pandas as pd
    from sklearn.manifold import TSNE
    import numpy as np
    from ast import literal_eval
    
    # Convert to a list of lists of floats
    matrix = np.array(df.embedding.apply(literal_eval).to_list())
    
    # Create a t-SNE model and transform the data
    tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)
    vis_dims = tsne.fit_transform(matrix)
    
    x = [x for x,y in vis_dims]
    y = [y for x,y in vis_dims]

    df['x'] = x
    df['y'] = y
    ```

* タグ情報を変換

    `tags`の中にTopicやArea of Interestが含まれているのですが、扱いづらいので少し整形しました。

    ```python
    def tags_transform(input):
    
      topic = list(filter(lambda x: x['parentTagName'] == 'Topic', input))
      topic = list(map(lambda x: x['tagName'], topic))
    
      area_of_interest = list(filter(lambda x: x['parentTagName'] == 'Area of Interest', input))
      area_of_interest = list(map(lambda x: x['tagName'], area_of_interest))
    
      return {
        'topic': topic,
        'Area of Interest': area_of_interest
      }
    
    df['tags_v2'] = df['tags'].apply(tags_transform)
    ```

* CSVファイルに保存

    ```python
    df.to_csv('all_with_xy.csv')
    ```

## 可視化

できたCSVファイルをPowerBIで可視化しました。

### 全体

ドーン　と。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e6bef588-d045-11b1-d39e-964a54f0b3f1.png)

Topic（`AI/ML`、`Compute`など）で色分けしています。なんとなく、傾向がありそうです。

## 詳細

トピックごとに分けて見てみましょう。

* "AI/ML", "Analytics"

    最もセッション数の多い2トップです。左側エリアをほぼ占拠しています。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8bf31c60-2d22-12fd-b818-f70a530607a6.png)

* "Networking & Content Delivary", "Storage"

    対して右側エリアに集中しているのがこちら。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/fed33711-37c5-b2bf-179e-282f112aa5ed.png)

    左のAI/MLエリアに位置するセキュリティのセッションはこちら

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/136af2f8-d7b2-716f-d81f-80d14e3a6800.png)

    確かにAI要素がありつつ、セキュリティに関するセッションのようです。
    
    ただ、AI/MIのジャンルで右側に来るものもあるので、このあたりはどういう違いがあるんでしょうね。。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e034ae1f-dbd8-6979-1a62-061d67b5abad.png)



* "Cloud Operations", "Enterprise & Migration", "Hybrid Cloud"

    真ん中あたりはこちら。テーマ的にも近そうだなと感じました。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/88248847-3a47-5065-e114-cf48edb99be0.png)
    
* Compute, Database

    基本的なサービスのコンピュートとデータベースは幅広く分布している印象です。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8d02b0ae-12d7-9e20-1bb0-918b7576ff8d.png)

* "DevOps and Developer Productivity", "Internet of Things", "Kubernetes", "Serverless Compute"

    周辺に位置するのがこれらのテーマ。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c7ce7bb6-8212-2d40-2e78-4981bc3fdd2e.png)

## 気づいたこと

この散布図から見たいセッションを探すのもありのような気がします。

* データベースに関するセッションで、Kubernetes寄りのもの

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8967e74a-432d-6dc2-af5e-67ee8da743f2.png)

* 同じくデータベースに関するセッションで、AI/ML寄りのもの

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f2d3bef1-9675-4dc7-c6c0-606953ebce84.png)


* データベースのマイグレーション

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/d0640d1c-4f83-8272-947f-45fa4f7c6e55.png)


散布図を見ながら、左寄りのセッションいっぱい予約したんで、ひとつぐらい右側で探そうか　的なこともできそうです。

## 各Topicごとの図

[こちら](https://moritalous.pages.dev/7186f62e46597f3822d5)を参照ください。

---

ちなみに下の真ん中あたりに集中したエリアは"New Launch"のセッションです。どんなセッションが増えるのか楽しみですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e1dd7a92-1bbe-d175-2dc9-fd8d378a14f5.png)