Update app.py
Browse files
app.py
CHANGED
@@ -51,6 +51,10 @@ processing_complete = False
|
|
51 |
# Блокировка для доступа к movie_embeddings
|
52 |
movie_embeddings_lock = threading.Lock()
|
53 |
|
|
|
|
|
|
|
|
|
54 |
def process_movies():
|
55 |
"""
|
56 |
Обрабатывает фильмы из очереди, создавая для них эмбеддинги.
|
@@ -67,7 +71,7 @@ def process_movies():
|
|
67 |
title = movie["name"]
|
68 |
print(f"Создается эмбеддинг для фильма '{title}'...")
|
69 |
embedding_string = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
70 |
-
embedding =
|
71 |
|
72 |
with movie_embeddings_lock:
|
73 |
movie_embeddings[title] = embedding
|
@@ -88,7 +92,7 @@ def get_query_embedding(query):
|
|
88 |
return query_embeddings[query]
|
89 |
else:
|
90 |
print(f"Создается эмбеддинг для запроса '{query}'...")
|
91 |
-
embedding =
|
92 |
query_embeddings[query] = embedding
|
93 |
# Сохраняем эмбеддинги запросов в файл
|
94 |
with open(query_embeddings_file, "w", encoding="utf-8") as f:
|
@@ -111,6 +115,7 @@ def search_movies(query, top_k=3):
|
|
111 |
print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
|
112 |
|
113 |
query_embedding = get_query_embedding(query)
|
|
|
114 |
|
115 |
with movie_embeddings_lock:
|
116 |
# Делаем копию словаря, чтобы избежать ошибок при изменении оригинала во время итерации
|
@@ -124,28 +129,23 @@ def search_movies(query, top_k=3):
|
|
124 |
for movie in movies_data:
|
125 |
movie_descriptions[movie["name"]] = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
126 |
|
127 |
-
#
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
)
|
136 |
|
137 |
results_html = ""
|
138 |
-
for title,
|
139 |
# Ищем полное описание фильма в исходных данных
|
140 |
for movie in movies_data:
|
141 |
if movie["name"] == title:
|
142 |
description = movie["description"]
|
143 |
year = movie["year"]
|
144 |
genres = movie["genresList"]
|
145 |
-
score = util.pytorch_cos_sim(
|
146 |
-
model.encode(query, convert_to_tensor=True),
|
147 |
-
model.encode(movie_descriptions[title], convert_to_tensor=True)
|
148 |
-
)[0][0].item()
|
149 |
break
|
150 |
|
151 |
results_html += f"<h3><b>{title} ({year})</b></h3>"
|
|
|
51 |
# Блокировка для доступа к movie_embeddings
|
52 |
movie_embeddings_lock = threading.Lock()
|
53 |
|
54 |
+
def encode_string(text):
|
55 |
+
"""Кодирует строку в эмбеддинг."""
|
56 |
+
return model.encode(text, convert_to_tensor=True)
|
57 |
+
|
58 |
def process_movies():
|
59 |
"""
|
60 |
Обрабатывает фильмы из очереди, создавая для них эмбеддинги.
|
|
|
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()
|
75 |
|
76 |
with movie_embeddings_lock:
|
77 |
movie_embeddings[title] = embedding
|
|
|
92 |
return query_embeddings[query]
|
93 |
else:
|
94 |
print(f"Создается эмбеддинг для запроса '{query}'...")
|
95 |
+
embedding = encode_string(query).tolist()
|
96 |
query_embeddings[query] = embedding
|
97 |
# Сохраняем эмбеддинги запросов в файл
|
98 |
with open(query_embeddings_file, "w", encoding="utf-8") as f:
|
|
|
115 |
print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
|
116 |
|
117 |
query_embedding = get_query_embedding(query)
|
118 |
+
query_embedding_tensor = encode_string(query)
|
119 |
|
120 |
with movie_embeddings_lock:
|
121 |
# Делаем копию словаря, чтобы избежать ошибок при изменении оригинала во время итерации
|
|
|
129 |
for movie in movies_data:
|
130 |
movie_descriptions[movie["name"]] = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
|
131 |
|
132 |
+
# Вычисляем косинусное сходство и сохраняем в список кортежей (название фильма, сходство)
|
133 |
+
similarity_scores = []
|
134 |
+
for title, embedding in current_movie_embeddings.items():
|
135 |
+
similarity = util.pytorch_cos_sim(query_embedding_tensor, encode_string(movie_descriptions[title]))[0][0].item()
|
136 |
+
similarity_scores.append((title, similarity))
|
137 |
+
|
138 |
+
# Сортируем фильмы по убыванию сходства
|
139 |
+
sorted_movies = sorted(similarity_scores, key=lambda item: item[1], reverse=True)
|
|
|
140 |
|
141 |
results_html = ""
|
142 |
+
for title, score in sorted_movies[:top_k]:
|
143 |
# Ищем полное описание фильма в исходных данных
|
144 |
for movie in movies_data:
|
145 |
if movie["name"] == title:
|
146 |
description = movie["description"]
|
147 |
year = movie["year"]
|
148 |
genres = movie["genresList"]
|
|
|
|
|
|
|
|
|
149 |
break
|
150 |
|
151 |
results_html += f"<h3><b>{title} ({year})</b></h3>"
|