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. TÜM 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]} } # --- DİNAMİK FİLTRELEME (KLASÖRE GÖRE) --- resim_klasoru = os.path.join(os.getcwd(), "40 resim") def klasordeki_unluleri_getir(): mevcut_unlular = {} if os.path.exists(resim_klasoru): dosyalar = [f.lower() for f in os.listdir(resim_klasoru)] for isim, veri in tum_unlu_verileri.items(): search_pattern1 = isim.lower().replace(" ", "_") search_pattern2 = isim.lower() if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar): mevcut_unlular[isim] = veri return mevcut_unlular unlu_verileri = klasordeki_unluleri_getir() # --- 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"] ) filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice] st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular") if not filtered_names: st.sidebar.warning("Bu kategoride resim bulunamadı. / No images in this category.") 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": found_path = None 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: st.error("Resim yüklenemedi. / Image could not be loaded.") with col_match: st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri") st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...") if st.button("🚀 Match and Recommend / Eşleştir ve Öner") and selected_actor != "Yok": if movie_dict: actor_v = 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("---") # EN ALT BİLGİ NOTU DÜZELTİLDİ: 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.")