opex792 commited on
Commit
a581c9d
·
verified ·
1 Parent(s): 20d1dcf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -25
app.py CHANGED
@@ -5,6 +5,7 @@ import os
5
  import time
6
  import threading
7
  import queue
 
8
 
9
  # Загружаем модель
10
  model_name = "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1"
@@ -53,6 +54,9 @@ search_in_progress = False
53
  # Блокировка для доступа к movie_embeddings
54
  movie_embeddings_lock = threading.Lock()
55
 
 
 
 
56
  def encode_string(text):
57
  """Кодирует строку в эмбеддинг."""
58
  return model.encode(text, convert_to_tensor=True)
@@ -67,28 +71,35 @@ def process_movies():
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()
85
 
86
  with movie_embeddings_lock:
87
- movie_embeddings[title] = embedding
88
- # Сохраняем эмбеддинги в файл после обработки каждого фильма
 
89
  with open(embeddings_file, "w", encoding="utf-8") as f:
90
  json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
91
- print(f"Эмбеддинг для фильма '{title}' создан и сохранен.")
92
 
93
  print("Обработка фильмов завершена.")
94
 
@@ -137,21 +148,20 @@ def search_movies(query, top_k=3):
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"]
 
5
  import time
6
  import threading
7
  import queue
8
+ import torch
9
 
10
  # Загружаем модель
11
  model_name = "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1"
 
54
  # Блокировка для доступа к movie_embeddings
55
  movie_embeddings_lock = threading.Lock()
56
 
57
+ # Размер пакета для обработки эмбеддингов
58
+ batch_size = 16 # Подберите оптимальный размер
59
+
60
  def encode_string(text):
61
  """Кодирует строку в эмбеддинг."""
62
  return model.encode(text, convert_to_tensor=True)
 
71
  time.sleep(1) # Ждем, пока поиск не завершится
72
  continue
73
 
74
+ batch = []
75
+ while not movies_queue.empty() and len(batch) < batch_size:
76
+ try:
77
+ movie = movies_queue.get(timeout=1)
78
+ batch.append(movie)
79
+ except queue.Empty:
80
+ break
81
+
82
+ if not batch:
83
  print("Очередь фильмов пуста.")
84
  processing_complete = True
85
  break
86
 
87
+ titles = [movie["name"] for movie in batch]
88
+ embedding_strings = [
89
+ f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
90
+ for movie in batch
91
+ ]
92
 
93
+ print(f"Создаются эмбеддинги для фильмов: {', '.join(titles)}...")
94
+ embeddings = model.encode(embedding_strings, convert_to_tensor=True, batch_size=batch_size).tolist()
 
95
 
96
  with movie_embeddings_lock:
97
+ for title, embedding in zip(titles, embeddings):
98
+ movie_embeddings[title] = embedding
99
+ # Сохраняем эмбеддинги в файл после обработки каждого пакета
100
  with open(embeddings_file, "w", encoding="utf-8") as f:
101
  json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
102
+ print(f"Эмбеддинги для фильмов: {', '.join(titles)} созданы и сохранены.")
103
 
104
  print("Обработка фильмов завершена.")
105
 
 
148
  search_in_progress = False
149
  return "<p>Пока что нет обработанных фильмов. Попробуйте позже.</p>"
150
 
151
+ # Преобразуем эмбеддинги фильмов в тензор
152
+ movie_titles = list(current_movie_embeddings.keys())
153
+ movie_embeddings_tensor = torch.tensor(list(current_movie_embeddings.values()))
 
 
 
 
 
 
 
154
 
155
+ print(f"Начало поиска похожих фильмов: {time.strftime('%Y-%m-%d %H:%M:%S')}")
156
+ # Используем util.semantic_search для поиска похожих фильмов
157
+ hits = util.semantic_search(query_embedding_tensor, movie_embeddings_tensor, top_k=top_k)[0]
158
+ print(f"Окончание поиска похожих фильмов: {time.strftime('%Y-%m-%d %H:%M:%S')}")
159
 
160
  results_html = ""
161
+ for hit in hits:
162
+ title = movie_titles[hit['corpus_id']]
163
+ score = hit['score']
164
+ # Ищем полное описание фильма в исходных данных
165
  for movie in movies_data:
166
  if movie["name"] == title:
167
  description = movie["description"]