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"])