File size: 7,024 Bytes
6a2dfee
 
 
 
5eed478
6a2dfee
4cd2943
6a2dfee
 
 
5eed478
 
 
 
 
6a2dfee
 
 
 
 
 
9dea6af
6a2dfee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b36da3e
 
 
6a2dfee
 
 
 
 
 
 
 
 
 
b36da3e
6a2dfee
 
91dfc14
 
c4eec1b
5eed478
8458122
 
 
 
 
5eed478
8458122
 
 
 
 
 
 
 
 
5eed478
6a2dfee
ed4b7e6
8458122
ed4b7e6
5eed478
040ce8b
ed4b7e6
 
 
 
 
9dea6af
ed4b7e6
 
 
 
 
 
9dea6af
c4eec1b
9dea6af
5eed478
c4eec1b
5eed478
 
 
 
 
 
 
 
 
040ce8b
5eed478
 
 
 
 
 
 
c4eec1b
 
8458122
ed4b7e6
9dea6af
b36da3e
4cd2943
9dea6af
ed4b7e6
 
9dea6af
91dfc14
9dea6af
c4eec1b
aafb258
ed4b7e6
 
4cd2943
040ce8b
b962afb
ed4b7e6
 
 
040ce8b
9dea6af
 
91dfc14
 
9dea6af
91dfc14
9dea6af
91dfc14
08ddb38
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
137
138
139
140
141
142
143
144
145
146
147
148
149
import streamlit as st
import pickle
from scipy import spatial
import os
import glob

# --- 1. MODELİ YÜKLE ---
@st.cache_resource
def load_data():
    try:
        # Model dosyasını kontrol et
        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 {}

# --- 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]},
    "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]}
}

# --- ARAYÜZ AYARLARI ---
st.set_page_config(page_title="CastMatch AI", layout="wide")

# CSS: Titreme önleme ve resim sabitleme
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)

# --- SIDEBAR (YAN PANEL) ---
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}")

# --- ANA EKRAN ---
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...":
        # HEM LOKAL HEM HF İÇİN AKILLI DOSYA ARAMA
        found_path = None
        # Oyuncu isminin muhtemel dosya adı varyasyonları
        name_variants = [
            selected_actor.replace(" ", "_").lower(),
            selected_actor.replace(" ", " ").lower(),
            selected_actor.lower()
        ]
        
        # Mevcut dizin ve tüm alt dizinlerdeki resimleri tara
        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!")

# --- ALT BİLGİ ---
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.")