ESMATUGBA commited on
Commit
5495dcc
·
verified ·
1 Parent(s): 46fc0ee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -93
app.py CHANGED
@@ -4,30 +4,25 @@ from scipy import spatial
4
  import random
5
  import os
6
 
7
- # --- TİTREMEYİ ÖNLEYİCİ CSS ---
8
  st.set_page_config(page_title="CastMatch AI", layout="wide")
9
  st.markdown("""
10
  <style>
11
- [data-testid="stImage"] img {
12
- max-height: 400px;
13
- object-fit: contain;
14
- }
15
  </style>
16
  """, unsafe_allow_html=True)
17
 
18
- # 1. MODELİ YÜKLE
19
  @st.cache_resource
20
  def load_data():
21
  try:
22
  with open('movie_model.pkl', 'rb') as f:
23
  return pickle.load(f)
24
- except:
25
- return None
26
 
27
  model_data = load_data()
28
  movie_dict = model_data['movie_dict'] if model_data else {}
29
 
30
- # 2. OYUNCU VERİTABANI
31
  tum_unlu_verileri = {
32
  "Sylvester Stallone": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.1, 0.1, 0.8]},
33
  "Robert De Niro": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.9, 0.1, 0.8]},
@@ -36,127 +31,82 @@ tum_unlu_verileri = {
36
  "Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
37
  "Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
38
  "Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
39
- "Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]},
40
- "Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]},
41
- "Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]},
42
- "Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
43
- "Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]},
44
- "Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]},
45
- "Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]},
46
- "Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 0.8]},
47
- "Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]},
48
- "Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
49
- "George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]},
50
- "Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]},
51
- "Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
52
  "Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
53
  "Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
54
- "Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]},
55
- "Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]},
56
- "Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]},
57
- "Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]},
58
- "Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]},
59
- "Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]},
60
- "Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
61
- "Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]},
62
- "Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
63
- "Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 0.1, 0.1]},
64
- "Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]},
65
- "Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]},
66
- "Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]},
67
- "Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]},
68
- "Cameron Diaz": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.95, 0.7, 0.1, 0.1]}
69
  }
70
 
71
- # --- RESİM KONTROLÜ ---
72
  resim_klasoru = os.getcwd()
 
 
 
73
 
74
- @st.cache_data
75
- def get_available_actors():
76
- dosyalar = [f.lower() for f in os.listdir(resim_klasoru)]
77
- mevcut = [isim for isim, veri in tum_unlu_verileri.items()
78
- if any(isim.lower().replace(" ", "_") in d or isim.lower() in d for d in dosyalar)]
79
- return mevcut
80
 
81
- mevcut_isimler = get_available_actors()
 
 
82
 
83
- # --- HAFIZA (SESSION STATE) ---
84
- if 'selected_actor' not in st.session_state:
85
- st.session_state.selected_actor = mevcut_isimler[0] if mevcut_isimler else None
86
 
87
- # --- CALLBACKS (Değişim Fonksiyonları) ---
88
- def update_from_sidebar():
89
- st.session_state.selected_actor = st.session_state.sidebar_choice
90
-
91
- def update_from_main():
92
- st.session_state.selected_actor = st.session_state.main_choice
93
-
94
- # --- SOL PANEL (SIDEBAR) ---
95
  st.sidebar.title("🔍 Control Panel")
96
  gender_choice = st.sidebar.radio("Category / Kategori:", ["Male / Erkek", "Female / Kadın"])
97
-
98
- # Seçilen kategoriye göre isimleri filtrele
99
  filtered_names = [n for n in mevcut_isimler if tum_unlu_verileri[n]['c'] == gender_choice]
100
 
101
- # Eğer hafızadaki oyuncu bu kategoride yoksa kategorinin ilk ismine geç
102
- if st.session_state.selected_actor not in filtered_names and filtered_names:
103
- st.session_state.selected_actor = filtered_names[0]
104
 
105
- # SIDEBAR SEÇİM ALANI
106
  st.sidebar.markdown("---")
 
107
  st.sidebar.radio(
108
- "📋 Available Cast / Mevcut Oyuncular:",
109
  filtered_names,
110
- index=filtered_names.index(st.session_state.selected_actor) if st.session_state.selected_actor in filtered_names else 0,
111
  key="sidebar_choice",
112
- on_change=update_from_sidebar
113
  )
114
 
115
  # --- ANA EKRAN ---
116
- st.title("🎬 CastMatch AI: Talent Matching System")
117
- st.markdown("---")
118
 
119
  col_actor, col_match = st.columns([1, 2])
120
 
121
  with col_actor:
122
- st.subheader("👤 Pick an Actor / Oyuncu Seç")
123
 
124
- # ANA EKRAN SEÇİM KUTUSU
125
- final_actor = st.selectbox(
 
126
  "Select from list / Listeden seçin:",
127
  filtered_names,
128
- index=filtered_names.index(st.session_state.selected_actor) if st.session_state.selected_actor in filtered_names else 0,
129
  key="main_choice",
130
- on_change=update_from_main
131
  )
132
 
133
- # RESİM GÖSTERME
134
- if final_actor:
135
  found_path = None
136
- target = final_actor.replace(" ", "_").lower()
137
  for f in os.listdir(resim_klasoru):
138
- if target in f.lower() or final_actor.lower() in f.lower():
139
  found_path = os.path.join(resim_klasoru, f)
140
  break
141
 
142
  if found_path:
143
- st.image(found_path, caption=f"Profile: {final_actor}", use_container_width=True)
144
 
145
  with col_match:
146
- st.subheader("🎯 Career Matches")
147
- if final_actor:
148
  if st.button("🚀 Match and Recommend"):
149
- if movie_dict:
150
- v = tum_unlu_verileri[final_actor]['v']
151
- results = []
152
- for i in movie_dict:
153
- dist = spatial.distance.cosine(v, movie_dict[i][1][:6]) + random.uniform(0, 0.0001)
154
- results.append((movie_dict[i][0], dist))
155
-
156
- for i, (film, score) in enumerate(sorted(results, key=lambda x: x[1])[:5], 1):
157
- pct = round((1 - score) * 100, 1)
158
- st.success(f"**{i}. {film}** (%{pct})")
159
- st.progress(pct / 100)
160
-
161
- st.markdown("---")
162
- st.info("💡 Sol taraftan veya listeden seçim yaparak anında güncelleyebilirsiniz.")
 
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>
11
+ [data-testid="stImage"] img { max-height: 400px; object-fit: contain; }
 
 
 
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
  "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 ---
75
+ st.title("🎬 CastMatch AI")
 
76
 
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.")