HaggiVaggi commited on
Commit
78e411c
·
1 Parent(s): 4e88fdb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -95
app.py CHANGED
@@ -4,134 +4,154 @@ import torch
4
  from transformers import AutoTokenizer, AutoModel
5
  import faiss
6
  import numpy as np
 
7
 
 
 
 
 
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
 
11
  st.title('Умный поиск фильмов 🔍🎦')
12
 
13
- with st.sidebar:
14
- st.header('Выберите страницу')
15
- page = st.selectbox("Выберите страницу", ["Главная", "Подбор фильмов по описанию", "Итоги"])
16
 
17
- if page == "Главная":
18
- st.header('Выполнила команда "FindMyMovie":')
19
- st.subheader('🎥Алексей')
20
- st.subheader('🎬Светлана')
21
- st.subheader('🍿Тата')
22
 
23
 
24
 
25
 
26
- st.subheader('Наши задачи:')
27
- st.markdown("""
28
  <span style='font-size:18px; color:purple;'>Задача 1:</span> Спарсить информацию по 5 тыс. фильмов и обработать ее
29
  <span style='font-size:18px; color:purple;'>Задача 2:</span> Разработать систему поиска фильма по пользовательскому запросу
30
  """, unsafe_allow_html=True)
31
 
32
- st.markdown(
33
- f"<div style='border: 2px solid #800080; padding: 10px; text-align: center;'><span style='font-size: 20px; color: violet;'>Мы любезно позаимствовали данные о фильмах с \
34
- Киноафиши, ни один участник команды при этом не пострадал 💟</span></div>",
35
- unsafe_allow_html=True
36
  )
37
 
38
- st.subheader(' '*10)
39
 
40
 
41
- st.info('🌟Сервис принимает на вход описание фильма от пользователя и возвращает заданное количество подходящих вариантов')
 
 
 
42
 
43
- df = pd.read_csv('fina_data.csv')
44
- st.info('🌟Если не знаете, что посмотреть, нажмите кнопку "Сгенерировать" - сервис предложит вам 10 случайных фильмов из библиотеки')
45
-
46
 
47
  # Отображаем HTML-разметку в Streamlit
48
- if st.button("Сгенерировать 🎲"):
49
- # Получение случайных 10 строк
50
- random_rows = df[['movie_title', 'description']].sample(n=10).reset_index(drop=True)
51
- random_rows.index = random_rows.index + 1
52
-
53
- st.markdown(f"<span style='font-size:{20}px; color:violet'>{'Сегодня мы подобрали для вас следующие фильмы:'}</span>", unsafe_allow_html=True)
54
- st.write(random_rows)
55
- st.image("1.png", use_column_width=True)
56
 
57
- if page == "Подбор фильмов по описанию":
58
- # Загрузка предварительно обученной модели ruBERT
59
- tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
60
- model = AutoModel.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
61
 
62
- df2 = pd.read_csv('fina_data.csv')
63
- embeddings_array = np.load('embeddings_final.npy')
64
- index = faiss.read_index('desc_faiss_index_final.index')
65
 
66
- def encode_description(description):
67
- tokens = tokenizer(description, return_tensors="pt")
68
- with torch.no_grad():
69
- outputs = model(**tokens)
70
- embeddings = outputs.last_hidden_state.mean(dim=1)
71
- return embeddings.cpu().numpy().astype('float32')
72
-
73
- # embeddings = pd.read_pickle('embeddings.pkl')
74
 
75
- def main():
76
 
77
 
78
- # Пользовательский ввод
79
- user_input = st.text_input("Введите описание фильма:", value="", help="Чем подробнее будет ваше описание, тем точнее мы сможем подобрать для вас фильм 🤗'")
80
 
81
- if st.button("Искать🔍🎦"):
82
- if user_input:
83
- # Векторизация введенного запроса
84
- input_embedding = encode_description(user_input)
85
 
86
- # Поиск с использованием Faiss
87
- _, sorted_indices = index.search(input_embedding.reshape(1, -1), 5) # Изменил на 5
88
 
89
- # Используйте индексы для извлечения строк из DataFrame
90
- recs = df2.iloc[sorted_indices[0]].reset_index(drop=True)
91
- recs.index = recs.index + 1
92
 
93
- # Вывод рекомендованных фильмов с изображениями
94
- st.subheader("Рекомендованные фильмы 🎉:")
95
- for i in range(5):
96
- st.markdown(f"<span style='font-size:{20}px; color:purple'>{recs['movie_title'].iloc[i]}</span>", unsafe_allow_html=True)
97
- # Создаем две колонки: одну для текста, другую для изображения
98
- col1, col2 = st.columns([2, 1])
99
 
