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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -40
app.py CHANGED
@@ -2,6 +2,7 @@ import gradio as gr
2
  from sentence_transformers import SentenceTransformer, util
3
  import json
4
  import os
 
5
 
6
  # Загружаем модель
7
  model_name = "HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v1"
@@ -9,6 +10,8 @@ model = SentenceTransformer(model_name)
9
 
10
  # Имя файла для сохранения эмбеддингов
11
  embeddings_file = f"movie_embeddings_{model_name.replace('/', '_')}.json"
 
 
12
 
13
  # Загружаем данные из файла movies.json
14
  try:
@@ -18,49 +21,63 @@ except FileNotFoundError:
18
  print("Ошибка: Файл movies.json не найден.")
19
  movies_data = []
20
 
21
- # Проверяем, есть ли сохраненные эмбеддинги
22
  if os.path.exists(embeddings_file):
23
  with open(embeddings_file, "r", encoding="utf-8") as f:
24
- movie_embeddings_loaded = json.load(f)
25
- print("Загружены эмбеддинги из файла.")
26
  else:
27
- movie_embeddings_loaded = {}
28
 
29
- # Создаем словарь с описаниями фильмов и эмбеддингами
30
- movie_descriptions = {}
31
- movie_embeddings = {}
 
 
 
 
32
 
33
- for movie in movies_data:
 
 
 
 
34
  title = movie["name"]
35
- # Формируем строку для эмбеддинга из всех данных фильма
36
- embedding_string = f"Название: {movie['name']}\nГод: {movie['year']}\nЖанры: {movie['genresList']}\nОписание: {movie['description']}"
37
- movie_descriptions[title] = embedding_string
38
-
39
- # Проверяем, есть ли эмбеддинг для фильма в загруженных
40
- if title in movie_embeddings_loaded:
41
- movie_embeddings[title] = movie_embeddings_loaded[title]
42
  else:
43
- # Создаем эмбеддинг и добавляем в словарь
 
44
  embedding = model.encode(embedding_string, convert_to_tensor=True).tolist()
45
  movie_embeddings[title] = embedding
 
 
 
 
 
46
 
47
- # Сохраняем эмбеддинги в файл, если были созданы новые
48
- if len(movie_embeddings_loaded) < len(movie_embeddings):
49
- with open(embeddings_file, "w", encoding="utf-8") as f:
50
- json.dump(movie_embeddings, f, ensure_ascii=False, indent=4)
51
- print("Эмбеддинги сохранены в файл.")
52
-
53
- # Конвертируем эмбеддинги в тензоры
54
- if len(movie_embeddings) > 0:
55
- movie_embeddings_tensor = {
56
- title: util.pytorch_cos_sim(
57
- model.encode(query, convert_to_tensor=True),
58
- model.encode(embedding_string, convert_to_tensor=True)
59
- )
60
- for title, embedding_string in movie_descriptions.items()
61
- }
62
- else:
63
- movie_embeddings_tensor = None
 
 
 
 
64
 
65
  def search_movies(query, top_k=3):
66
  """
@@ -73,15 +90,22 @@ def search_movies(query, top_k=3):
73
  Returns:
74
  Строку с результатами поиска в формате HTML.
75
  """
76
- if movie_embeddings_tensor is None:
77
- return "<p>Ошибка: Данные фильмов не загружены.</p>"
 
 
 
 
 
 
 
78
 
79
  # Сортируем фильмы по убыванию сходства с запросом
80
  sorted_movies = sorted(
81
- movie_embeddings_tensor.items(),
82
  key=lambda item: util.pytorch_cos_sim(
83
- model.encode(query, convert_to_tensor=True),
84
- model.encode(movie_descriptions[item[0]], convert_to_tensor=True)
85
  )[0][0],
86
  reverse=True
87
  )
@@ -95,8 +119,8 @@ def search_movies(query, top_k=3):
95
  year = movie["year"]
96
  genres = movie["genresList"]
97
  score = util.pytorch_cos_sim(
98
- model.encode(query, convert_to_tensor=True),
99
- model.encode(movie_descriptions[title], convert_to_tensor=True)
100
  )[0][0].item()
101
  break
102
 
@@ -106,6 +130,11 @@ def search_movies(query, top_k=3):
106
  results_html += f"<p><b>Сходство:</b> {score:.4f}</p>"
107
  results_html += "<hr>"
108
 
 
 
 
 
 
109
  return results_html
110
 
111
  # Создаем интерфейс Gradio
 
2
  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"
 
10
 
11
  # Имя файла для сохранения эмбеддингов
12
  embeddings_file = f"movie_embeddings_{model_name.replace('/', '_')}.json"
13
+ # Имя файла для сохранения эмбеддингов запросов
14
+ query_embeddings_file = f"query_embeddings_{model_name.replace('/', '_')}.json"
15
 
16
  # Загружаем данные из файла movies.json
17
  try:
 
21
  print("Ошибка: Файл movies.json не найден.")
22
  movies_data = []
23
 
24
+ # Загружаем эмбеддинги фильмов
25
  if os.path.exists(embeddings_file):
26
  with open(embeddings_file, "r", encoding="utf-8") as f:
27
+ movie_embeddings = json.load(f)
28
+ print("Загружены эмбеддинги фильмов из файла.")
29
  else:
30
+ movie_embeddings = {}
31
 
32
+ # Загружаем эмбеддинги запросов
33
+ if os.path.exists(query_embeddings_file):
34
+ with open(query_embeddings_file, "r", encoding="utf-8") as f:
35
+ query_embeddings = json.load(f)
36
+ print("Загружены эмбеддинги запросов из файла.")
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
+ """
62
+ Возвращает эмбеддинг для запроса. Если эмбеддинг уже создан, возвращает его из словаря.
63
+ Иначе создает эмбеддинг, сохраняет его и возвращает.
64
+ """
65
+ if query in query_embeddings:
66
+ print(f"Эмбеддинг для запроса '{query}' уже существует.")
67
+ return query_embeddings[query]
68
+ else:
69
+ print(f"Создается эмбеддинг для запроса '{query}'...")
70
+ embedding = model.encode(query, convert_to_tensor=True).tolist()
71
+ query_embeddings[query] = embedding
72
+ # Сохраняем эмбеддинги запросов в файл
73
+ with open(query_embeddings_file, "w", encoding="utf-8") as f:
74
+ json.dump(query_embeddings, f, ensure_ascii=False, indent=4)
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
  """
 
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
  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
  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
139
 
140
  # Создаем интерфейс Gradio