Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
@@ -1,90 +1,106 @@
|
|
|
|
|
|
|
|
1 |
import tensorflow as tf
|
2 |
from huggingface_hub import hf_hub_download
|
3 |
from datasets import load_dataset
|
4 |
-
|
5 |
-
import gradio as gr
|
6 |
-
from sklearn.preprocessing import MinMaxScaler
|
7 |
-
import pandas as pd
|
8 |
# Загрузка модели
|
9 |
model_path = hf_hub_download(repo_id='neuronetties/bezrabot', filename='bezrabotica.keras')
|
10 |
model = tf.keras.models.load_model(model_path)
|
11 |
|
12 |
# Загрузка и обработка датасета
|
13 |
dataset = load_dataset("Vilyam888/data")
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import numpy as np
|
3 |
+
import pandas as pd
|
4 |
import tensorflow as tf
|
5 |
from huggingface_hub import hf_hub_download
|
6 |
from datasets import load_dataset
|
7 |
+
|
|
|
|
|
|
|
8 |
# Загрузка модели
|
9 |
model_path = hf_hub_download(repo_id='neuronetties/bezrabot', filename='bezrabotica.keras')
|
10 |
model = tf.keras.models.load_model(model_path)
|
11 |
|
12 |
# Загрузка и обработка датасета
|
13 |
dataset = load_dataset("Vilyam888/data")
|
14 |
+
|
15 |
+
# Извлечение данных из датасета в DataFrame (обычно данные находятся в ключе 'train')
|
16 |
+
df = pd.DataFrame(dataset['train'])
|
17 |
+
|
18 |
+
# Удаление ненужных колонок
|
19 |
+
df = df.drop(columns=['date_x', 'status', 'budget_x', 'country', 'revenue', 'orig_lang', 'orig_title', 'overview', 'crew', 'score'], errors='ignore')
|
20 |
+
|
21 |
+
# Обработка жанров
|
22 |
+
df['genre'] = df['genre'].fillna('')
|
23 |
+
df['genre'] = df['genre'].str.split(',')
|
24 |
+
|
25 |
+
# Убираем пробелы или нежелательные символы из жанров, устраняем дублирование
|
26 |
+
all_genres = set()
|
27 |
+
for genres_list in df['genre']:
|
28 |
+
all_genres.update([genre.strip() for genre in genres_list if genre.strip()])
|
29 |
+
|
30 |
+
all_genres = sorted(all_genres) # Сортируем для удобства
|
31 |
+
|
32 |
+
# Создаем бинарные колонки для каждого жанра
|
33 |
+
for genre in all_genres:
|
34 |
+
df[genre] = df['genre'].apply(lambda x: 1 if genre in x else 0)
|
35 |
+
|
36 |
+
# Удаляем колонку 'genre', так как она больше не нужна
|
37 |
+
df = df.drop(columns=['genre'])
|
38 |
+
|
39 |
+
# Проверяем наличие столбца с названиями фильмов
|
40 |
+
if 'names' not in df.columns:
|
41 |
+
df['names'] = [f"Фильм {i}" for i in range(len(df))] # Генерируем фиктивные названия, если их нет
|
42 |
+
|
43 |
+
# Функция для рекомендаций
|
44 |
+
current_index = 0 # Глобальная переменная для отслеживания текущего индекса
|
45 |
+
recommended_movies_list = []
|
46 |
+
|
47 |
+
def recommend_movies(selected_genres):
|
48 |
+
global current_index, recommended_movies_list
|
49 |
+
|
50 |
+
if not selected_genres:
|
51 |
+
return "Выберите хотя бы один жанр."
|
52 |
+
|
53 |
+
# Создаем фильтр по выбранным жанрам с учетом схожести
|
54 |
+
filtered_df = df.copy()
|
55 |
+
filtered_df['genre_match'] = filtered_df[selected_genres].sum(axis=1)
|
56 |
+
filtered_df = filtered_df[filtered_df['genre_match'] > 0]
|
57 |
+
|
58 |
+
if filtered_df.empty:
|
59 |
+
return "Не найдено фильмов для выбранных жанров."
|
60 |
+
|
61 |
+
# Используем модель для предсказания (замените np.random.rand() на реальную модель)
|
62 |
+
probabilities = np.random.rand(len(filtered_df)) # Здесь должны быть предсказания от модели
|
63 |
+
|
64 |
+
# Сортируем фильмы по количеству совпадений жанров и вероятности
|
65 |
+
filtered_df['probability'] = probabilities
|
66 |
+
filtered_df = filtered_df.sort_values(by=['genre_match', 'probability'], ascending=[False, False])
|
67 |
+
|
68 |
+
# Получаем фильмы с текущего индекса
|
69 |
+
movies_to_display = filtered_df.iloc[current_index:current_index + 10]
|
70 |
+
current_index += 10 # Увеличиваем индекс
|
71 |
+
|
72 |
+
if not movies_to_display.empty:
|
73 |
+
recommended_movies_list = movies_to_display[['names']].to_dict(orient='records')
|
74 |
+
return "\n".join([f"{movie['names']}" for movie in recommended_movies_list])
|
75 |
+
else:
|
76 |
+
return "Больше фильмов нет."
|
77 |
+
|
78 |
+
def reset_index():
|
79 |
+
global current_index, recommended_movies_list
|
80 |
+
current_index = 0
|
81 |
+
recommended_movies_list = []
|
82 |
+
return "Список фильмов обновлен."
|
83 |
+
|
84 |
+
def remove_movie(movie_name):
|
85 |
+
global recommended_movies_list
|
86 |
+
recommended_movies_list = [movie for movie in recommended_movies_list if movie['names'] != movie_name]
|
87 |
+
return "\n".join([f"{movie['names']}" for movie in recommended_movies_list])
|
88 |
+
|
89 |
+
# Интерфейс Gradio с дополнительными кнопками
|
90 |
+
with gr.Blocks() as demo:
|
91 |
+
genre_selector = gr.CheckboxGroup(choices=all_genres, label="Выберите жанры")
|
92 |
+
result_output = gr.Textbox(label="Рекомендации")
|
93 |
+
|
94 |
+
with gr.Row():
|
95 |
+
recommend_button = gr.Button("Рекомендовать 10 фильмов")
|
96 |
+
reset_button = gr.Button("Сбросить список")
|
97 |
+
|
98 |
+
recommend_button.click(fn=recommend_movies, inputs=genre_selector, outputs=result_output)
|
99 |
+
reset_button.click(fn=reset_index, outputs=result_output)
|
100 |
+
|
101 |
+
for movie in recommended_movies_list:
|
102 |
+
remove_button = gr.Button(f"Уже смотрел: {movie['names']}")
|
103 |
+
remove_button.click(fn=remove_movie, inputs=[gr.Textbox(value=movie['names'], visible=False)], outputs=result_output)
|
104 |
+
|
105 |
+
# Запуск интерфейса
|
106 |
+
demo.launch()
|