100
- # В колонке отображаем название фильма, описание, роли и ссылку
101
- col1.info(recs['description'].iloc[i])
102
- col1.markdown(f"**В ролях:** {recs['actors'].iloc[i]}")
103
- col1.markdown(f"**Фильм можно посмотреть [здесь]({recs['page_url'].iloc[i]})**")
104
 
105
- # В колонке отображаем изображение
106
- col2.image(recs['image_url'].iloc[i], caption=recs['movie_title'].iloc[i], width=200)
107
- with st.sidebar:
108
- st.info("""
109
- #### Мы смогли помочь вам с выбором?
110
- """)
111
- feedback = st.text_input('Поделитесь с нами вашим мнением')
112
 
113
- feedback_button = st.button("Отправить отзыв", key="feedback_button")
114
 
115
- if feedback_button and feedback:
116
- feedback_container.success("Спасибо, каждый день мы стараемся быть лучше для вас 💟")
117
- elif feedback_button:
118
- feedback_container.warning("Пожалуйста, введите отзыв перед отправкой.")
119
-
120
- if __name__ == "__main__":
121
- main()
122
-
123
- if page == "Итоги":
124
- st.header('Инструменты для создания проекта: ')
125
- list_text = """
126
- <div style='color: violet; border: 2px solid purple; padding: 10px;'>
127
- <ul>
128
- <li>Используемые языковые модели: rubert-base-cased-sentence, rubert-tiny2</li>
129
- <li>Библиотека Sentence Transformers</li>
130
- <li>Faiss (для уменьшения времени генерации подборки фильмов)</li>
131
- <li>Сайт-жертва для парсинга - <a href="https://www.kinoafisha.info/" style='color: purple;'>Киноафиша</a></li>
132
- </ul>
133
- </div>
134
- """
135
-
136
- # Отображение HTML-разметки в Streamlit
137
- st.markdown(list_text, unsafe_allow_html=True)
 
4
  from transformers import AutoTokenizer, AutoModel
5
  import faiss
6
  import numpy as np
7
+ from transformers import pipeline
8
 
9
+ @st.cache_data
10
+ def load_data(url):
11
+ df = pd.read_csv(url) # 👈 Download the data
12
+ return df
13
 
14
+ df = load_data('data/final_data.csv')
15
+
16
+ @st.cache_data
17
+ def embedding_and_index():
18
+ embeddings_array = np.load('data/embeddings_final.npy')
19
+ index = faiss.read_index('data/desc_faiss_index_final.index')
20
+ return(embeddings_array, index)
21
+
22
+ embeddings_array, index = embedding_and_index()
23
+
24
+ @st.cache(allow_output_mutation=True)
25
+ def load_tokenizer_and_model():
26
+ tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
27
+ model = AutoModel.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
28
+ return tokenizer, model
29
+
30
+ tokenizer, model = load_tokenizer_and_model()
31
+
32
+ @st.cache(allow_output_mutation=True)
33
+ def encode_description(description, tokenizer, model):
34
+ tokens = tokenizer(description, return_tensors="pt")
35
+ with torch.no_grad():
36
+ outputs = model(**tokens)
37
+ embeddings = outputs.last_hidden_state.mean(dim=1)
38
+ return embeddings.cpu().numpy().astype('float32')
39
 
40
 
41
  st.title('Умный поиск фильмов 🔍🎦')
42
 
43
+ # with st.sidebar:
44
+ # st.header('Выберите страницу')
45
+ # page = st.selectbox("Выберите страницу", ["Главная", "Подбор фильмов по описанию", "Итоги"])
46
 
47
+ # if page == "Главная":
48
+ st.header('Выполнила команда "FindMyMovie":')
49
+ st.subheader('🎥Алексей')
50
+ st.subheader('🎬Светлана')
51
+ st.subheader('🍿Тата')
52
 
53
 
54
 
55
 
56
+ st.subheader('Наши задачи:')
57
+ st.markdown("""
58
  <span style='font-size:18px; color:purple;'>Задача 1:</span> Спарсить информацию по 5 тыс. фильмов и обработать ее
59
  <span style='font-size:18px; color:purple;'>Задача 2:</span> Разработать систему поиска фильма по пользовательскому запросу
60
  """, unsafe_allow_html=True)
61
 
62
+ st.markdown(
63
+ f"<div style='border: 2px solid #800080; padding: 10px; text-align: center;'><span style='font-size: 20px; color: violet;'>Мы любезно позаимствовали данные о фильмах с \
64
+ Киноафиши, ни один участник команды при этом не пострадал 💟</span></div>",
65
+ unsafe_allow_html=True
66
  )
