ESMATUGBA commited on
Commit
44186a6
·
verified ·
1 Parent(s): bb47a0f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -58
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. 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,90 +57,107 @@ 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
- # --- 3. SAYFA AYARLARI ---
 
 
 
61
  st.set_page_config(page_title="CastMatch AI", layout="wide")
62
 
63
- # --- 4. SESSION STATE (SENKRONİZASYON) ---
64
- if "actor_key" not in st.session_state:
65
- st.session_state.actor_key = "Sylvester Stallone"
66
 
67
- # --- 5. SOL PANEL ---
68
- st.sidebar.title("🔍 Control Panel")
69
  st.sidebar.markdown("---")
70
 
71
- gender = st.sidebar.radio(
72
- "1. Select Category:",
73
  ["Male / Erkek", "Female / Kadın"],
74
- key="gender_sel"
75
  )
76
 
77
- # Kategoriye göre listeyi al
78
- available_names = [name for name, d in tum_unlu_verileri.items() if d['c'] == gender]
 
 
 
 
79
 
80
- # Hafızadaki oyuncu listede yoksa ilkini seç
81
- if st.session_state.actor_key not in available_names:
82
- st.session_state.actor_key = available_names[0]
83
 
84
- def on_sidebar_change():
85
- st.session_state.actor_key = st.session_state.side_actor
 
86
 
 
87
  st.sidebar.radio(
88
- "📋 Available Cast:",
89
- available_names,
90
- index=available_names.index(st.session_state.actor_key),
91
- key="side_actor",
92
- on_change=on_sidebar_change
 
93
  )
94
 
95
- # --- 6. ANA EKRAN ---
96
- st.title("🎬 CastMatch AI: Talent Matching System")
 
97
  st.markdown("---")
98
 
99
- col1, col2 = st.columns([1, 2])
100
 
101
- with col1:
102
- st.subheader("👤 Pick an Actor")
103
 
104
- def on_main_change():
105
- st.session_state.actor_key = st.session_state.main_actor
 
106
 
107
  selected_actor = st.selectbox(
108
- "Select from list:",
109
- available_names,
110
- index=available_names.index(st.session_state.actor_key),
111
- key="main_actor",
112
- on_change=on_main_change
113
  )
114
-
115
- # RESİM YÜKLEME
116
- res_dir = os.path.join(os.getcwd(), "40 resim")
117
- img_path = None
118
- if os.path.exists(res_dir):
119
- target = selected_actor.replace(" ", "_").lower()
120
- for f in os.listdir(res_dir):
121
- if target in f.lower() or selected_actor.lower() in f.lower():
122
- img_path = os.path.join(res_dir, f)
123
  break
124
 
125
- if img_path:
126
- st.image(img_path, caption=selected_actor, use_container_width=True)
127
  else:
128
- st.warning(f"Resim bulunamadı: {selected_actor}")
129
 
130
- with col2:
131
- st.subheader("🎯 Best Career Matches")
132
- if st.button("🚀 Match and Recommend"):
 
 
133
  if movie_dict:
134
- v = tum_unlu_verileri[selected_actor]['v']
135
- res = []
136
  for i in movie_dict:
137
- d = spatial.distance.cosine(v, movie_dict[i][1][:6]) + random.uniform(0, 0.0001)
138
- res.append((movie_dict[i][0], d))
 
139
 
140
- for i, (film, sc) in enumerate(sorted(res, key=lambda x: x[1])[:5], 1):
141
- pct = round((1 - sc) * 100, 1)
142
- st.success(f"**{i}. {film}** (%{pct})")
 
 
143
  st.progress(pct / 100)
 
 
144
 
145
  st.markdown("---")
146
- st.info("💡 **How it works?**: This AI analyzes career vectors based on available local assets.")
 
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
+ # --- RESİM KLASÖRÜ ---
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
+ # SENKRONİZASYON İÇİN STATE
67
+ if "secili_oyuncu" not in st.session_state:
68
+ st.session_state.secili_oyuncu = "Sylvester Stallone"
69
 
