File size: 6,929 Bytes
4185e90 e2ae4c3 4185e90 6cbfd2e 4185e90 74cb2e5 4185e90 6cbfd2e 4185e90 e2ae4c3 d075826 44186a6 d075826 44186a6 d075826 44186a6 e2ae4c3 d075826 e2ae4c3 44186a6 e2ae4c3 bb47a0f 44186a6 bb47a0f 44186a6 bb47a0f 44186a6 e2ae4c3 bb47a0f e2ae4c3 bb47a0f 44186a6 e2ae4c3 44186a6 e2ae4c3 bb47a0f e2ae4c3 44186a6 bb47a0f 44186a6 bb47a0f 44186a6 bb47a0f 44186a6 bb47a0f 44186a6 | 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 | import streamlit as st
import pickle
from scipy import spatial
import random
import os
# --- 1. MODELİ YÜKLE ---
@st.cache_resource
def load_data():
try:
with open('movie_model.pkl', 'rb') as f:
return pickle.load(f)
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]},
"Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 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]},
"George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]},
"Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]},
"Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
"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]},
"Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]},
"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]},
"Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]},
"Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
"Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]},
"Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
"Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 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]},
"Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]},
"Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]},
"Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
}
# --- ARAYÜZ AYARLARI ---
st.set_page_config(page_title="CastMatch AI", layout="wide")
# --- SOL PANEL (SIDEBAR) ---
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"]
)
# CRITICAL FIX: Filtrelemeyi klasörden değil, doğrudan ana veritabanından yapıyoruz.
# Böylece resim klasörü okunmasa bile isimler kaybolmaz.
filtered_names = [name for name, data in tum_unlu_verileri.items() if data['c'] == gender_choice]
st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
if not filtered_names:
st.sidebar.warning("No players found.")
else:
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("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
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:", filtered_names if filtered_names else ["Yok"])
if selected_actor != "Yok":
resim_klasoru = os.path.join(os.getcwd(), "40 resim")
found_path = None
# Resim arama mantığını esnettik
if os.path.exists(resim_klasoru):
search_target = selected_actor.replace(" ", "_").lower()
for f in os.listdir(resim_klasoru):
if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
found_path = os.path.join(resim_klasoru, f)
break
if found_path:
st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
else:
# Resim yoksa isim kaybolmasın, sadece hata mesajı verilsin
st.info(f"Resim dosyası '40 resim' klasöründe bulunamadı: {selected_actor}")
with col_match:
st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
st.write("Comparing the star's DNA with movie roles...")
if st.button("🚀 Match and Recommend / Eşleştir ve Öner") and selected_actor != "Yok":
if movie_dict:
# Veriyi 'tum_unlu_verileri' üzerinden çekiyoruz (Daha güvenli)
actor_v = tum_unlu_verileri[selected_actor]['v']
results = []
for i in movie_dict:
noise = random.uniform(0, 0.0001)
dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
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 = 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 dosyası eksik! / Model file missing!")
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.") |