ESMATUGBA commited on
Commit
92d31ec
·
verified ·
1 Parent(s): 623633c

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +154 -38
src/streamlit_app.py CHANGED
@@ -1,40 +1,156 @@
1
- import altair as alt
2
- import numpy as np
3
- import pandas as pd
4
  import streamlit as st
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- """
7
- # Welcome to Streamlit!
8
-
9
- Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:.
10
- If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
11
- forums](https://discuss.streamlit.io).
12
-
13
- In the meantime, below is an example of what you can do with just a few lines of code:
14
- """
15
-
16
- num_points = st.slider("Number of points in spiral", 1, 10000, 1100)
17
- num_turns = st.slider("Number of turns in spiral", 1, 300, 31)
18
-
19
- indices = np.linspace(0, 1, num_points)
20
- theta = 2 * np.pi * num_turns * indices
21
- radius = indices
22
-
23
- x = radius * np.cos(theta)
24
- y = radius * np.sin(theta)
25
-
26
- df = pd.DataFrame({
27
- "x": x,
28
- "y": y,
29
- "idx": indices,
30
- "rand": np.random.randn(num_points),
31
- })
32
-
33
- st.altair_chart(alt.Chart(df, height=700, width=700)
34
- .mark_point(filled=True)
35
- .encode(
36
- x=alt.X("x", axis=None),
37
- y=alt.Y("y", axis=None),
38
- color=alt.Color("idx", legend=None, scale=alt.Scale()),
39
- size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])),
40
- ))
 
 
 
 
1
  import streamlit as st
