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