ESMATUGBA commited on
Commit
c4eec1b
·
verified ·
1 Parent(s): ed4b7e6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -47
app.py CHANGED
@@ -16,8 +16,8 @@ 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
- # Sıralama Stallone ile başlar
21
  tum_unlu_verileri = {
22
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
23
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -58,24 +58,28 @@ tum_unlu_verileri = {
58
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
59
  }
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  # --- ARAYÜZ AYARLARI ---
62
  st.set_page_config(page_title="CastMatch AI", layout="wide")
63
 
64
- @st.cache_data
65
- def get_image_path(actor_name):
66
- if not actor_name or actor_name == "Choose... / Seçiniz...":
67
- return None
68
- ana_dizin = os.getcwd()
69
- search_term = actor_name.lower().replace(" ", "_")
70
- search_term_plain = actor_name.lower()
71
- for f in os.listdir(ana_dizin):
72
- f_lower = f.lower()
73
- if f_lower.endswith(('.jpg', '.png', '.jpeg')):
74
- if search_term in f_lower or search_term_plain in f_lower:
75
- return os.path.join(ana_dizin, f)
76
- return None
77
-
78
- # --- SOL PANEL (BİLGİLER BURADA) ---
79
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
80
  st.sidebar.markdown("---")
81
 
@@ -84,71 +88,79 @@ gender_choice = st.sidebar.radio(
84
  ["Male / Erkek", "Female / Kadın"]
85
  )
86
 
87
- # Oyuncu listesi (Alfabetik değil, Stallone başa gelecek şekilde filtreleme)
88
- filtered_names = [name for name in tum_unlu_verileri.keys() if tum_unlu_verileri[name]['c'] == gender_choice]
89
 
90
  st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
 
 
91
  for n in filtered_names:
92
  st.sidebar.write(f"• {n}")
93
 
94
  # --- ANA EKRAN ---
95
- st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
96
- st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
97
  st.markdown("---")
98
 
99
  col_actor, col_match = st.columns([1, 2])
100
 
101
  with col_actor:
102
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
103
- options = ["Choose... / Seçiniz..."] + filtered_names
104
- selected_actor = st.selectbox("Select from list / Listeden seçin:", options)
 
 
 
 
105
 
106
- # Brad Pitt ve diğerlerinde titremeyi önlemek için alanı ayırıyoruz
107
  if selected_actor != "Choose... / Seçiniz...":
108
- path = get_image_path(selected_actor)
109
- if path:
110
- st.image(path, caption=f"Profile: {selected_actor}", use_container_width=True)
 
 
 
 
 
 
 
 
111
  else:
112
- st.warning(f"⚠️ Resim bulunamadı: {selected_actor}")
113
  else:
114
- st.info("Please select an actor to see the profile. / Profili görmek için bir oyuncu seçin.")
115
 
116
  with col_match:
117
- st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
118
- st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
119
 
120
- if st.button("🚀 Match and Recommend / Eşleştir ve Öner"):
121
- if selected_actor == "Choose... / Seçiniz...":
122
- st.warning("Please pick an actor first! / Lütfen önce bir oyuncu seçin!")
123
- elif movie_dict:
124
- actor_v = tum_unlu_verileri[selected_actor]['v']
125
  results = []
126
-
127
  for i in movie_dict:
128
- # Orijinal vektör analizi
129
  dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6])
130
 
131
- # 11.5 skoru hatasını engellemek için mesafeyi 0-1 arasına hapsediyoruz
132
  dist = max(0, min(1, dist))
133
 
134
- # Sıralama kararlılığı için minik bir gürültü
135
  noise = random.uniform(0, 0.00001)
136
  results.append((movie_dict[i][0], dist + noise))
137
 
138
- # En iyi 5 eşleşmeyi (en küçük mesafe) al
139
  top_matches = sorted(results, key=lambda x: x[1])[:5]
140
 
141
  for i, (film, score) in enumerate(top_matches, 1):
142
- # Skoru % cinsinden hesapla: (1 - mesafe) * 100
143
- pct = (1 - score) * 100
144
- # %0-%100 arası kalmasını garanti et
145
- pct = max(0, min(100, pct))
146
 
147
  st.success(f"**{i}. {film}**")
148
- st.write(f"Match Score / Uyum Skoru: **%{pct:.1f}**")
149
  st.progress(pct / 100)
150
  else:
151
  st.error("Model dosyası eksik!")
152
 
153
  st.markdown("---")
154
- st.info("💡 **How it works? / Nasıl çalışır?**: This AI analyzes career vectors based on available local assets. / Bu yapay zeka kariyer vektörlerini analiz eder.")
 
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
+ # Sıralamayı korumak için Stallone'u en başta tutuyoruz
21
  tum_unlu_verileri = {
22
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
23
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
58
  "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
59
  }
