ESMATUGBA commited on
Commit
e457956
·
verified ·
1 Parent(s): 727ac17

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -129
app.py CHANGED
@@ -1,10 +1,11 @@
1
  import streamlit as st
2
  import pickle
3
- 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,139 +17,93 @@ 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]},
24
- "Johnny Depp": {"c": "Male / Erkek", "v": [0.1, 0.9, 0.8, 0.4, 0.1, 0.1]},
25
- "Jason Statham": {"c": "Male / Erkek", "v": [0.95, 0.3, 0.1, 0.1, 0.1, 0.7]},
26
- "Keanu Reeves": {"c": "Male / Erkek", "v": [0.9, 0.4, 0.1, 0.2, 0.9, 0.6]},
27
- "Brad Pitt": {"c": "Male / Erkek", "v": [0.7, 0.5, 0.3, 0.8, 0.2, 0.4]},
28
- "Tom Cruise": {"c": "Male / Erkek", "v": [0.9, 0.8, 0.2, 0.1, 0.4, 0.5]},
29
- "Anthony Hopkins": {"c": "Male / Erkek", "v": [0.1, 0.1, 0.1, 0.95, 0.1, 0.9]},
30
- "Arnold Schwarzenegger": {"c": "Male / Erkek", "v": [0.95, 0.6, 0.2, 0.1, 0.8, 0.1]},
31
- "Bruce Willis": {"c": "Male / Erkek", "v": [0.9, 0.2, 0.1, 0.3, 0.4, 0.7]},
32
- "Christian Bale": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
33
- "Tom Hanks": {"c": "Male / Erkek", "v": [0.2, 0.6, 0.5, 0.9, 0.1, 0.1]},
34
- "Morgan Freeman": {"c": "Male / Erkek", "v": [0.1, 0.3, 0.1, 0.9, 0.1, 0.6]},
35
- "Al Pacino": {"c": "Male / Erkek", "v": [0.2, 0.1, 0.1, 0.95, 0.1, 0.8]},
36
- "Cillian Murphy": {"c": "Male / Erkek", "v": [0.4, 0.1, 0.1, 0.9, 0.4, 0.8]},
37
- "Jackie Chan": {"c": "Male / Erkek", "v": [0.9, 0.7, 0.9, 0.1, 0.1, 0.1]},
38
- "Denzel Washington": {"c": "Male / Erkek", "v": [0.8, 0.2, 0.1, 0.9, 0.1, 0.7]},
39
- "George Clooney": {"c": "Male / Erkek", "v": [0.3, 0.4, 0.5, 0.8, 0.1, 0.6]},
40
- "Jake Gyllenhaal": {"c": "Male / Erkek", "v": [0.6, 0.1, 0.1, 0.9, 0.2, 0.8]},
41
- "Pierce Brosnan": {"c": "Male / Erkek", "v": [0.8, 0.7, 0.3, 0.4, 0.1, 0.6]},
42
- "Angelina Jolie": {"c": "Female / Kadın", "v": [0.9, 0.7, 0.1, 0.8, 0.1, 0.6]},
43
- "Natalie Portman": {"c": "Female / Kadın", "v": [0.3, 0.2, 0.1, 0.9, 0.6, 0.7]},
44
- "Scarlett Johansson": {"c": "Female / Kadın", "v": [0.9, 0.6, 0.2, 0.7, 0.8, 0.5]},
45
- "Charlize Theron": {"c": "Female / Kadın", "v": [0.8, 0.3, 0.1, 0.9, 0.2, 0.7]},
46
- "Milla Jovovich": {"c": "Female / Kadın", "v": [0.9, 0.4, 0.1, 0.1, 0.9, 0.3]},
47
- "Sandra Bullock": {"c": "Female / Kadın", "v": [0.2, 0.1, 0.9, 0.8, 0.1, 0.6]},
48
- "Nicole Kidman": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.1, 0.95, 0.1, 0.7]},
49
- "Jennifer Lawrence": {"c": "Female / Kadın", "v": [0.7, 0.8, 0.3, 0.9, 0.4, 0.2]},
50
- "Meryl Streep": {"c": "Female / Kadın", "v": [0.1, 0.1, 0.4, 0.95, 0.1, 0.1]},
51
- "Salma Hayek": {"c": "Female / Kadın", "v": [0.6, 0.3, 0.5, 0.8, 0.1, 0.1]},
52
- "Anne Hathaway": {"c": "Female / Kadın", "v": [0.2, 0.7, 0.8, 0.8, 0.1, 0.1]},
53
- "Keira Knightley": {"c": "Female / Kadın", "v": [0.1, 0.8, 0.1, 0.95, 0.1, 0.1]},
54
- "Julia Roberts": {"c": "Female / Kadın", "v": [0.1, 0.2, 0.9, 0.9, 0.1, 0.1]},
55
- "Penelope Cruz": {"c": "Female / Kadın", "v": [0.2, 0.3, 0.6, 0.9, 0.1, 0.6]},
56
- "Monica Bellucci": {"c": "Female / Kadın", "v": [0.6, 0.1, 0.1, 0.8, 0.5, 0.3]},
57
- "Emily Blunt": {"c": "Female / Kadın", "v": [0.7, 0.6, 0.1, 0.8, 0.5, 0.6]},
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
-
82
- gender_choice = st.sidebar.radio(
83
- "1. Select Category / Kategori Seçin:",
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.")
 
 
 
1
  import streamlit as st
2
  import pickle
3
+ from scipy.spatial.distance import cosine
 
4
  import os
5
 
6
+ # -------------------------------
7
+ # 1. MODELİ YÜKLE
8
+ # -------------------------------
9
  @st.cache_resource
10
  def load_data():
11
  try:
 
17
  model_data = load_data()
18
  movie_dict = model_data['movie_dict'] if model_data else {}
19
 
20
+ # -------------------------------
21
+ # 2. AKTÖR DNA VERİLERİ
22
+ # -------------------------------
23
+ actors = {
24
+ "Sylvester Stallone": {"gender": "Male", "vec": [0.9,0.2,0.1,0.1,0.1,0.8]},
25
+ "Robert De Niro": {"gender": "Male", "vec": [0.2,0.1,0.1,0.9,0.1,0.8]},
26
+ "Johnny Depp": {"gender": "Male", "vec": [0.1,0.9,0.8,0.4,0.1,0.1]},
27
+ "Jason Statham": {"gender": "Male", "vec": [0.95,0.3,0.1,0.1,0.1,0.7]},
28
+ "Keanu Reeves": {"gender": "Male", "vec": [0.9,0.4,0.1,0.2,0.9,0.6]},
29
+ "Angelina Jolie": {"gender": "Female", "vec": [0.9,0.7,0.1,0.8,0.1,0.6]},
30
+ "Scarlett Johansson": {"gender": "Female", "vec": [0.9,0.6,0.2,0.7,0.8,0.5]},
31
+ "Meryl Streep": {"gender": "Female", "vec": [0.1,0.1,0.4,0.95,0.1,0.1]},
32
+ "Jennifer Lawrence": {"gender": "Female", "vec": [0.7,0.8,0.3,0.9,0.4,0.2]}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  }
34
 
35
+ # -------------------------------
36
+ # 3. RESİM KLASÖRÜ
37
+ # -------------------------------
38
+ image_folder = "40 resim"
39
 
40
+ def get_actor_image(name):
41
+ if not os.path.exists(image_folder):
 
42
  return None
43
+ for f in os.listdir(image_folder):
44
+ if name.lower().replace(" ", "_") in f.lower():
45
+ return os.path.join(image_folder, f)
 
 
 
 
 
46
  return None
47
 
48
+ # -------------------------------
49
+ # 4. STREAMLIT UI
50
+ # -------------------------------
51
+ st.set_page_config(page_title="CastMatch AI", layout="wide")
52
+
53
+ st.title("🎬 CastMatch AI")
54
+ st.markdown("### Actor Movie Matching System")
55
+ st.markdown("Oyuncuya en uygun filmi bulur / Finds best movie for actor")
56
+
57
+ # Sidebar
58
+ gender = st.sidebar.radio("Select Gender / Cinsiyet", ["Male", "Female"])
59
+
60
+ filtered = [a for a in actors if actors[a]["gender"] == gender]
61
+
62
+ actor_name = st.selectbox("Choose Actor / Oyuncu Seç", filtered)
63
+
64
+ col1, col2 = st.columns(2)
65
+
66
+ # -------------------------------
67
+ # 5. AKTÖR GÖSTER
68
+ # -------------------------------
69
+ with col1:
70
+ st.subheader("Actor / Oyuncu")
71
+
72
+ img_path = get_actor_image(actor_name)
73
+ if img_path:
74
+ st.image(img_path, use_container_width=True)
 
 
 
 
 
 
 
 
75
  else:
76
+ st.warning("Image not found")
77
+
78
+ # -------------------------------
79
+ # 6. ÖNERİ SİSTEMİ
80
+ # -------------------------------
81
+ with col2:
82
+ st.subheader("Best Matches / En İyi Eşleşmeler")
83
+
84
+ if st.button("Recommend / Öner"):
85
+ if not movie_dict:
86
+ st.error("Model bulunamadı!")
87
+ else:
88
+ actor_vec = actors[actor_name]["vec"]
89
+
90
  results = []
91
+
92
  for i in movie_dict:
93
+ movie_vec = movie_dict[i][1][:6]
94
+
95
+ # COSINE DISTANCE (DAHA STABİL)
96
+ dist = cosine(actor_vec, movie_vec)
97
+
98
+ # SCORE (0-100)
99
+ score = (1 - dist) * 100
100
+
101
+ results.append((movie_dict[i][0], score))
102
+
103
+ # EN İYİ 5
104
+ results = sorted(results, key=lambda x: x[1], reverse=True)[:5]
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
+ for i, (movie, score) in enumerate(results, 1):
107
+ st.write(f"### {i}. {movie}")
108
+ st.write(f"Score: %{round(score,2)}")
109
+ st.progress(score / 100)