| import streamlit as st |
| import pickle |
| from scipy import spatial |
| import os |
| import glob |
|
|
| |
| @st.cache_resource |
| def load_data(): |
| try: |
| |
| 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 {} |
|
|
| |
| 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]} |
| } |
|
|
| |
| st.set_page_config(page_title="CastMatch AI", layout="wide") |
|
|
| |
| 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) |
|
|
| |
| 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}") |
|
|
| |
| 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...": |
| |
| found_path = None |
| |
| name_variants = [ |
| selected_actor.replace(" ", "_").lower(), |
| selected_actor.replace(" ", " ").lower(), |
| selected_actor.lower() |
| ] |
| |
| |
| 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!") |
|
|
| |
| 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.") |