Gemini proでECサイトのカテゴリ名を名寄せする
ECサイトのカテゴリはサイトごとに名称が異なり、横断的な分析ができずに課題を抱えていました。
今回は、Gemini ProをAPIから呼び出し、AmazonとYahooのカテゴリ名を対象の楽天のカテゴリに
自動で名寄せ処理を行います。
これは、AIの自然言語処理タスクの応用例の一つです。
3行まとめ
・ECサイト(楽天、Amazon、Yahoo)のカテゴリ名を共通化する
・APIからGeminiを呼び出しで一括で処理する
・名寄せタスクのAI活用例の一例
概要
3大ECサイトはAmazon、Yahoo、楽天を対象としています。
例えばAmazonのカテゴリDIY・工具・ガーデンが、楽天カテゴリのDIY・工具と同じ扱いにしたい
といった内容です。
利用環境
Gemini pro 1.5 latest
Google Colaboratory
レート制限
360 RPM(1 分あたりのリクエスト数)
400万TPM(1 分あたりのトークン数)
最大 128,000 トークンのプロンプト
入力料金100万トークンあたり $3.50
出力料金100万トークンあたり $10.50
コンテキストのキャッシュ保存 100万トークンあたり $0.875
気をつけるポイントは1分あたりのトークン数
入力プロンプトのコンテキストサイズの制限です。
この辺りを超えないように工夫が必要です。
場合によっては、ループの途中で待ち時間を設けると良いです。
内容
プロンプト
プロンプトでは、各カテゴリの階層1,2,3まで定義されているcsvファイルと
対象の楽天のカテゴリの階層1,2,3まで定義されているcsvファイルを文字列に変換してプロンプトに組み込みます。
また、アウトプットとしてはcsvで出力したいので
解説やcsvを示すキーワード、実際の処理内容については出力しないように指示しています。
以下はCSVファイルの内容です:
# やりたいこと
Yahooで取り扱われている商品全てには、その商品を分類するためのcategory名称が設定されており、category_level_1,category_level_2,category_level_3までの定義が為されている。
Yahooのcategory名称はYahoo特有の定義であるため、共通商品マスタであるRakuten商品マスタのカテゴリ定義に置き換える必要がある。Yahooのカテゴリ名称をRakuten商品マスタのカテゴリを比較し、最も近いRakuten商品マスタのカテゴリを教えてください。
# 添付ファイルについての説明
1. rakuten_category.csv
{rakuten_content}
- Rakutenカテゴリマスタ
- category1,category2,category3までの3階層が存在し、category1,category2,category3の順で詳細なカテゴリに細分化されている。
2. yahoo_category.csv
{yahoo_content}
- Yahooカテゴリマスタ
- yahooの商品カテゴリ(category_level_1,category_level_2,category_level_3まで)の一覧
# 出力する内容
1. Yahooカテゴリマスタの全てのレコードにおいて、Rakutenカテゴリマスタの対応するcategoryを抽出し、以下の項目をCSV形式で出力する
- Yahooカテゴリマスタ category_level_1
- Yahooカテゴリマスタ category_level_2
- Yahooカテゴリマスタ category_level_3
- Rakutenカテゴリマスタ category1
- Rakutenカテゴリマスタ category2
- Rakutenカテゴリマスタ category3
# 出力しない内容
- ```csvや```などcsvファイルを示す文字列は出力しないこと
- 解説やpythonコードは出力しないこと
Amazonを実行する場合はそれぞれyahooの文言をamazonに変更すればOKです。
APIキーの設定
こちらからAPIキーを作成して取得します。
import os
from google.colab import userdata
os.environ['GEMINI_API_KEY'] = [YOUR_GEMINI_API_KEY]
Googleドライブにカテゴリ情報をアップロードしておきます。
ライブラリのインストール
pythonからgemini apiを実行するためのライブラリ、ループ処理用のライブラリをインストールします。
!pip install google-generativeai
!pip install pandas
!pip install tqdm
ドライブに接続
from google.colab import drive
drive.mount('/content/drive')
ファイルのロード
# ファイル読み込み
import google.generativeai as genai
import pandas as pd
from tqdm import tqdm
# Gemini Pro APIキーを設定
genai.configure(api_key=GEMINI_API_KEY)
# モデルの選択
model = genai.GenerativeModel('gemini-1.5-pro-latest')
# CSVファイルの読み込み
df_amazon = pd.read_csv('/content/drive/MyDrive/category/amazon_category.csv')
df_rakuten = pd.read_csv('/content/drive/MyDrive/category/rakuten_category.csv')
df_yahoo = pd.read_csv('/content/drive/MyDrive/category/yahoo_category.csv')
# CSVデータの内容を文字列に変換
amazon_content = df_amazon.to_string(index=False)
rakuten_content = df_rakuten.to_string(index=False)
yahoo_content = df_yahoo.to_string(index=False)
カテゴリ階層1ごとにループ処理する
プロンプトのトークン制限の都合上、各カテゴリ階層1ごとにループさせてプロンプトのサイズをおさえます。
# モデルの選択
model = genai.GenerativeModel('gemini-1.5-pro-latest')
# CSVファイルの読み込み
df_yahoo = pd.read_csv('/content/drive/MyDrive/category/yahoo_category.csv')
df_rakuten = pd.read_csv('/content/drive/MyDrive/category/rakuten_category.csv')
# Rakutenカテゴリデータの準備
rakuten_content = df_rakuten.to_string(index=False)
# 結果を格納するリスト
results = []
# CATEGORY_LEVEL_1でグループ化して処理
for category_level_1, group in tqdm(df_yahoo.groupby('CATEGORY_LEVEL_1')):
# グループ内のデータを文字列に変換
yahoo_content = group.to_string(index=False)
# プロンプトの作成
prompt = f"""
以下はCSVファイルの内容です:
# やりたいこと
Yahooで取り扱われている商品全てには、その商品を分類するためのcategory名称が設定されており、category_level_1からcategory_level_3までの定義が為されている。
Yahooのcategory名称はYahoo特有の定義であるため、共通商品マスタであるRakuten商品マスタのカテゴリ定義に置き換える必要がある。Yahooのカテゴリ名称をRakuten商品マスタのカテゴリを比較し、最も近いRakuten商品マスタのカテゴリを教えてください。
# 添付ファイルについての説明
1. rakuten_category.csv
{rakuten_content}
- Rakutenカテゴリマスタ
- category1,category2,category3までの3階層が存在し、category1,category2,category3の順で詳細なカテゴリに細分化されている。
2. yahoo_category.csv
{yahoo_content}
- Yahooカテゴリマスタ
- yahooの商品カテゴリ(category_level_1,category_level_2,category_level_3まで)の一覧
# 出力する内容
1. Yahooカテゴリマスタの全てのレコードにおいて、Rakutenカテゴリマスタの対応するcategoryを抽出し、以下の項目をCSV形式で出力する
- Yahooカテゴリマスタ category_level_1
- Yahooカテゴリマスタ category_level_2
- Yahooカテゴリマスタ category_level_3
- Rakutenカテゴリマスタ category1
- Rakutenカテゴリマスタ category2
- Rakutenカテゴリマスタ category3
# 出力しない内容
- ```csvや```などcsvファイルを示す文字列は出力しないこと
- 解説やpythonコードは出力しないこと
"""
response = model.count_tokens(prompt)
print(response)
if response.total_tokens > 128000:
print('token limit 429')
else:
# Gemini Proへの問い合わせ
response = model.generate_content(prompt)
# 応答をリストに追加
results.append(response.text)
ファイルを結合してGoogle Driveに保存する
生成結果をそのままcsvとして保存するとエラーになる場合があるので
テキストファイルとして保存します。
# 結果を1つの文字列にまとめる
combined_results = '\n'.join(results)
file_path = '/content/drive/MyDrive/category/yahoo_rakuten_category_mapping.csv'
# テキストファイルとして保存
with open(file_path, 'w', encoding='utf-8') as f:
f.write(combined_results)
print(f"ファイルが保存されました: {file_path}")
print("処理が完了し、結果がCSVファイルとして保存されました。")
Googleスプレッドシートで保存されたファイルを開き、必要に応じて欠損状態や不要な行を削除します。
成果物
今回の処理の結果の一部分を掲載します。
Yahoo
CATEGORY_LEVEL_1 | CATEGORY_LEVEL_2 | CATEGORY_LEVEL_3 | CATEGORY_LEVEL_1 | CATEGORY_LEVEL_2 | CATEGORY_LEVEL_3 |
---|---|---|---|---|---|
CD、音楽ソフト | 邦楽音楽ソフト | 邦楽R&Bの音楽ソフト | CD・DVD | CD | R&B |
CD、音楽ソフト | クラシックの音楽ソフト | 古楽、バロック、宗教音楽の音楽ソフト | CD・DVD | CD | クラシック |
CD、音楽ソフト | 実用音楽ソフト | 効果音の音楽ソフト | CD・DVD | CD | サウンドトラック |
CD、音楽ソフト | サウンドトラック音楽ソフト | サウンドトラックオムニバス音楽ソフト | CD・DVD | CD | サウンドトラック |
CD、音楽ソフト | ワールドミュージックの音楽ソフト | シャンソンの音楽ソフト | CD・DVD | CD | ワールドミュージック |
CD、音楽ソフト | アニメ、ゲームの音楽ソフト | 声優の音楽ソフト | CD・DVD | CD | アニメ |
CD、音楽ソフト | アニメ、ゲームの音楽ソフト | ゲームミュージックの音楽ソフト | CD・DVD | CD | ゲームミュージック |
階層1のCD、音楽ソフトは、楽天のCD・DVDと定義され、
階層2のクラシックの音楽ソフトは、楽天のCDと定義され
階層3の古楽、バロック、宗教音楽の音楽ソフトは、楽天のクラシックに定義されました。
Amazon
CATEGORY_LEVEL_1 | CATEGORY_LEVEL_2 | CATEGORY_LEVEL_3 | CATEGORY_LEVEL_1 | CATEGORY_LEVEL_2 | CATEGORY_LEVEL_3 |
---|---|---|---|---|---|
DIY・工具・ガーデン | 電動工具・エア工具 | サンダー | DIY・工具 | 電動工具 | ディスクサンダー |
DIY・工具・ガーデン | 配管・排水用備品 | DIY・工具 | 配管・排水 | 配管用部品 | |
DIY・工具・ガーデン | 作業工具 | ねじ用ドライバー・ナットドライバー | DIY・工具 | 工具 | ドライバー |
DIY・工具・ガーデン | 配管・排水用備品 | 配管用部品 | DIY・工具 | 配管・排水 | 配管用部品 |
DIY・工具・ガーデン | 住宅用設備・製品 | 収納・キャビネット | インテリア・寝具・収納 | 収納家具 | キャビネット |
DIY・工具・ガーデン | 作業工具 | 接着・接合工具 | DIY・工具 | 工具 | 接着剤 |
DIY・工具・ガーデン | 電動工具・エア工具 | ボール盤 | DIY・工具 | 電動工具 | ボール盤 |
階層1のDIY・工具・ガーデンはDIY・工具に定義され、
階層2の電動工具・エア工具は電動工具に定義され、
階層3のサンダーはディスクサンダーに定義されました。
結果
全体としてはおよそ、70%くらいの精度で分類されており、
欠損値やあやしいと思われる箇所は修正が必要なものの一定の成果は出ている結果となりました。
余談
同じプロンプトでGPT-4oで試したところ
インプットテーブルのテーブルの認識が不十分でGeminiより精度が出ない結果となりました。
この点Gemini proは表データの認識に強いと言えます。
CATEGORY_LEVEL_1 | CATEGORY_LEVEL_2 | CATEGORY_LEVEL_3 | CATEGORY_LEVEL_1 | CATEGORY_LEVEL_2 | CATEGORY_LEVEL_3 |
---|---|---|---|---|---|
文房具・オフィス用品 | オフィス家具・収納 | PCプラットフォーム・スタンド | |||
ホーム&キッチン | バス・トイレ・洗面用品 | タオル | |||
本 | 雑誌 | 趣味・その他 | |||
パソコン・周辺機器 | PCアクセサリ・サプライ | プリンタアクセサリ | |||
洋書 | Politics & Social Sciences |
※予測の列が空データとなってしまった
Discussion