Update app.py
Browse files
app.py
CHANGED
@@ -47,6 +47,8 @@ for movie in movies_data:
|
|
47 |
|
48 |
# Флаг, указывающий, что обработка фильмов завершена
|
49 |
processing_complete = False
|
|
|
|
|
50 |
|
51 |
# Блокировка для доступа к movie_embeddings
|
52 |
movie_embeddings_lock = threading.Lock()
|
@@ -61,14 +63,22 @@ def process_movies():
|
|
61 |
"""
|
62 |
global processing_complete
|
63 |
while True:
|
|
|
|
|
|
|
|
|
64 |
try:
|
65 |
-
movie = movies_queue.get(timeout=1)
|
66 |
except queue.Empty:
|
67 |
print("Очередь фильмов пуста.")
|
68 |
processing_complete = True
|
69 |
break
|
70 |
|
71 |
title = movie["name"]
|
|
|
|
|
|
|
|
|
72 |
print(f"Создается эмбеддинг для фильма '{title}'...")
|
73 |
embedding_string = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
74 |
embedding = encode_string(embedding_string).tolist()
|
@@ -111,35 +121,37 @@ def search_movies(query, top_k=3):
|
|
111 |
Returns:
|
112 |
Строку с результатами поиска в формате HTML.
|
113 |
"""
|
|
|
|
|
114 |
start_time = time.time()
|
115 |
print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
|
116 |
|
|
|
117 |
query_embedding_tensor = encode_string(query)
|
|
|
118 |
|
119 |
with movie_embeddings_lock:
|
120 |
-
# Делаем копию словаря, чтобы избежать ошибок при изменении оригинала во время итерации
|
121 |
current_movie_embeddings = movie_embeddings.copy()
|
122 |
|
123 |
if not current_movie_embeddings:
|
|
|
124 |
return "<p>Пока что нет обработанных фильмов. Попробуйте позже.</p>"
|
125 |
|
126 |
-
# Создаем словарь с описаниями фильмов
|
127 |
movie_descriptions = {}
|
128 |
for movie in movies_data:
|
129 |
movie_descriptions[movie["name"]] = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
130 |
|
131 |
-
|
132 |
similarity_scores = []
|
133 |
for title, embedding in current_movie_embeddings.items():
|
134 |
similarity = util.pytorch_cos_sim(query_embedding_tensor, encode_string(movie_descriptions[title]))[0][0].item()
|
135 |
similarity_scores.append((title, similarity))
|
|
|
136 |
|
137 |
-
# Сортируем фильмы по убыванию сходства
|
138 |
sorted_movies = sorted(similarity_scores, key=lambda item: item[1], reverse=True)
|
139 |
|
140 |
results_html = ""
|
141 |
for title, score in sorted_movies[:top_k]:
|
142 |
-
# Ищем полное описание фильма в исходных данных
|
143 |
for movie in movies_data:
|
144 |
if movie["name"] == title:
|
145 |
description = movie["description"]
|
@@ -156,7 +168,7 @@ def search_movies(query, top_k=3):
|
|
156 |
end_time = time.time()
|
157 |
execution_time = end_time - start_time
|
158 |
print(f"Поиск завершен за {execution_time:.4f} секунд.")
|
159 |
-
|
160 |
return results_html
|
161 |
|
162 |
# Поток для обработки фильмов
|
|
|
47 |
|
48 |
# Флаг, указывающий, что обработка фильмов завершена
|
49 |
processing_complete = False
|
50 |
+
# Флаг, указывающий, что выполняется поиск
|
51 |
+
search_in_progress = False
|
52 |
|
53 |
# Блокировка для доступа к movie_embeddings
|
54 |
movie_embeddings_lock = threading.Lock()
|
|
|
63 |
"""
|
64 |
global processing_complete
|
65 |
while True:
|
66 |
+
if search_in_progress:
|
67 |
+
time.sleep(1) # Ждем, пока поиск не завершится
|
68 |
+
continue
|
69 |
+
|
70 |
try:
|
71 |
+
movie = movies_queue.get(timeout=1)
|
72 |
except queue.Empty:
|
73 |
print("Очередь фильмов пуста.")
|
74 |
processing_complete = True
|
75 |
break
|
76 |
|
77 |
title = movie["name"]
|
78 |
+
if title in movie_embeddings:
|
79 |
+
print(f"Эмбеддинг для фильма '{title}' уже существует. Пропускаем.")
|
80 |
+
continue
|
81 |
+
|
82 |
print(f"Создается эмбеддинг для фильма '{title}'...")
|
83 |
embedding_string = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
84 |
embedding = encode_string(embedding_string).tolist()
|
|
|
121 |
Returns:
|
122 |
Строку с результатами поиска в формате HTML.
|
123 |
"""
|
124 |
+
global search_in_progress
|
125 |
+
search_in_progress = True
|
126 |
start_time = time.time()
|
127 |
print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
|
128 |
|
129 |
+
print(f"Начало создания эмбеддинга для запроса: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
130 |
query_embedding_tensor = encode_string(query)
|
131 |
+
print(f"Окончание создания эмбеддинга для запроса: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
132 |
|
133 |
with movie_embeddings_lock:
|
|
|
134 |
current_movie_embeddings = movie_embeddings.copy()
|
135 |
|
136 |
if not current_movie_embeddings:
|
137 |
+
search_in_progress = False
|
138 |
return "<p>Пока что нет обработанных фильмов. Попробуйте позже.</p>"
|
139 |
|
|
|
140 |
movie_descriptions = {}
|
141 |
for movie in movies_data:
|
142 |
movie_descriptions[movie["name"]] = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
143 |
|
144 |
+
print(f"Начало вычисления косинусного сходства: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
145 |
similarity_scores = []
|
146 |
for title, embedding in current_movie_embeddings.items():
|
147 |
similarity = util.pytorch_cos_sim(query_embedding_tensor, encode_string(movie_descriptions[title]))[0][0].item()
|
148 |
similarity_scores.append((title, similarity))
|
149 |
+
print(f"Окончание вычисления косинусного сходства: {time.strftime('%Y-%m-%d %H:%M:%S')}")
|
150 |
|
|
|
151 |
sorted_movies = sorted(similarity_scores, key=lambda item: item[1], reverse=True)
|
152 |
|
153 |
results_html = ""
|
154 |
for title, score in sorted_movies[:top_k]:
|
|
|
155 |
for movie in movies_data:
|
156 |
if movie["name"] == title:
|
157 |
description = movie["description"]
|
|
|
168 |
end_time = time.time()
|
169 |
execution_time = end_time - start_time
|
170 |
print(f"Поиск завершен за {execution_time:.4f} секунд.")
|
171 |
+
search_in_progress = False
|
172 |
return results_html
|
173 |
|
174 |
# Поток для обработки фильмов
|