0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure 使えなかったので Gemini で「政治家とポケモンの名前の類似度」を可視化してみた

Posted at

はじめに

「プロンプトエンジニアっぽいことがしてみたい!」という好奇心から、まずは 長和技研さんのLLM記事 を参考に Azure OpenAI を使おうとしました。

ところが…

  • Azure OpenAI Studio にアクセスできない
  • 代わりに「AI Foundry」という謎サービスに案内された
  • なんとかキーとエンドポイントは取得できたけど、モデルの選択画面で「クオータが足りません」と言われて撃沈

ということで、今回はおとなしく Google の Gemini API を使って遊んでみることにしました。


やりたいこと

日本の政治家とポケモンの名前をベクトル化して、似たような名前を可視化する!


環境と準備

  • 実行環境:Google Colab

APIキーの取得とColabへの登録

Colab の左側メニュー「鍵マーク」から「シークレット」を登録しておきます。

from google.colab import userdata
api_key = userdata.get('GOOGLE_API_KEY')

Gemini API クライアントの準備

from google import genai

client = genai.Client(api_key=api_key)

エンベディング関数の定義

本来はt-sneやPCAなどの次元削減を行うべきだが、まだそこまで学習が追いついてないので今回は2次元で出力しています。

def name2vec(name: str):
    result = client.models.embed_content(
        model="gemini-embedding-001",
        contents=name,
        config=types.EmbedContentConfig(output_dimensionality=2)  # 本来は100〜768次元が多いけど、可視化のため2次元に
    )
    [embedding_obj] = result.embeddings
    return embedding_obj.values

名前データの準備

ChatGPT にお願いして、日本の政治家とポケモンの名前をそれぞれ100個ずつリスト化してもらいました。

japanese_politicians = [...]  # 政治家名のリスト
pokemon_names = [...]         # ポケモン名のリスト

ベクトル化処理

私は内包表記で書いてないんですけど、GPTに記事書くの手伝ってもらったらかっこよく内包表記してくれましたね。

japanese_politician_vecs = [
    {"name": name, "vec": name2vec(name)}
    for name in japanese_politicians
]

pokemon_name_vecs = [
    {"name": name, "vec": name2vec(name)}
    for name in pokemon_names
]

可視化(Plotly)

import plotly.graph_objects as go

fig = go.Figure()

# 政治家プロット
fig.add_trace(go.Scatter(
    x=[p['vec'][0] for p in japanese_politician_vecs],
    y=[p['vec'][1] for p in japanese_politician_vecs],
    mode='markers+text',
    name='政治家',
    text=[p['name'] for p in japanese_politician_vecs],
    textposition='top center',
    marker=dict(color='blue', size=10, symbol='circle')
))

# ポケモンプロット
fig.add_trace(go.Scatter(
    x=[p['vec'][0] for p in pokemon_name_vecs],
    y=[p['vec'][1] for p in pokemon_name_vecs],
    mode='markers+text',
    name='ポケモン',
    text=[p['name'] for p in pokemon_name_vecs],
    textposition='bottom center',
    marker=dict(color='red', size=10, symbol='diamond')
))

fig.update_layout(
    title='政治家とポケモンのベクトル散布図',
    xaxis_title='X軸',
    yaxis_title='Y軸',
    legend_title='カテゴリ',
)

fig.show()

結果と感想

以下が実際に得られたベクトル散布図です(青が政治家、赤がポケモン)

newplot.png

もしくは インタラクティブ版(HTML) はこちらから確認できます👇
👉 ベクトル散布図をHTMLで見る


  • 意外と似たような場所にマッピングされる名前もあって面白い
  • 試しに 石破茂さん安倍晋三さん を見てみたけど、近くにあるポケモンと特に似ているとは思えなかった
  • もしかすると、次元を上げて(例:128次元とか)エンベディングすれば、より意味的な類似が出てくるのかもしれない

まとめ

  • Azure 使えなかったけど、Gemini API で名前のベクトル化を試せて楽しかった
  • 可視化して遊ぶだけでも、けっこうプロンプトエンジニアっぽい気分になれる
  • 次は次元数を上げてクラスタリングとかもやってみたい!

おまけ:今後の野望

  • 多次元からの次元削減
  • 名前以外(職業や属性)との関連付け
  • LLM に「この2人は似てますか?」と聞いて答えとの一致率を計測

参考記事

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?