ESMATUGBA's picture
Update app.py
5eed478 verified
Raw
History Blame Contribute Delete
7.02 kB
import streamlit as st
import pickle
from scipy import spatial
import os
import glob
# --- 1. MODELİ YÜKLE ---
@st.cache_resource
def load_data():
try:
# Model dosyasını kontrol et
if os.path.exists('movie_model.pkl'):
with open('movie_model.pkl', 'rb') as f:
return pickle.load(f)
return None
except:
return None
model_data = load_data()
movie_dict = model_data['movie_dict'] if model_data else {}
# --- 2. OYUNCU DNA VERİTABANI ---
tum_unlu_verileri = {
"Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
"Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
"Johnny Depp": {"c": "Male / Erkek", "v": [0.1, 0.9, 0.8, 0.4, 0.1, 0.1]},
"Jason Statham": {"c": "Male / Erkek", "v": [0.95, 0.3, 0.1, 0.1, 0.1, 0.7]},
"Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
"Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
"Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
"Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]},
"Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]},
"Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]},
"Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
"Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]},
"Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]},
"Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]},
"Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]},
"Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
"Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
"Leonardo DiCaprio": {"c": "Male / Erkek", "v": [0.3, 0.1, 0.1, 0.95, 0.1, 0.8]},
"Matt Damon": {"c": "Male / Erkek", "v": [0.8, 0.3, 0.2, 0.9, 0.2, 0.6]},
"Will Smith": {"c": "Male / Erkek", "v": [0.9, 0.6, 0.8, 0.5, 0.1, 0.2]},
"Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
"Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
"Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]},
"Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]},
"Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]},
"Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]},
"Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
"Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
"Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]},
"Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]},
"Emma Watson": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.2, 0.9, 0.6, 0.1]}
}
# --- ARAYÜZ AYARLARI ---
st.set_page_config(page_title="CastMatch AI", layout="wide")
# CSS: Titreme önleme ve resim sabitleme
st.markdown("""
<style>
[data-testid="stImage"] {
min-height: 400px !important;
max-height: 400px !important;
display: flex; align-items: center; justify-content: center;
}
.stImage img {
max-height: 400px !important;
width: auto !important;
object-fit: contain;
}
</style>
""", unsafe_allow_html=True)
# --- SIDEBAR (YAN PANEL) ---
st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
st.sidebar.markdown("---")
gender_choice = st.sidebar.radio("1. Select Category / Kategori Seçin:", ["Male / Erkek", "Female / Kadın"])
filtered_names = sorted([name for name in tum_unlu_verileri.keys() if tum_unlu_verileri[name]['c'] == gender_choice])
st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
for n in filtered_names:
st.sidebar.write(f"• {n}")
# --- ANA EKRAN ---
st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
st.markdown("---")
col_actor, col_match = st.columns([1, 2])
with col_actor:
st.subheader("👤 Pick an Actor / Oyuncu Seç")
selected_actor = st.selectbox("Select from list / Listeden seçin:", ["Choose... / Seçiniz..."] + filtered_names)
if selected_actor != "Choose... / Seçiniz...":
# HEM LOKAL HEM HF İÇİN AKILLI DOSYA ARAMA
found_path = None
# Oyuncu isminin muhtemel dosya adı varyasyonları
name_variants = [
selected_actor.replace(" ", "_").lower(),
selected_actor.replace(" ", " ").lower(),
selected_actor.lower()
]
# Mevcut dizin ve tüm alt dizinlerdeki resimleri tara
all_images = glob.glob("**/*.*", recursive=True)
for img_path in all_images:
if img_path.lower().endswith(('.jpg', '.png', '.jpeg')):
for variant in name_variants:
if variant in img_path.lower():
found_path = img_path
break
if found_path: break
if found_path:
st.image(found_path, use_container_width=False)
else:
st.warning(f"Image not found / Resim bulunamadı: {selected_actor}")
st.markdown('<div style="height: 300px;"></div>', unsafe_allow_html=True)
else:
st.markdown('<div style="height: 400px; display: flex; align-items: center; justify-content: center; color: #999; font-style: italic;">Select an actor to view profile / Profil görmek için oyuncu seçin</div>', unsafe_allow_html=True)
with col_match:
st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
if st.button("🚀 Match and Recommend / Eşleştir ve Öner") and selected_actor != "Choose... / Seçiniz...":
if movie_dict:
actor_v = tum_unlu_verileri[selected_actor]['v']
results = []
for i in movie_dict:
dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6])
dist = max(0, min(1, dist))
results.append((movie_dict[i][0], dist))
top_matches = sorted(results, key=lambda x: x[1])[:5]
for i, (film, score) in enumerate(top_matches, 1):
pct = max(0, min(100, round((1 - score) * 100, 1)))
st.success(f"**{i}. {film}**")
st.write(f"Match Score / Uyum Skoru: **%{pct}**")
st.progress(pct / 100)
else:
st.error("Model file missing! / Model dosyası eksik!")
# --- ALT BİLGİ ---
st.markdown("---")
st.info("**How it works? / Nasıl çalışır?**: This AI analyzes career vectors based on available local assets. / Bu yapay zeka, mevcut yerel varlıklara (resimlere) dayanarak kariyer vektörlerini analiz eder.")