| import streamlit as st |
| import pickle |
| from scipy import spatial |
| import random |
| import os |
|
|
| |
| @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 {} |
|
|
| |
| 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]} |
| } |
|
|
| |
| |
| resim_klasoru = os.getcwd() |
|
|
| def klasordeki_unluleri_getir(): |
| mevcut_unlular = {} |
| 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 if d.endswith(('.jpg', '.png', '.jpeg'))): |
| mevcut_unlular[isim] = veri |
| return mevcut_unlular |
|
|
| unlu_verileri = klasordeki_unluleri_getir() |
|
|
| |
| st.set_page_config(page_title="CastMatch AI", layout="wide") |
|
|
| |
| 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 found.") |
| for n in filtered_names: |
| st.sidebar.write(f"• {n}") |
|
|
| |
| 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_targets = [selected_actor.lower().replace(" ", "_"), selected_actor.lower()] |
| |
| |
| for f in os.listdir(resim_klasoru): |
| if any(f.lower().startswith(target) for target in search_targets): |
| 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 bulunamadı. / Image not found.") |
|
|
| 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 Error / Model Hatası") |
|
|
| 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 dayanarak kariyer vektörlerini analiz eder.") |