File size: 7,024 Bytes
6a2dfee 5eed478 6a2dfee 4cd2943 6a2dfee 5eed478 6a2dfee 9dea6af 6a2dfee b36da3e 6a2dfee b36da3e 6a2dfee 91dfc14 c4eec1b 5eed478 8458122 5eed478 8458122 5eed478 6a2dfee ed4b7e6 8458122 ed4b7e6 5eed478 040ce8b ed4b7e6 9dea6af ed4b7e6 9dea6af c4eec1b 9dea6af 5eed478 c4eec1b 5eed478 040ce8b 5eed478 c4eec1b 8458122 ed4b7e6 9dea6af b36da3e 4cd2943 9dea6af ed4b7e6 9dea6af 91dfc14 9dea6af c4eec1b aafb258 ed4b7e6 4cd2943 040ce8b b962afb ed4b7e6 040ce8b 9dea6af 91dfc14 9dea6af 91dfc14 9dea6af 91dfc14 08ddb38 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | 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.") |