60
 
61
+ # --- DİNAMİK FİLTRELEME ---
62
+ resim_klasoru = os.path.join(os.getcwd(), "40 resim")
63
+
64
+ @st.cache_data
65
+ def klasordeki_unluleri_getir():
66
+ mevcut_unlular = {}
67
+ if os.path.exists(resim_klasoru):
68
+ dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
69
+ # Sözlük sırasını bozmamak için tum_unlu_verileri üzerinden dönüyoruz
70
+ for isim, veri in tum_unlu_verileri.items():
71
+ search_pattern1 = isim.lower().replace(" ", "_")
72
+ search_pattern2 = isim.lower()
73
+ if any(search_pattern1 in d or search_pattern2 in d for d in dosyalar):
74
+ mevcut_unlular[isim] = veri
75
+ return mevcut_unlular
76
+
77
+ unlu_verileri = klasordeki_unluleri_getir()
78
+
79
  # --- ARAYÜZ AYARLARI ---
80
  st.set_page_config(page_title="CastMatch AI", layout="wide")
81
 
82
+ # --- SOL PANEL ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
84
  st.sidebar.markdown("---")
85
 
 
88
  ["Male / Erkek", "Female / Kadın"]
89
  )
90
 
91
+ # Liste sırasını (Stallone 1. sırada) koruyarak filtrele
92
+ filtered_names = [name for name in unlu_verileri.keys() if unlu_verileri[name]['c'] == gender_choice]
93
 
94
  st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
95
+ if not filtered_names:
96
+ st.sidebar.warning("Bu kategoride resim bulunamadı.")
97
  for n in filtered_names:
98
  st.sidebar.write(f"• {n}")
99
 
100
  # --- ANA EKRAN ---
101
+ st.title("🎬 CastMatch AI: Talent Matching System")
102
+ st.markdown("#### Discover the perfect roles for global stars!")
103
  st.markdown("---")
104
 
105
  col_actor, col_match = st.columns([1, 2])
106
 
107
  with col_actor:
108
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
109
+ # "Choose" seçeneğini ekleyerek yanlışlıkla ilk kişiyi seçip titreme yapmasını engelliyoruz
110
+ select_options = ["Choose... / Seçiniz..."] + filtered_names
111
+ selected_actor = st.selectbox("Select from list / Listeden seçin:", select_options)
112
+
113
+ # Resim Alanı (Titremeyi önlemek için container kullanıldı)
114
+ image_placeholder = st.empty()
115
 
 
116
  if selected_actor != "Choose... / Seçiniz...":
117
+ found_path = None
118
+ search_target = selected_actor.replace(" ", "_").lower()
119
+
120
+ if os.path.exists(resim_klasoru):
121
+ for f in os.listdir(resim_klasoru):
122
+ if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
123
+ found_path = os.path.join(resim_klasoru, f)
124
+ break
125
+
126
+ if found_path:
127
+ image_placeholder.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
128
  else:
129
+ image_placeholder.error("Resim yüklenemedi.")
130
  else:
131
+ image_placeholder.info("Lütfen bir oyuncu seçin.")
132
 
133
  with col_match:
134
+ st.subheader("🎯 Best Career Matches")
135
+ st.write("Comparing vectors... / Karşılaştırılıyor...")
136
 
137
+ if st.button("🚀 Match and Recommend") and selected_actor != "Choose... / Seçiniz...":
138
+ if movie_dict:
139
+ actor_v = unlu_verileri[selected_actor]['v']
 
 
140
  results = []
 
141
  for i in movie_dict:
142
+ # 11.5 gibi hatalı skorları engellemek için cosine distance hesaplama
143
  dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6])
144
 
145
+ # Mesafeyi 0-1 arasına sabitle (Hata önleyici)
146
  dist = max(0, min(1, dist))
147
 
 
148
  noise = random.uniform(0, 0.00001)
149
  results.append((movie_dict[i][0], dist + noise))
150
 
151
+ # Küçük mesafe = yüksek uyum
152
  top_matches = sorted(results, key=lambda x: x[1])[:5]
153
 
154
  for i, (film, score) in enumerate(top_matches, 1):
155
+ # Doğru Yüzde Hesabı
156
+ pct = round((1 - score) * 100, 1)
157
+ pct = max(0, min(100, pct)) # %100'ü geçmesin
 
158
 
159
  st.success(f"**{i}. {film}**")
160
+ st.write(f"Match Score: **%{pct}**")
161
  st.progress(pct / 100)
162
  else:
163
  st.error("Model dosyası eksik!")
164
 
165
  st.markdown("---")
166
+ 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.")