67
 
68
+ st.subheader(' '*10)
69
 
70
 
71
+ st.info('🌟Сервис принимает на вход описание фильма от пользователя и возвращает заданное количество подходящих вариантов')
72
+
73
+
74
+ st.info('🌟Если не знаете, что посмотреть, нажмите кнопку "Сгенерировать" - сервис предложит вам 10 случайных фильмов из библиотеки')
75
 
 
 
 
76
 
77
  # Отображаем HTML-разметку в Streamlit
78
+ if st.button("Сгенерировать 🎲"):
79
+ # По��учение случайных 10 строк
80
+ random_rows = df[['movie_title', 'description']].sample(n=10).reset_index(drop=True)
81
+ random_rows.index = random_rows.index + 1
82
+
83
+ st.markdown(f"<span style='font-size:{20}px; color:violet'>{'Сегодня мы подобрали для вас следующие фильмы:'}</span>", unsafe_allow_html=True)
84
+ st.write(random_rows)
85
+ st.image("1.png", use_column_width=True)
86
 
87
+ # if page == "Подбор фильмов по описанию":
88
+
 
 
89
 
90
+
91
+
 
92
 
93
+
 
 
 
 
 
 
 
94
 
95
+ # def main():
96
 
97
 
98
+ # # Пользовательский ввод
99
+ # user_input = st.text_input("Введите описание фильма:", value="", help="Чем подробнее будет ваше описание, тем точнее мы сможем подобрать для вас фильм 🤗'")
100
 
101
+ # if st.button("Искать🔍🎦"):
102
+ # if user_input:
103
+ # # Векторизация введенного запроса
104
+ # input_embedding = encode_description(user_input)
105
 
106
+ # # Поиск с использованием Faiss
107
+ # _, sorted_indices = index.search(input_embedding.reshape(1, -1), 5) # Изменил на 5
108
 
109
+ # # Используйте индексы для извлечения строк из DataFrame
110
+ # recs = df2.iloc[sorted_indices[0]].reset_index(drop=True)
111
+ # recs.index = recs.index + 1
112
 
113
+ # # Вывод рекомендованных фильмов с изображениями
114
+ # st.subheader("Рекомендованные фильмы 🎉:")
115
+ # for i in range(5):
116
+ # st.markdown(f"<span style='font-size:{20}px; color:purple'>{recs['movie_title'].iloc[i]}</span>", unsafe_allow_html=True)
117
+ # # Создаем две колонки: одну для текста, другую для изображения
118
+ # col1, col2 = st.columns([2, 1])
119
 
120
+ # # В колонке отображаем название фильма, описание, роли и ссылку
121
+ # col1.info(recs['description'].iloc[i])
122
+ # col1.markdown(f"**В ролях:** {recs['actors'].iloc[i]}")
123
+ # col1.markdown(f"**Фильм можно посмотреть [здесь]({recs['page_url'].iloc[i]})**")
124
 
125
+ # # В колонке отображаем изображение
126
+ # col2.image(recs['image_url'].iloc[i], caption=recs['movie_title'].iloc[i], width=200)
127
+ # with st.sidebar:
128
+ # st.info("""
129
+ # #### Мы смогли помочь вам с выбором?
130
+ # """)
131
+ # feedback = st.text_input('Поделитесь с нами вашим мнением')
132
 
133
+ # feedback_button = st.button("Отправить отзыв", key="feedback_button")
134
 
135
+ # if feedback_button and feedback:
136
+ # feedback_container.success("Спасибо, каждый день мы стараемся быть лучше для вас 💟")
137
+ # elif feedback_button:
138
+ # feedback_container.warning("Пожалуйста, введите отзыв перед отправкой.")
139
+
140
+ # if __name__ == "__main__":
141
+ # main()
142
+
143
+ # if page == "Итоги":
144
+ # st.header('Инструменты для создания проекта: ')
145
+ # list_text = """
146
+ # <div style='color: violet; border: 2px solid purple; padding: 10px;'>
147
+ # <ul>
148
+ # <li>Используемые языковые модели: rubert-base-cased-sentence, rubert-tiny2</li>
149
+ # <li>Библиотека Sentence Transformers</li>
150
+ # <li>Faiss (для уменьшения времени генерации подборки фильмов)</li>
151
+ # <li>Сайт-жертва для парсинга - <a href="https://www.kinoafisha.info/" style='color: purple;'>Киноафиша</a></li>
152
+ # </ul>
153
+ # </div>
154
+ # """
155
+
156
+ # # Отображение HTML-разметки в Streamlit
157
+ # st.markdown(list_text, unsafe_allow_html=True)