💨
Embedding APIで友達検索:趣味・価値観・創作意欲で繋がる新たな出会い
はじめに
Embedding APIは、文章を数値に変換し、意味情報を扱いやすくする技術です。この技術を用いることで、マッチングアプリのプロフィールの類似度を計算し、趣味や価値観が近いユーザー同士を繋げることができます。
今回は、架空のユーザーのプロフィールを50件用意し、自身のプロフィールともっとも類似度の高いユーザーを探し出す実験を行いました。
実験環境
実験環境として、以下を用意しました。
- 架空のマッチングアプリユーザーのプロフィールを50件
- 50件のプロフィールと類似度を比較するためのユーザープロフィール1件
- 文章のベクトル化および、ユーザー検索の実行を行うPythonコード
架空のマッチングアプリのユーザープロフィールは、ChatGPTに作成させました。
[
{
"id": 1,
"name": "Aさん",
"age": 25,
"gender": "男性",
"text": "趣味は読書と映画鑑賞です。休日は家でゆっくり過ごすことが多いですが、旅行も好きです。誠実で優しい人と出会いたいです。好きな作家は村上春樹と東野圭吾です。最近見た映画で一番面白かったのは「ジョーカー」です。旅行は国内よりも海外が好きで、今までに行ったことがある国はアメリカ、イギリス、フランス、イタリア、スペインです。理想のパートナーは、一緒に読書や映画を楽しめる人で、優しくて思いやりのある人です。"
},
{
"id": 2,
"name": "Bさん",
"age": 30,
"gender": "女性",
"text": "料理とヨガが趣味の社会人です。週末は新しいレシピに挑戦したり、友人とヨガスタジオに通っています。自然が好きで、キャンプやハイキングにもよく行きます。好きな作家は吉本ばななと宮部みゆきです。最近ハマっている映画は「ラ・ラ・ランド」で、音楽とストーリーの美しさに感動しました。旅行はアジアを中心に探索しており、タイ、ベトナム、インドネシアに訪れたことがあります。理想のパートナーは、アウトドア活動を共に楽しめる、温かい心を持った人です。"
},
{
"id": 3,
"name": "Cさん",
"age": 28,
"gender": "男性",
"text": "スポーツ全般に興味があり、特にサッカーとバスケットボールをよくします。音楽を聴くことも好きで、ジャンルを問わず様々な音楽を楽しんでいます。趣味は写真撮影で、風景や人物の写真を撮ることに魅力を感じます。好きな作家は村上春樹と夏目漱石です。映画はアクションとサスペンスが好きで、「インセプション」が最近のお気に入りです。旅行は国内外問わず冒険的な場所を求めています。今までにオーストラリア、ニュージーランド、カナダを訪れました。理想のパートナーは、共に活動的な時間を過ごせる、エネルギッシュな人です。"
}
]
50件のプロフィールと類似度を比較するためのユーザープロフィール1件は、以下の通り作成されました。
名前: 広夢
年齢: 22
性別: 男
自己紹介: コーヒーとゲームが好きです。ゲームは制作もしていて個人でもゲームを作っています。また映画も好きで、「風の歌を聴け」が好きです。
今回の実験に使用したPythonコードを以下に示します。
import json
import requests
from openai import OpenAI
import os
import numpy as np
# OpenAIのAPIキーを設定(適切なキーに置き換えてください)
os.environ["OPENAI_API_KEY"] =""
client = OpenAI()
# プロフィールファイルのパス
profile_file_path = "profile.json"
with open(profile_file_path, "r") as f:
profiles = json.load(f)
# Embeddingモデルを指定
EMBEDDING_MODEL = "text-embedding-3-large"
# OpenAIのEmbedding APIを使用してテキストの埋め込みを取得する関数
def get_embedding(text, model=EMBEDDING_MODEL):
response = client.embeddings.create(
input=text,
model=model
)
return response.data[0].embedding
# コサイン類似度を計算する関数
def cosine_similarity(vec1, vec2):
return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
# マッチング
def match(profile):
# 自分のプロフィールの文章埋め込みを取得
my_embedding = get_embedding(profile["text"])
# 他のプロフィールとの類似度を計算
similarities = {}
for other_profile in profiles:
if other_profile["name"] == profile["name"]:
continue
other_embedding = get_embedding(other_profile["text"])
similarity = cosine_similarity(my_embedding, other_embedding)
similarities[other_profile["name"]] = similarity
# 最も類似度が高いユーザーをマッチング
matched_user_name = max(similarities, key=similarities.get)
return matched_user_name
# ユーザーのプロフィール情報を入力
name = input("名前を入力してください: ")
age = input("年齢を入力してください: ")
gender = input("性別を入力してください: ")
text = input("自己紹介文を入力してください: ")
# プロフィール情報の格納
profile = {
"name": name,
"age": age,
"gender": gender,
"text": text
}
# マッチング
matched_user_name = match(profile)
# 結果出力
print(f"マッチング結果: {profile['name']} -> {matched_user_name}")
実験結果
50件のプロフィールとの類似度を計算した結果、もっとも類似度の高いユーザーは、映画制作に関わる脚本家の男性でした。
{
"id": 18,
"name": "ポポス",
"age": 26,
"gender": "男性",
"text": "映画製作に関わる仕事をしており、特に脚本作りに情熱を注いでいます。週末は映画館で新作映画を観るか、自宅でシナリオを練るのが日課です。好きな作家は、村上春樹とポール・オースターです。映画は特にインディペンデント映画に魅力を感じ、クリエイティブな表現に触れることでインスピレーションを得ています。旅行は映画のロケ地を巡るのが趣味で、アメリカのニューヨークやイタリアのローマを訪れたことがあります。理想のパートナーは、映画や物語に対して情熱を持ち、一緒にクリエイティブな活動を楽しめる人です。"
},
考察
今回の実験結果から、Embedding APIによって以下の点で類似度が高いと認識された可能性があります。
- 映画制作とゲーム制作のクリエイティブな活動における共通点
- 好きな作家「村上春樹」と好きな映画「風の歌を聴け」(原作:村上春樹)の共通点
さいごに
GPTのEmbedding APIを使って、検索したいプロフィールと似ている既存ユーザーのプロフィールを検索することができました。この技術を応用することで、マッチングアプリで似た様な人物を検索したり、創作活動におけるパートナーを見つけたりするなど、さまざまな可能性が広がります。
記事が良いなと思ったら、いいねとフォローをよろしくお願いします。
Discussion