ChatGPT APIを活用した推薦システムを作ってみよう。

OpenAI ChatGPT APIを活用した推薦システムを実装するには、以下の手順になるかと思います。

必要なデータを収集する 推薦システムに必要なデータを収集します。例えば、映画や書籍のタイトル、ジャンル、評価値、レビューなどです。また、ユーザーのプロフィール情報も必要になる場合があります。

データを前処理する 収集したデータを前処理して、OpenAI ChatGPT APIに入力できる形式に変換します。例えば、テキストデータをトークン化し、数値データを正規化します。

ChatGPT APIを呼び出す 前処理したデータをOpenAI ChatGPT APIに送信し、テキストデータを生成します。このとき、生成されたテキストデータは、ユーザーの評価値やレビューを含んでいる場合があります。

テキストデータを分析する 生成されたテキストデータを分析して、ユーザーに推薦するアイテムを選択します。例えば、生成されたテキストデータに含まれる単語やトークンをカウントして、ユーザーに関心があると思われるアイテムを選択することができます。

推薦結果を表示する 最後に、選択したアイテムをユーザーに表示することができます。例えば、Webアプリケーションやモバイルアプリケーションなどで、推薦結果を表示することができます。

手順のPythonコードを実装してみましょう。

手順1:データの収集

まず、推薦システムに必要なデータを収集します。ここでは、映画のデータを例に説明します。映画のタイトル、ジャンル、評価値、レビューを含むデータを取得します。

Pandasを使ってCSVファイルから映画のデータを読み込み、データの先頭を表示しています。

import pandas as pd

# データの読み込み
movies_df = pd.read_csv("movies.csv")

# データの表示
print(movies_df.head())
手順2:データの前処理

次に、収集したデータを前処理して、OpenAI ChatGPT APIに入力できる形式に変換します。ここでは、映画のレビューを例に説明します。レビューをトークン化し、OpenAI ChatGPT APIに入力できる形式に変換します。

下記は、OpenAI APIを使ってレビューをトークン化し、movies_dfに新しい列review_tokensとして追加しています。

import openai
import re

# OpenAI APIの設定
openai.api_key = "YOUR_API_KEY"

# テキストのトークン化
def tokenize_text(text):
    # 不要な文字を削除
    text = re.sub('[^a-zA-Z0-9 \n\.]', '', text)
    # テキストをトークン化
    response = openai.Completion.create(
        engine="davinci",
        prompt=f"Tokenize this text: {text}\n\nTokens:",
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.5,
    )
    # トークンを取得
    tokens = response.choices[0].text.strip().split("\n")
    return tokens

# レビューをトークン化
movies_df["review_tokens"] = movies_df["review"].apply(tokenize_text)

# データの表示
print(movies_df.head())

手順3:テキストの生成

ユーザーからの入力に基づいて、OpenAI APIを使ってテキストを生成します。

OpenAI APIを使って、トークンを入力としてテキストを生成する関数generate_textを定義しています。openai.Completion.createメソッドを使用して、Davinciエンジンを使用してテキストを生成しています。生成されたテキストは整形され、返されます。

import openai
import re
import pandas as pd

# OpenAI APIキーを設定
openai.api_key = "YOUR_API_KEY"

# テキストを生成する関数
def generate_text(prompt):
    # テキストの生成パラメータを設定
    completions = openai.Completion.create(
        engine="davinci",
        prompt=prompt,
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.5,
    )
    message = completions.choices[0].text
    # 生成されたテキストを整形
    message = message.strip()
    message = re.sub('[^0-9a-zA-Zあ-んア-ンが-ぽ一-龥!?、。]', '', message)
    return message

# 映画情報を読み込む
movies_df = pd.read_csv("movies.csv")

# テキストを生成して表示
text = generate_text("I want to watch an action movie with a high rating.")
print(text)

手順4:類似度の計算

生成されたテキストと各映画のタイトル、ジャンル、評価値を比較して、類似度を計算します。ここでは、Cosine類似度を使用します。

下記のcalculate_similarity関数を定義して、テキストと映画情報の類似度を計算しています。movies_dfに新しい列similarityを追加し、各映画の類似度を計算しています。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# テキストと映画情報の類似度を計算する関数
def calculate_similarity(text, movie_info):
    # 映画情報を文字列に変換
    movie_str = f"{movie_info['title']} {movie_info['genre']} {movie_info['rating']}"
    # 文字列をベクトル化
    vectorizer = CountVectorizer().fit_transform([text, movie_str])
    # Cosine類似度を計算
    similarity = cosine_similarity(vectorizer)[0, 1]
    return similarity

# テキストと各映画の類似度を計算
movies_df["similarity"] = movies_df["review_tokens"].apply(lambda x: calculate_similarity(" ".join(x), movies_df.iloc[0]))
手順5:推薦結果の表示

類似度が高い映画を取得し、ユーザーに推薦する映画のリストを作成します。ここでは、類似度が高い映画を上位5つ取得する例を示します。

get_recommendations関数を定義して、類似度が高い映画を取得しています。recommendationsに上位5つの映画を取得し、表示しています。

# 推薦映画の取得
def get_recommendations(movie_title, movies_df):
    # 対象映画のインデックスを取得
    idx = movies_df[movies_df["title"] == movie_title].index[0]
    # 類似度が高い映画を取得
    similar_movies = movies_df.sort_values("similarity", ascending=False).iloc[1:6]
    return similar_movies

# 映画の推薦結果を表示
recommendations = get_recommendations("The Dark Knight", movies_df)
print(recommendations["title"])

以上が、OpenAI ChatGPT APIを活用して推薦システムを実装する手順とPythonコードの例になります。