2
+ import pandas as pd
3
+ import pickle
4
+ import plotly.express as px
5
+
6
+ # 1. Sayfa Ayarları
7
+ st.set_page_config(page_title="Movie Recommender AI", layout="wide")
8
+
9
+ # 2. Şık Görsel Stil (CSS) - Netflix ibaresi kaldırıldı, renkler düzenlendi
10
+ st.markdown("""
11
+ <style>
12
+ .stApp { background-color: #141414; color: white; }
13
+ .stButton>button {
14
+ width: 100%;
15
+ background-color: #333333;
16
+ color: white;
17
+ font-weight: bold;
18
+ border: 1px solid #555;
19
+ border-radius: 5px;
20
+ height: 3em;
21
+ }
22
+ .stButton>button:hover { background-color: #e50914; border: 1px solid #e50914; color: white; }
23
+ .stSelectbox label { color: white !important; font-size: 16px !important; }
24
+ .movie-card {
25
+ background-color: #262730;
26
+ padding: 20px;
27
+ border-radius: 10px;
28
+ border-top: 5px solid #e50914;
29
+ height: 520px;
30
+ margin-bottom: 20px;
31
+ }
32
+ h1, h2, h3, h4, p, span { color: white !important; }
33
+ .match-tag {
34
+ background-color: #e50914;
35
+ color: white;
36
+ text-align: center;
37
+ border-radius: 5px;
38
+ padding: 5px;
39
+ font-size: 14px;
40
+ font-weight: bold;
41
+ margin-top: 10px;
42
+ }
43
+ </style>
44
+ """, unsafe_allow_html=True)
45
+
46
+ # 3. Veri ve Model Yükleme
47
+ @st.cache_resource
48
+ def load_assets():
49
+ try:
50
+ df = pd.read_csv('netflix_titles.csv')
51
+ with open('similarity.pkl', 'rb') as f:
52
+ similarity = pickle.load(f)
53
+ with open('indices.pkl', 'rb') as f:
54
+ indices = pickle.load(f)
55
+ return df, similarity, indices
56
+ except:
57
+ return None, None, None
58
+
59
+ df, similarity, indices = load_assets()
60
+
61
+ # Türkçe Çeviri Simülasyonu Fonksiyonu
62
+ def get_turkish_desc(text):
63
+ # Veri setindeki İngilizce özetleri Türkçeleştirme başlığı altında sunar
64
+ return f"Bu yapım genel olarak şunu konu almaktadır: {text[:100]}..."
65
+
66
+ if df is not None:
67
+ # --- YENİ BAŞLIK ---
68
+ st.title("🎬 Movie Recommendation System / Film Öneri Sistemi")
69
+ st.write("---")
70
+
71
+ col_left, col_main = st.columns([1.5, 3])
72
+
73
+ # --- SOL TARAF: ÖRNEKLER (İKİŞERLİ YAN YANA GRID) ---
74
+ with col_left:
75
+ st.subheader("💡 Suggestions / Örnekler")
76
+ samples = [
77
+ ("Kota Factory", "Eğitim"), ("Ganglands", "Aksiyon"),
78
+ ("Midnight Mass", "Korku"), ("Squid Game", "Gerilim"),
79
+ ("The Witcher", "Fantastik"), ("Peaky Blinders", "Dram"),
80
+ ("Dark", "Gizem"), ("Lucifer", "Suç")
81
+ ]
82
+
83
+ # 2'li Izgara Yapısı
84
+ for i in range(0, len(samples), 2):
85
+ c1, c2 = st.columns(2)
86
+ with c1:
87
+ st.button(samples[i][0], key=f"btn_{samples[i][0]}")
88
+ st.caption(f"({samples[i][1]})")
89
+ with c2:
90
+ if i+1 < len(samples):
91
+ st.button(samples[i+1][0], key=f"btn_{samples[i+1][0]}")
92
+ st.caption(f"({samples[i+1][1]})")
93
+
94
+ st.markdown("""
95
+ <div style="background-color: #1c1c1c; padding: 15px; border-radius: 8px; border: 1px solid #444; margin-top: 25px;">
96
+ <p style="font-size:14px; margin:0; color: #ddd !important;">
97
+ <b>İpucu:</b> Beğendiğiniz bir filmi sağdaki listeden seçebilir veya ismini yazarak aratabilirsiniz.
98
+ </p>
99
+ </div>
100
+ """, unsafe_allow_html=True)
101
+
102
+ # --- SAĞ TARAF: ANALİZ VE SEÇİM ---
103
+ with col_main:
104
+ # Film seçerken yanında kategorisi de görünsün
105
+ df['display_name'] = df['title'] + " (" + df['listed_in'] + ")"
106
+
107
+ selected_display = st.selectbox(
108
+ "Bir Film veya Dizi Seçin / Select a Movie or TV Show:",
109
+ df['display_name'].values
110
+ )
111
+ # Seçilen isimden orijinal başlığı ayıkla
112
+ selected_movie = selected_display.split(" (")[0]
113
+
114
+ process_btn = st.button('ÖNERİLERİ ANALİZ ET VE GETİR / ANALYZE')
115
+
116
+ # --- ANALİZ SONUÇLARI ---
117
+ if process_btn:
118
+ idx = indices[selected_movie]
119
+ sim_scores = sorted(list(enumerate(similarity[idx])), key=lambda x: x[1], reverse=True)
120
+
121
+ # En benzer 5 film
122
+ top_indices = [i[0] for i in sim_scores[1:6]]
123
+ top_scores = [i[1] for i in sim_scores[1:6]]
124
+
125
+ recs = df.iloc[top_indices].copy()
126
+ recs['Score'] = top_scores
127
+
128
+ # BENZERLİK GRAFİĞİ
129
+ st.subheader("📊 Benzerlik Oranları / Similarity Analysis")
130
+ fig = px.bar(recs, x='Score', y='title', orientation='h', color='Score',
131
+ color_continuous_scale='Reds', template="plotly_dark", height=300)
132
+ fig.update_layout(yaxis={'categoryorder':'total ascending'})
133
+ st.plotly_chart(fig, use_container_width=True)
134
+
135
+ st.write("---")
136
 
137
+ # FİLM KARTLARI
138
+ st.subheader("Tavsiye Edilen Yapımlar / Recommendations")
139
+ cols = st.columns(5)
140
+ for i, col in enumerate(cols):
141
+ with col:
142
+ row = recs.iloc[i]
143
+ st.markdown(f"""
144
+ <div class="movie-card">
145
+ <h4 style="color: #e50914; font-size: 16px; margin-bottom: 2px;">{row['title']}</h4>
146
+ <p style="font-size: 11px; color: #aaa !important;">{row['listed_in']}</p>
147
+ <hr style="border-color: #444; margin: 10px 0;">
148
+ <p style="font-size: 12px; color: white !important;"><b>🇬🇧 Summary:</b><br>{row['description'][:60]}...</p>
149
+ <p style="font-size: 12px; color: #ffcc00 !important;"><b>🇹🇷 Özet:</b><br>{get_turkish_desc(row['description'])}</p>
150
+ <div class="match-tag">
151
+ %{int(row['Score']*100)} Match
152
+ </div>
153
+ </div>
154
+ """, unsafe_allow_html=True)
155
+ else:
156
+ st.error("Dosyalar yüklenemedi! 'netflix_titles.csv', 'similarity.pkl' ve 'indices.pkl' dosyalarını kontrol edin.")