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.")