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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +25 -47
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,8 +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
- # 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,15 +57,13 @@ 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
- # --- 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()
@@ -79,7 +76,7 @@ unlu_verileri = klasordeki_unluleri_getir()
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,79 +85,60 @@ gender_choice = st.sidebar.radio(
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.")
 
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
+ # --- DİNAMİK FİLTRELEME (KLASÖRE GÖRE) ---
61
  resim_klasoru = os.path.join(os.getcwd(), "40 resim")
62
 
 
63
  def klasordeki_unluleri_getir():
64
  mevcut_unlular = {}
65
  if os.path.exists(resim_klasoru):
66
  dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
 
67
  for isim, veri in tum_unlu_verileri.items():
68
  search_pattern1 = isim.lower().replace(" ", "_")
69
  search_pattern2 = isim.lower()
 
76
  # --- ARAYÜZ AYARLARI ---
77
  st.set_page_config(page_title="CastMatch AI", layout="wide")
78
 
79
+ # --- SOL PANEL (SIDEBAR) ---
80
  st.sidebar.title("🔍 Control Panel / Kontrol Paneli")
81
  st.sidebar.markdown("---")
82
 
 
85
  ["Male / Erkek", "Female / Kadın"]
86
  )
87
 
88
+ filtered_names = [name for name, data in unlu_verileri.items() if data['c'] == gender_choice]
 
89
 
90
  st.sidebar.markdown(f"### 📋 Available Cast / Mevcut Oyuncular")
91
  if not filtered_names:
92
+ st.sidebar.warning("Bu kategoride resim bulunamadı. / No images in this category.")
93
  for n in filtered_names:
94
  st.sidebar.write(f"• {n}")
95
 
96
  # --- ANA EKRAN ---
97
+ st.title("🎬 CastMatch AI: Talent Matching System / Yetenek Eşleştirme Sistemi")
98
+ st.markdown("#### Discover the perfect roles for global stars! / Dünya yıldızları için en ideal rolleri keşfedin!")
99
  st.markdown("---")
100
 
101
  col_actor, col_match = st.columns([1, 2])
102
 
103
  with col_actor:
104
  st.subheader("👤 Pick an Actor / Oyuncu Seç")
105
+ selected_actor = st.selectbox("Select from list / Listeden seçin:", filtered_names if filtered_names else ["Yok"])
 
 
106
 
107
+ if selected_actor != "Yok":
 
 
 
108
  found_path = None
109
  search_target = selected_actor.replace(" ", "_").lower()
110
+ for f in os.listdir(resim_klasoru):
111
+ if f.lower().startswith(search_target) or selected_actor.lower() in f.lower():
112
+ found_path = os.path.join(resim_klasoru, f)
113
+ break
 
 
114
 
115
  if found_path:
116
+ st.image(found_path, caption=f"Profile: {selected_actor}", use_container_width=True)
117
  else:
118
+ st.error("Resim yüklenemedi. / Image could not be loaded.")
 
 
119
 
120
  with col_match:
121
+ st.subheader("🎯 Best Career Matches / En İyi Kariyer Eşleşmeleri")
122
+ st.write("Comparing the star's DNA with movie roles... / Yıldızın DNA'sı film rolleriyle karşılaştırılıyor...")
123
 
124
+ if st.button("🚀 Match and Recommend / Eşleştir ve Öner") and selected_actor != "Yok":
125
  if movie_dict:
126
  actor_v = unlu_verileri[selected_actor]['v']
127
  results = []
128
  for i in movie_dict:
129
+ noise = random.uniform(0, 0.0001)
130
+ dist = spatial.distance.cosine(actor_v, movie_dict[i][1][:6]) + noise
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}**")
137
+ st.write(f"Match Score / Uyum Skoru: **%{pct}**")
138
  st.progress(pct / 100)
139
  else:
140
+ st.error("Model dosyası eksik! / Model file missing!")
141
 
142
  st.markdown("---")
143
+ # EN ALT BİLGİ NOTU DÜZELTİLDİ:
144
  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.")