opex792 commited on
Commit
9a9379e
·
verified ·
1 Parent(s): 421602f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -32
app.py CHANGED
@@ -3,6 +3,8 @@ from sentence_transformers import SentenceTransformer, util
3
  import json
4
  import os
5
  import time
 
 
6
 
7
  # Загружаем модель
8
  model_name = "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1"
@@ -37,25 +39,45 @@ if os.path.exists(query_embeddings_file):
37
  else:
38
  query_embeddings = {}
39
 
40
- def get_movie_embedding(movie):
 
 
 
 
 
 
 
 
 
 
 
 
41
  """
42
- Возвращает эмбеддинг для фильма. Если эмбеддинг уже создан, возвращает его из словаря.
43
- Иначе создает эмбеддинг, сохраняет его и возвращает.
44
  """
45
- title = movie["name"]
46
- if title in movie_embeddings:
47
- print(f"Эмбеддинг для фильма '{title}' уже существует.")
48
- return movie_embeddings[title]
49
- else:
 
 
 
 
 
 
50
  print(f"Создается эмбеддинг для фильма '{title}'...")
51
  embedding_string = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
52
  embedding = model.encode(embedding_string, convert_to_tensor=True).tolist()
53
- movie_embeddings[title] = embedding
54
- # Сохраняем эмбеддинги в файл
55
- with open(embeddings_file, "w", encoding="utf-8") as f:
56
- json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
 
 
57
  print(f"Эмбеддинг для фильма '{title}' создан и сохранен.")
58
- return embedding
 
59
 
60
  def get_query_embedding(query):
61
  """
@@ -75,10 +97,6 @@ def get_query_embedding(query):
75
  print(f"Эмбеддинг для запроса '{query}' создан и сохранен.")
76
  return embedding
77
 
78
- # Создаем эмбеддинги для всех фильмов
79
- for movie in movies_data:
80
- get_movie_embedding(movie)
81
-
82
  def search_movies(query, top_k=3):
83
  """
84
  Ищет наиболее похожие фильмы по запросу.
@@ -90,22 +108,29 @@ def search_movies(query, top_k=3):
90
  Returns:
91
  Строку с результатами поиска в формате HTML.
92
  """
93
- start_time = time.time() # Засекаем время начала выполнения
94
-
95
  print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
96
 
97
  query_embedding = get_query_embedding(query)
98
- query_embedding_tensor = util.pytorch_cos_sim(
99
- model.encode(query, convert_to_tensor=True),
100
- model.encode(query, convert_to_tensor=True)
101
- )
 
 
 
 
 
 
 
 
102
 
103
  # Сортируем фильмы по убыванию сходства с запросом
104
  sorted_movies = sorted(
105
- movie_embeddings.items(),
106
  key=lambda item: util.pytorch_cos_sim(
107
- query_embedding_tensor,
108
- model.encode(list(movie_descriptions.values())[list(movie_descriptions.keys()).index(item[0])], convert_to_tensor=True)
109
  )[0][0],
110
  reverse=True
111
  )
@@ -119,8 +144,8 @@ def search_movies(query, top_k=3):
119
  year = movie["year"]
120
  genres = movie["genresList"]
121
  score = util.pytorch_cos_sim(
122
- query_embedding_tensor,
123
- model.encode(list(movie_descriptions.values())[list(movie_descriptions.keys()).index(title)], convert_to_tensor=True)
124
  )[0][0].item()
125
  break
126
 
@@ -130,9 +155,8 @@ def search_movies(query, top_k=3):
130
  results_html += f"<p><b>Сходство:</b> {score:.4f}</p>"
131
  results_html += "<hr>"
132
 
133
- end_time = time.time() # Засекаем время окончания выполнения
134
- execution_time = end_time - start_time # Вычисляем время выполнения
135
-
136
  print(f"Поиск завершен за {execution_time:.4f} секунд.")
137
 
138
  return results_html
@@ -152,4 +176,14 @@ iface = gr.Interface(
152
  )
153
 
154
  # Запускаем приложение
155
- iface.launch()
 
 
 
 
 
 
 
 
 
 
 
3
  import json
4
  import os
5
  import time
6
+ import threading
7
+ import queue
8
 
9
  # Загружаем модель
10
  model_name = "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1"
 
39
  else:
40
  query_embeddings = {}
41
 
42
+ # Очередь для необработанных фильмов
43
+ movies_queue = queue.Queue()
44
+ for movie in movies_data:
45
+ if movie["name"] not in movie_embeddings:
46
+ movies_queue.put(movie)
47
+
48
+ # Флаг, указывающий, что обработка фильмов завершена
49
+ processing_complete = False
50
+
51
+ # Блокировка для доступа к movie_embeddings
52
+ movie_embeddings_lock = threading.Lock()
53
+
54
+ def process_movies():
55
  """
