ESMATUGBA commited on
Commit
e970b6a
·
verified ·
1 Parent(s): d075826

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -116
app.py CHANGED
@@ -4,7 +4,7 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # 1. MODELİ YÜKLE
8
  @st.cache_resource
9
  def load_data():
10
  try:
@@ -16,7 +16,7 @@ def load_data():
16
  model_data = load_data()
17
  movie_dict = model_data['movie_dict'] if model_data else {}
18
 
19
- # 2. TÜM OYUNCU DNA VERİTABANI
20
  tum_unlu_verileri = {
21
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
22
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -57,126 +57,34 @@ tum_unlu_verileri = {
57
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
58
  }
59
 
60
- # --- RESİM KLASÖRÜ AYARI ---
61
  resim_klasoru = os.path.join(os.getcwd(), "40 resim")
62
 
63
- # --- ARAYÜZ AYARLARI ---
64
  st.set_page_config(page_title="CastMatch AI", layout="wide")
65
 
66
- # --- SOL PANEL (SIDEBAR) ---
67
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
68
  st.sidebar.markdown("---")
69
 
70
  gender_choice = st.sidebar.radio(
71
  "1. Select Category / Kategori Seçin:",
72
- ["Male / Erkek", "Female / Kadın"]
 
73
  )
74
 
75
- # Klasörde resim olsa da olmasa da isimleri listele ki "Yok" çıkmasın
76
  filtered_names = [name for name, data in tum_unlu_verileri.items() if data['c'] == gender_choice]
77
 
78
  st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
79
 
80
- # SENKRONİZASYON: Sidebar seçimini ana state'e bağlıyoruz
81
  selected_actor_sidebar = st.sidebar.radio(
82
- "Quick Select:",
83
  filtered_names,
84
- label_visibility="collapsed"
85
  )
86
 
87
- # --- ANA EKRAN ---
88
- st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
89
- st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
90
- st.markdown("---")
91
-
92
- col_actor, col_match = st.columns([1, 2])
93
- import streamlit as st
94
- import pickle
95
- from scipy import spatial
96
- import random
97
- import os
98
-
99
- # 1. MODELİ YÜKLE
100
- @st.cache_resource
101
- def load_data():
102
- try:
103
- with open('movie_model.pkl', 'rb') as f:
104
- return pickle.load(f)
105
- except:
106
- return None
107
-
108
- model_data = load_data()
109
- movie_dict = model_data['movie_dict'] if model_data else {}
110
-
111
- # 2. TÜM OYUNCU DNA VERİTABANI
112
- tum_unlu_verileri = {
113
- "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
114
- "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
115
- "Johnny Depp": {"c": "Male / Erkek", "v": [0.1, 0.9, 0.8, 0.4, 0.1, 0.1]},
116
- "Jason Statham": {"c": "Male / Erkek", "v": [0.95, 0.3, 0.1, 0.1, 0.1, 0.7]},
117
- "Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
118
- "Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
119
- "Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
120
- "Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]},
121
- "Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]},
122
- "Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]},
123
- "Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
124
- "Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]},
125
- "Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]},
126
- "Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]},
127
- "Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 0.8]},
128
- "Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]},
129
- "Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
130
- "George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]},
131
- "Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]},
132
- "Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
133
- "Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
134
- "Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
135
- "Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]},
136
- "Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]},
137
- "Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]},
138
- "Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]},
139
- "Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]},
140
- "Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]},
141
- "Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
142
- "Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]},
143
- "Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
144
- "Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 0.1, 0.1]},
145
- "Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]},
146
- "Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]},
147
- "Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]},
148
- "Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]},
149
- "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
150
- }
151
-
152
- # --- RESİM KLASÖRÜ AYARI ---
153
- resim_klasoru = os.path.join(os.getcwd(), "40 resim")
154
-
155
- # --- ARAYÜZ AYARLARI ---
156
- st.set_page_config(page_title="CastMatch AI", layout="wide")
157
-
158
- # --- SOL PANEL (SIDEBAR) ---
159
- st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
160
- st.sidebar.markdown("---")
161
-
162
- gender_choice = st.sidebar.radio(
163
- "1. Select Category / Kategori Seçin:",
164
- ["Male / Erkek", "Female / Kadın"]
165
- )
166
-
167
- # Klasörde resim olsa da olmasa da isimleri listele ki "Yok" çıkmasın
168
- filtered_names = [name for name, data in tum_unlu_verileri.items() if data['c'] == gender_choice]
169
-
170
- st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
171
-
172
- # SENKRONİZASYON: Sidebar seçimini ana state'e bağlıyoruz
173
- selected_actor_sidebar = st.sidebar.radio(
174
- "Quick Select:",
175
- filtered_names,
176
- label_visibility="collapsed"
177
- )
178
-
179
- # --- ANA EKRAN ---
180
  st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
181
  st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
182
  st.markdown("---")
@@ -186,21 +94,21 @@ col_actor, col_match = st.columns([1, 2])
186
  with col_actor:
187
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
188
 
189
- # Sidebar'daki seçimi buradaki selectbox'a zorla eşle
190
  current_idx = filtered_names.index(selected_actor_sidebar)
191
 
192
  selected_actor = st.selectbox(
193
  "Select from list / Listeden seçin:",
194
  filtered_names,
195
- index=current_idx
 
196
  )
197
 
198
- # RESİM BULMA MANTIĞI
199
  found_path = None
200
  if os.path.exists(resim_klasoru):
201
  search_target = selected_actor.replace(" ", "_").lower()
202
- dosyalar = os.listdir(resim_klasoru)
203
- for f in dosyalar:
204
  if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
205
  found_path = os.path.join(resim_klasoru, f)
206
  break
@@ -208,30 +116,27 @@ with col_actor:
208
  if found_path:
209
  st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
210
  else:
211
- # Resim yoksa bir placeholder veya uyarı göster ama isimler kaybolmasın
212
- st.warning(f"Resim dosyası '40 resim' klasöründe bulunamadı: {selected_actor}")
213
 
214
  with col_match:
215
  st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
216
- st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
217
 
218
  if st.button("🚀 Match and Recommend / Eşleştir ve Öner"):
219
  if movie_dict:
220
  actor_v = tum_unlu_verileri[selected_actor]['v']
221
  results = []
222
  for i in movie_dict:
223
- noise = random.uniform(0, 0.0001)
224
- dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
225
  results.append((movie_dict[i][0], dist))
226
 
227
  top_matches = sorted(results, key=lambda x: x[1])[:5]
228
  for i, (film, score) in enumerate(top_matches, 1):
229
  pct = round((1 - score) * 100, 1)
230
- st.success(f"**{i}. {film}**")
231
- st.write(f"Match Score / Uyum Skoru: **%{pct}**")
232
  st.progress(pct / 100)
233
  else:
234
- st.error("Model dosyası eksik! / Model file missing!")
235
 
236
  st.markdown("---")
237
  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.")
 
4
  import random
5
  import os
6
 
7
+ # --- 1. MODELİ YÜKLE ---
8
  @st.cache_resource
9
  def load_data():
10
  try:
 
16
  model_data = load_data()
17
  movie_dict = model_data['movie_dict'] if model_data else {}
18
 
19
+ # --- 2. TÜM OYUNCU DNA VERİTABANI ---
20
  tum_unlu_verileri = {
21
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
22
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
57
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
58
  }
59
 
60
+ # --- 3. RESİM AYARLARI ---
61
  resim_klasoru = os.path.join(os.getcwd(), "40 resim")
62
 
63
+ # --- 4. ARAYÜZ AYARLARI ---
64
  st.set_page_config(page_title="CastMatch AI", layout="wide")
65
 
66
+ # --- 5. SOL PANEL (SIDEBAR) ---
67
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
68
  st.sidebar.markdown("---")
69
 
70
  gender_choice = st.sidebar.radio(
71
  "1. Select Category / Kategori Seçin:",
72
+ ["Male / Erkek", "Female / Kadın"],
73
+ key="unique_gender_radio" # Hata veren ID burasıydı, eşsiz yaptık
74
  )
75
 
 
76
  filtered_names = [name for name, data in tum_unlu_verileri.items() if data['c'] == gender_choice]
77
 
78
  st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
79
 
80
+ # Sol taraftaki tıklanabilir liste
81
  selected_actor_sidebar = st.sidebar.radio(
82
+ "Quick Selection:",
83
  filtered_names,
84
+ key="unique_actor_list_radio" # Sol paneldeki isim listesi
85
  )
86
 
87
+ # --- 6. ANA EKRAN ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
89
  st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
90
  st.markdown("---")
 
94
  with col_actor:
95
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
96
 
97
+ # Sol taraftan gelen seçimi buradaki kutunun varsayılanı yapıyoruz
98
  current_idx = filtered_names.index(selected_actor_sidebar)
99
 
100
  selected_actor = st.selectbox(
101
  "Select from list / Listeden seçin:",
102
  filtered_names,
103
+ index=current_idx,
104
+ key="main_screen_selectbox"
105
  )
106
 
107
+ # Resim gösterme mantığı
108
  found_path = None
109
  if os.path.exists(resim_klasoru):
110
  search_target = selected_actor.replace(" ", "_").lower()
111
+ for f in os.listdir(resim_klasoru):
 
112
  if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
113
  found_path = os.path.join(resim_klasoru, f)
114
  break
 
116
  if found_path:
117
  st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
118
  else:
119
+ st.warning(f"Image not found for: {selected_actor}")
 
120
 
121
  with col_match:
122
  st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
123
+ st.write("Comparing the star's DNA with movie roles...")
124
 
125
  if st.button("🚀 Match and Recommend / Eşleştir ve Öner"):
126
  if movie_dict:
127
  actor_v = tum_unlu_verileri[selected_actor]['v']
128
  results = []
129
  for i in movie_dict:
130
+ dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + random.uniform(0, 0.0001)
 
131
  results.append((movie_dict[i][0], dist))
132
 
133
  top_matches = sorted(results, key=lambda x: x[1])[:5]
134
  for i, (film, score) in enumerate(top_matches, 1):
135
  pct = round((1 - score) * 100, 1)
136
+ st.success(f"**{i}. {film}** (%{pct})")
 
137
  st.progress(pct / 100)
138
  else:
139
+ st.error("Model dosyası bulunamadı!")
140
 
141
  st.markdown("---")
142
  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.")