70
+ # --- SOL PANEL (SIDEBAR) ---
71
+ st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
72
  st.sidebar.markdown("---")
73
 
74
+ gender_choice = st.sidebar.radio(
75
+ "1. Select Category / Kategori Seçin:",
76
  ["Male / Erkek", "Female / Kadın"],
77
+ key="gender_radio"
78
  )
79
 
80
+ # Kategoriye göre isimleri filtrele (Resim kontrolü yapmadan tüm listeyi getiriyoruz)
81
+ filtered_names = [name for name, data in tum_unlu_verileri.items() if data['c'] == gender_choice]
82
+
83
+ # Kategori değişirse listedeki ilk ismi seç
84
+ if st.session_state.secili_oyuncu not in filtered_names:
85
+ st.session_state.secili_oyuncu = filtered_names[0]
86
 
87
+ st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
 
 
88
 
89
+ # Sidebar Callback
90
+ def sidebar_degisti():
91
+ st.session_state.secili_oyuncu = st.session_state.sb_radio
92
 
93
+ # Sol paneldeki tıklanabilir liste
94
  st.sidebar.radio(
95
+ "Quick Select / Hızlı Seçim:",
96
+ filtered_names,
97
+ index=filtered_names.index(st.session_state.secili_oyuncu),
98
+ key="sb_radio",
99
+ on_change=sidebar_degisti,
100
+ label_visibility="collapsed"
101
  )
102
 
103
+ # --- ANA EKRAN ---
104
+ st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
105
+ st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
106
  st.markdown("---")
107
 
108
+ col_actor, col_match = st.columns([1, 2])
109
 
110
+ with col_actor:
111
+ st.subheader("👤 Pick an Actor / Oyuncu Seç")
112
 
113
+ # Ana Selectbox Callback
114
+ def selectbox_degisti():
115
+ st.session_state.secili_oyuncu = st.session_state.main_sb
116
 
117
  selected_actor = st.selectbox(
118
+ "Select from list / Listeden seçin:",
119
+ filtered_names,
120
+ index=filtered_names.index(st.session_state.secili_oyuncu),
121
+ key="main_sb",
122
+ on_change=selectbox_degisti
123
  )
124
+
125
+ # Resim Bulma Mantığı (Daha esnek)
126
+ found_path = None
127
+ if os.path.exists(resim_klasoru):
128
+ search_target = selected_actor.replace(" ", "_").lower()
129
+ search_target_alt = selected_actor.lower()
130
+ for f in os.listdir(resim_klasoru):
131
+ if f.lower().startswith(search_target) or search_target_alt in f.lower():
132
+ found_path = os.path.join(resim_klasoru, f)
133
  break
134
 
135
+ if found_path:
136
+ st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
137
  else:
138
+ st.warning(f"Resim bulunamadı / Image not found: {selected_actor}")
139
 
140
+ with col_match:
141
+ st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
142
+ st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
143
+
144
+ if st.button("🚀 Match and Recommend / Eşleştir ve Öner"):
145
  if movie_dict:
146
+ actor_v = tum_unlu_verileri[selected_actor]['v']
147
+ results = []
148
  for i in movie_dict:
149
+ noise = random.uniform(0, 0.0001)
150
+ dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
151
+ results.append((movie_dict[i][0], dist))
152
 
153
+ top_matches = sorted(results, key=lambda x: x[1])[:5]
154
+ for i, (film, score) in enumerate(top_matches, 1):
155
+ pct = round((1 - score) * 100, 1)
156
+ st.success(f"**{i}. {film}**")
157
+ st.write(f"Match Score / Uyum Skoru: **%{pct}**")
158
  st.progress(pct / 100)
159
+ else:
160
+ st.error("Model dosyası eksik! / Model file missing!")
161
 
162
  st.markdown("---")
163
+ 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.")