opex792 commited on
Commit
652b0cf
·
verified ·
1 Parent(s): f7cdb6c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +16 -16
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 = model.encode(embedding_string, convert_to_tensor=True).tolist()
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 = model.encode(query, convert_to_tensor=True).tolist()
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
- sorted_movies = sorted(
129
- current_movie_embeddings.items(),
130
- key=lambda item: util.pytorch_cos_sim(
131
- model.encode(query, convert_to_tensor=True),
132
- model.encode(movie_descriptions[item[0]], convert_to_tensor=True)
133
- )[0][0],
134
- reverse=True
135
- )
136
 
137
  results_html = ""
138
- for title, _ in sorted_movies[:top_k]:
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>"