気分選択しておすすめの本をレコメン
画面イメージ
蔵書が増えてくるとどんな本があるのかの管理がつきづらくなってくる。
自分が購入したほんとその内容、気分カテゴリを登録しておけば、デジタル的にアナログの本を管理して、その時の気分で読むべき本の自分専用のインデックスができる。自分の生活のDX化。
AI導入バージョンはシンプルにAPIでOpenAIにつなげただけだけど、自分の蔵書以外にもきける窓口を置いておくイメージ。
実行コード(非AI)
# ipywidgetsが未インストールの場合は以下を実行
!pip install ipywidgets --quiet
import ipywidgets as widgets
from IPython.display import display, Markdown, HTML, clear_output
# 本のレコメンド辞書
recommendations = {
"元気がない": [
{"title": "嫌われる勇気", "author": "岸見一郎", "comment": "自己肯定感を取り戻したいときに"},
{"title": "君たちはどう生きるか", "author": "吉野源三郎", "comment": "人生に意味を見出したいときに"}
],
"やる気がある": [
{"title": "メンタルが強い人がやめた13の習慣", "author": "エイミー・モーリン", "comment": "意志を行動に変えたいときに"},
{"title": "アウトプット大全", "author": "樺沢紫苑", "comment": "成果を上げたいときに"}
],
"悩みがある": [
{"title": "道は開ける", "author": "デール・カーネギー", "comment": "悩みの対処法を知りたいときに"},
{"title": "反応しない練習", "author": "草薙龍瞬", "comment": "仏教的に心を整えたいときに"}
],
"ゆったりしたい": [
{"title": "しろくまカフェ", "author": "ヒガアロハ", "comment": "癒されたいときに"},
{"title": "星の王子さま", "author": "サン=テグジュペリ", "comment": "やさしい気持ちになりたいときに"}
]
}
# スタイリッシュなタイトル表示
display(HTML("""
<div style="text-align:center; padding:10px; background-color:#f0f8ff; border-radius:10px; margin-bottom:20px;">
<h2 style="color:#2c3e50;">📚 今日の気分に合わせたおすすめの本</h2>
<p style="font-size:14px; color:#555;">気分を選んで、「本を探す」ボタンを押してね!</p>
</div>
"""))
# ウィジェット
mood_dropdown = widgets.Dropdown(
options=list(recommendations.keys()),
description='気分を選択:',
style={'description_width': 'initial'},
layout=widgets.Layout(width='50%')
)
search_button = widgets.Button(
description="📖 本を探す",
button_style='info',
layout=widgets.Layout(width='30%', margin='10px 0 20px 0')
)
output = widgets.Output()
# クリック時の動作
def show_recommendations(_):
output.clear_output()
mood = mood_dropdown.value
books = recommendations[mood]
with output:
display(HTML(f"""
<div style="padding:15px; background-color:#fcfcfc; border:1px solid #ddd; border-radius:10px;">
<h3 style="color:#34495e;">🎯 あなたの気分: <em>{mood}</em></h3>
<ul style="list-style:none; padding-left:0;">
"""))
for book in books:
display(HTML(f"""
<li style="margin-bottom:15px;">
<div style="padding:10px; background-color:#f9f9f9; border-radius:8px; box-shadow:0 1px 3px rgba(0,0,0,0.05);">
<strong>{book['title']}</strong>({book['author']})<br>
<span style="color:#555;">{book['comment']}</span>
</div>
</li>
"""))
display(HTML("</ul></div>"))
# イベント登録
search_button.on_click(show_recommendations)
# 表示
display(mood_dropdown, search_button, output)
import tkinter as tk
from tkinter import ttk, messagebox
import openai
# ✅ ここにあなたのAPIキーを入力してください
openai.api_key = "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# 🎯 ChatGPTに本をおすすめさせる関数
def get_ai_recommendation(mood):
try:
prompt = f"「{mood}」という気分の人におすすめの本を日本語で2冊紹介してください。タイトル・著者・理由を簡潔に含めてください。"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", # または "gpt-4" に変更可能
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
)
return response.choices[0].message["content"]
except Exception as e:
return f"❌ エラーが発生しました: {e}"
# --- Tkinter GUI ---
root = tk.Tk()
root.title("AIに本をおすすめしてもらうアプリ")
root.geometry("650x600")
tk.Label(root, text="🤖 気分からChatGPTが本をレコメンド", font=("Helvetica", 16, "bold")).pack(pady=10)
# 気分の入力
tk.Label(root, text="気分を入力(例: 元気がない / やる気がある / 不安)").pack()
mood_entry = tk.Entry(root, width=40)
mood_entry.pack(pady=5)
# 出力結果表示
result_box = tk.Text(root, height=20, width=80)
result_box.pack(pady=10)
# AI呼び出し
def run_ai():
mood = mood_entry.get().strip()
if not mood:
messagebox.showwarning("入力エラー", "気分を入力してください。")
return
result_box.delete("1.0", tk.END)
result_box.insert(tk.END, "🔍 ChatGPTが考え中...\n")
root.update()
result = get_ai_recommendation(mood)
result_box.delete("1.0", tk.END)
result_box.insert(tk.END, result)
# ボタン(黒色)
tk.Button(root, text="📖 ChatGPTに本を提案してもらう", command=run_ai, bg="white", fg="black").pack(pady=10)
root.mainloop()

