Spaces:
Sleeping
Sleeping
File size: 7,220 Bytes
8f0a418 a112502 ff6cf2b dddc284 ff6cf2b 8f0a418 c66c983 8f0a418 aedd0a7 8f0a418 65e5c65 8f0a418 befb453 8f0a418 e9df813 8f0a418 39dfa2e d283683 ee71380 a752196 8f0a418 ee616ba 9eb87e4 ee616ba 5919c61 886472a 58f8537 fa7222f ff6cf2b 58f8537 ff6cf2b fa7222f 3bf5220 ac6735c ff6cf2b 52cd9c3 ff6cf2b 664339f 8d176bf 11be106 1adb805 ac6735c 1adb805 fa7222f ac6735c 1adb805 8d176bf ac6735c c66c983 1adb805 8d176bf ff6cf2b 2ca7a2f 3589e70 1f54c0e 3589e70 1f54c0e 233419c 1f54c0e 233419c a756afc 1b6f520 059bb54 a756afc 2a2fc67 a756afc 2a2fc67 957c300 8ead61e 957c300 4676bde 572243d 6c078d6 572243d ffc9942 6c078d6 ffc9942 6c078d6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
import streamlit as st
import pandas as pd
import torch
from transformers import AutoTokenizer, AutoModel
import faiss
import numpy as np
st.title('Умный поиск фильмов 🔍🎦')
with st.sidebar:
st.header('Выберите страницу')
page = st.selectbox("Выберите страницу", ["Главная", "Подбор фильмов по описанию", "Итоги"])
if page == "Главная":
st.header('Выполнила команда "FindMyMovie":')
st.subheader('🎥Алексей')
st.subheader('🎬Светлана')
st.subheader('🍿Тата')
st.subheader('Наши задачи:')
st.markdown("""
<span style='font-size:18px; color:purple;'>Задача 1:</span> Спарсить информацию по 5 тыс. фильмов и обработать ее
<span style='font-size:18px; color:purple;'>Задача 2:</span> Разработать систему поиска фильма по пользовательскому запросу
""", unsafe_allow_html=True)
st.markdown(
f"<div style='border: 2px solid #800080; padding: 10px; text-align: center;'><span style='font-size: 20px; color: violet;'>Мы любезно позаимствовали данные о фильмах с \
Киноафиши, ни один участник команды при этом не пострадал 💟</span></div>",
unsafe_allow_html=True
)
st.subheader(' '*10)
st.info('🌟Сервис принимает на вход описание фильма от пользователя и возвращает заданное количество подходящих вариантов')
df = pd.read_csv('fina_data.csv')
st.info('🌟Если не знаете, что посмотреть, нажмите кнопку "Сгенерировать" - сервис предложит вам 10 случайных фильмов из библиотеки')
# Отображаем HTML-разметку в Streamlit
if st.button("Сгенерировать 🎲"):
# Получение случайных 10 строк
random_rows = df[['movie_title', 'description']].sample(n=10).reset_index(drop=True)
random_rows.index = random_rows.index + 1
st.markdown(f"<span style='font-size:{20}px; color:violet'>{'Сегодня мы подобрали для вас следующие фильмы:'}</span>", unsafe_allow_html=True)
st.write(random_rows)
st.image("1.png", use_column_width=True)
if page == "Подбор фильмов по описанию":
# Загрузка предварительно обученной модели ruBERT
tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
model = AutoModel.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
df2 = pd.read_csv('fina_data.csv')
embeddings_array = np.load('embeddings_final.npy')
index = faiss.read_index('desc_faiss_index_final.index')
def encode_description(description):
tokens = tokenizer(description, return_tensors="pt")
with torch.no_grad():
outputs = model(**tokens)
embeddings = outputs.last_hidden_state.mean(dim=1)
return embeddings.cpu().numpy().astype('float32')
# embeddings = pd.read_pickle('embeddings.pkl')
def main():
# Пользовательский ввод
user_input = st.text_input("Введите описание фильма:", value="", help="Чем подробнее будет ваше описание, тем точнее мы сможем подобрать для вас фильм 🤗'")
if st.button("Искать🔍🎦"):
if user_input:
# Векторизация введенного запроса
input_embedding = encode_description(user_input)
# Поиск с использованием Faiss
_, sorted_indices = index.search(input_embedding.reshape(1, -1), 5) # Изменил на 5
# Используйте индексы для извлечения строк из DataFrame
recs = df2.iloc[sorted_indices[0]].reset_index(drop=True)
recs.index = recs.index + 1
# Вывод рекомендованных фильмов с изображениями
st.subheader("Рекомендованные фильмы 🎉:")
for i in range(5):
st.markdown(f"<span style='font-size:{20}px; color:purple'>{recs['movie_title'].iloc[i]}</span>", unsafe_allow_html=True)
# Создаем две колонки: одну для текста, другую для изображения
col1, col2 = st.columns([2, 1])
# В колонке отображаем название фильма, описание, роли и ссылку
col1.info(recs['description'].iloc[i])
col1.markdown(f"**В ролях:** {recs['actors'].iloc[i]}")
col1.markdown(f"**Фильм можно посмотреть [здесь]({recs['page_url'].iloc[i]})**")
# В колонке отображаем изображение
col2.image(recs['image_url'].iloc[i], caption=recs['movie_title'].iloc[i], width=200)
with st.sidebar:
st.info("""
#### Мы смогли помочь вам с выбором?
""")
feedback = st.text_input('Поделитесь с нами вашим мнением')
feedback_button = st.button("Отправить отзыв", key="feedback_button")
if feedback_button and feedback:
feedback_container.success("Спасибо, каждый день мы стараемся быть лучше для вас 💟")
elif feedback_button:
feedback_container.warning("Пожалуйста, введите отзыв перед отправкой.")
if __name__ == "__main__":
main()
if page == "Итоги":
st.header('Инструменты для создания проекта: ')
list_text = """
<div style='color: violet; border: 2px solid purple; padding: 10px;'>
<ul>
<li>Используемые языковые модели: rubert-base-cased-sentence, rubert-tiny2</li>
<li>Библиотека Sentence Transformers</li>
<li>Faiss (для уменьшения времени генерации подборки фильмов)</li>
<li>Сайт-жертва для парсинга - <a href="https://www.kinoafisha.info/" style='color: purple;'>Киноафиша</a></li>
</ul>
</div>
"""
# Отображение HTML-разметки в Streamlit
st.markdown(list_text, unsafe_allow_html=True) |