ESMATUGBA commited on
Commit
74cb2e5
·
verified ·
1 Parent(s): 5495dcc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -43
app.py CHANGED
@@ -4,7 +4,7 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # --- TASARIM ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
9
  st.markdown("""
10
  <style>
@@ -12,17 +12,19 @@ st.markdown("""
12
  </style>
13
  """, unsafe_allow_html=True)
14
 
15
- # 1. MODEL VE VERİ
16
  @st.cache_resource
17
  def load_data():
18
  try:
19
  with open('movie_model.pkl', 'rb') as f:
20
  return pickle.load(f)
21
- except: return None
 
22
 
23
  model_data = load_data()
24
  movie_dict = model_data['movie_dict'] if model_data else {}
25
 
 
26
  tum_unlu_verileri = {
27
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
28
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -31,44 +33,65 @@ tum_unlu_verileri = {
31
  "Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
32
  "Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
33
  "Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  "Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
35
  "Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
36
- "Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  }
38
 
 
39
  resim_klasoru = os.getcwd()
40
  mevcut_isimler = [isim for isim in tum_unlu_verileri.keys()
41
  if any(isim.lower().replace(" ", "_") in f.lower() or isim.lower() in f.lower()
42
  for f in os.listdir(resim_klasoru))]
43
 
44
- # --- HAFIZA SİSTEMİ (KRİTİK NOKTA) ---
45
- if 'active_actor' not in st.session_state:
46
- st.session_state.active_actor = None
47
 
48
- # --- YARDIMCI FONKSİYONLAR ---
49
- def sync_from_sidebar():
50
- st.session_state.active_actor = st.session_state.sidebar_choice
51
-
52
- def sync_from_main():
53
- st.session_state.active_actor = st.session_state.main_choice
54
-
55
- # --- SIDEBAR ---
56
  st.sidebar.title("🔍 Control Panel")
57
  gender_choice = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"])
58
  filtered_names = [n for n in mevcut_isimler if tum_unlu_verileri[n]['c'] == gender_choice]
59
 
60
- # Kategori değişirse ilk ismi seç
61
- if st.session_state.active_actor not in filtered_names and filtered_names:
62
- st.session_state.active_actor = filtered_names[0]
63
-
64
  st.sidebar.markdown("---")
65
- # SOL PANEL RADIO
 
 
 
 
66
  st.sidebar.radio(
67
- "📋 Available Cast:",
68
  filtered_names,
69
- index=filtered_names.index(st.session_state.active_actor) if st.session_state.active_actor in filtered_names else 0,
70
- key="sidebar_choice",
71
- on_change=sync_from_sidebar # Buraya basınca orta kutuyu tetikler
72
  )
73
 
74
  # --- ANA EKRAN ---
@@ -77,36 +100,47 @@ st.title("🎬 CastMatch AI")
77
  col_actor, col_match = st.columns([1, 2])
78
 
79
  with col_actor:
80
- st.subheader("👤 Selected Actor")
81
 
82
- # ORTA SEÇİM KUTUSU
83
- # Bu kutu st.session_state.active_actor'u dinler
84
- selected_actor = st.selectbox(
 
 
 
85
  "Select from list / Listeden seçin:",
86
  filtered_names,
87
- index=filtered_names.index(st.session_state.active_actor) if st.session_state.active_actor in filtered_names else 0,
88
- key="main_choice",
89
- on_change=sync_from_main # Buradan seçince solu tetikler
90
  )
91
 
92
- # RESİM GÖSTERİMİ
93
- if selected_actor:
94
  found_path = None
95
- target = selected_actor.replace(" ", "_").lower()
96
  for f in os.listdir(resim_klasoru):
97
- if target in f.lower() or selected_actor.lower() in f.lower():
98
  found_path = os.path.join(resim_klasoru, f)
99
  break
100
 
101
  if found_path:
102
- st.image(found_path, caption=selected_actor, use_container_width=True)
103
 
104
  with col_match:
105
- st.subheader("🎯 Matches")
106
- if selected_actor:
107
  if st.button("🚀 Match and Recommend"):
108
- v = tum_unlu_verileri[selected_actor]['v']
109
- # ... Analiz kodları ...
110
- st.success(f"Best matches for {selected_actor} analyzed!")
111
-
112
- st.info("💡 Sol tarafa tıkladığınızda orta kutu otomatik güncellenir.")
 
 
 
 
 
 
 
 
 
4
  import random
5
  import os
6
 
7
+ # --- SAYFA AYARLARI ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
9
  st.markdown("""
10
  <style>
 
12
  </style>
13
  """, unsafe_allow_html=True)
14
 
15
+ # 1. MODELİ YÜKLE
16
  @st.cache_resource
17
  def load_data():
18
  try:
19
  with open('movie_model.pkl', 'rb') as f:
20
  return pickle.load(f)
21
+ except:
22
+ return None
23
 
24
  model_data = load_data()
25
  movie_dict = model_data['movie_dict'] if model_data else {}
26
 
27
+ # 2. TÜM OYUNCU VERİTABANI (Eksiksiz Liste)
28
  tum_unlu_verileri = {
29
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
30
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
 
33
  "Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
34
  "Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
35
  "Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
36
+ "Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]},
37
+ "Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]},
38
+ "Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]},
39
+ "Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
40
+ "Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]},
41
+ "Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]},
42
+ "Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]},
43
+ "Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 0.8]},
44
+ "Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]},
45
+ "Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
46
+ "George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]},
47
+ "Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]},
48
+ "Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
49
  "Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
50
  "Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
51
+ "Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]},
52
+ "Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]},
53
+ "Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]},
54
+ "Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]},
55
+ "Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]},
56
+ "Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]},
57
+ "Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
58
+ "Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]},
59
+ "Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
60
+ "Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 0.1, 0.1]},
61
+ "Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]},
62
+ "Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]},
63
+ "Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]},
64
+ "Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]},
65
+ "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
66
  }
67
 
68
+ # --- RESİM KONTROLÜ ---
69
  resim_klasoru = os.getcwd()
70
  mevcut_isimler = [isim for isim in tum_unlu_verileri.keys()
71
  if any(isim.lower().replace(" ", "_") in f.lower() or isim.lower() in f.lower()
72
  for f in os.listdir(resim_klasoru))]
73
 
74
+ # --- SESSION STATE ---
75
+ if 'selected_actor' not in st.session_state:
76
+ st.session_state.selected_actor = mevcut_isimler[0] if mevcut_isimler else None
77
 
78
+ # --- SIDEBAR (SOL PANEL) ---
 
 
 
 
 
 
 
79
  st.sidebar.title("🔍 Control Panel")
80
  gender_choice = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"])
81
  filtered_names = [n for n in mevcut_isimler if tum_unlu_verileri[n]['c'] == gender_choice]
82
 
 
 
 
 
83
  st.sidebar.markdown("---")
84
+ # Sol tarafta bir isme basıldığında çalışacak fonksiyon
85
+ def on_sidebar_click():
86
+ st.session_state.selected_actor = st.session_state.sidebar_sync
87
+
88
+ # Sol taraftaki tıklanabilir liste
89
  st.sidebar.radio(
90
+ "📋 Available Cast / Mevcut Oyuncular:",
91
  filtered_names,
92
+ index=filtered_names.index(st.session_state.selected_actor) if st.session_state.selected_actor in filtered_names else 0,
93
+ key="sidebar_sync",
94
+ on_change=on_sidebar_click
95
  )
96
 
97
  # --- ANA EKRAN ---
 
100
  col_actor, col_match = st.columns([1, 2])
101
 
102
  with col_actor:
103
+ st.subheader("👤 Pick an Actor")
104
 
105
+ # Orta kısımdaki seçim kutusu fonksiyonu
106
+ def on_main_click():
107
+ st.session_state.selected_actor = st.session_state.main_sync
108
+
109
+ # SELECTBOX: Sol panel ile tamamen aynı session_state'e bağlı
110
+ final_actor = st.selectbox(
111
  "Select from list / Listeden seçin:",
112
  filtered_names,
113
+ index=filtered_names.index(st.session_state.selected_actor) if st.session_state.selected_actor in filtered_names else 0,
114
+ key="main_sync",
115
+ on_change=on_main_click
116
  )
117
 
118
+ # RESİM GÖSTERME
119
+ if final_actor:
120
  found_path = None
121
+ target = final_actor.replace(" ", "_").lower()
122
  for f in os.listdir(resim_klasoru):
123
+ if target in f.lower() or final_actor.lower() in f.lower():
124
  found_path = os.path.join(resim_klasoru, f)
125
  break
126
 
127
  if found_path:
128
+ st.image(found_path, caption=final_actor, use_container_width=True)
129
 
130
  with col_match:
131
+ st.subheader("🎯 Career Matches")
132
+ if final_actor:
133
  if st.button("🚀 Match and Recommend"):
134
+ if movie_dict:
135
+ v = tum_unlu_verileri[final_actor]['v']
136
+ results = []
137
+ for i in movie_dict:
138
+ dist = spatial.distance.cosine(v, movie_dict[i][1][:6]) + random.uniform(0, 0.0001)
139
+ results.append((movie_dict[i][0], dist))
140
+
141
+ for i, (film, score) in enumerate(sorted(results, key=lambda x: x[1])[:5], 1):
142
+ pct = round((1 - score) * 100, 1)
143
+ st.success(f"**{i}. {film}**")
144
+ st.progress(pct / 100)
145
+
146
+ st.info("💡 Sol panel veya orta liste senkronize çalışır.")