HaggiVaggi commited on
Commit
35b3c68
1 Parent(s): 00fe29e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +137 -0
app.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ 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)