💨

Embedding APIで友達検索:趣味・価値観・創作意欲で繋がる新たな出会い

2024/02/17に公開

はじめに

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