56
+ Обрабатывает фильмы из очереди, создавая для них эмбеддинги.
 
57
  """
58
+ global processing_complete
59
+ while True:
60
+ try:
61
+ movie = movies_queue.get(timeout=1) # Тайм-аут 1 секунда
62
+ except queue.Empty:
63
+ if processing_complete:
64
+ break
65
+ else:
66
+ continue
67
+
68
+ title = movie["name"]
69
  print(f"Создается эмбеддинг для фильма '{title}'...")
70
  embedding_string = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
71
  embedding = model.encode(embedding_string, convert_to_tensor=True).tolist()
72
+
73
+ with movie_embeddings_lock:
74
+ movie_embeddings[title] = embedding
75
+ # Сохраняем эмбеддинги в файл
76
+ with open(embeddings_file, "w", encoding="utf-8") as f:
77
+ json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
78
  print(f"Эмбеддинг для фильма '{title}' создан и сохранен.")
79
+
80
+ print("Обработка фильмов завершена.")
81
 
82
  def get_query_embedding(query):
83
  """
 
97
  print(f"Эмбеддинг для запроса '{query}' создан и сохранен.")
98
  return embedding
99
 
 
 
 
 
100
  def search_movies(query, top_k=3):
101
  """
102
  Ищет наиболее похожие фильмы по запросу.
 
108
  Returns:
109
  Строку с результатами поиска в формате HTML.
110
  """
111
+ start_time = time.time()
 
112
  print(f"\n\033[1mПоиск по запросу: '{query}'\033[0m")
113
 
114
  query_embedding = get_query_embedding(query)
115
+
116
+ with movie_embeddings_lock:
117
+ # Делаем копию словаря, чтобы избежать ошибок при изменении оригинала во время итерации
118
+ current_movie_embeddings = movie_embeddings.copy()
119
+
120
+ if not current_movie_embeddings:
121
+ return "<p>Пока что нет обработанных фильмов. Попробуйте позже.</p>"
122
+
123
+ # Создаем словарь с описаниями фильмов
124
+ movie_descriptions = {}
125
+ for movie in movies_data:
126
+ movie_descriptions[movie["name"]] = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
127
 
128
  # Сортируем фильмы по убыванию сходства с запросом
129
  sorted_movies = sorted(
130
+ current_movie_embeddings.items(),
131
  key=lambda item: util.pytorch_cos_sim(
132
+ model.encode(query, convert_to_tensor=True),
133
+ model.encode(movie_descriptions[item[0]], convert_to_tensor=True)
134
  )[0][0],
135
  reverse=True
136
  )
 
144
  year = movie["year"]
145
  genres = movie["genresList"]
146
  score = util.pytorch_cos_sim(
147
+ model.encode(query, convert_to_tensor=True),
148
+ model.encode(movie_descriptions[title], convert_to_tensor=True)
149
  )[0][0].item()
150
  break
151
 
 
155
  results_html += f"<p><b>Сходство:</b> {score:.4f}</p>"
156
  results_html += "<hr>"
157
 
158
+ end_time = time.time()
159
+ execution_time = end_time - start_time
 
160
  print(f"Поиск завершен за {execution_time:.4f} секунд.")
161
 
162
  return results_html
 
176
  )
177
 
178
  # Запускаем приложение
179
+ iface.queue()
180
+ iface.launch(share=True)
181
+
182
+ # Запускаем поток для обработки фильмов
183
+ processing_thread = threading.Thread(target=process_movies)
184
+ processing_thread.start()
185
+
186
+ # Устанавливаем флаг, что обработка завершена, когда поток завершается
187
+ processing_thread.join()
188
+ processing_complete = True
189
+ print("Все фильмы обработаны.")