Spaces:
Sleeping
Sleeping
File size: 5,642 Bytes
8f0a418 a112502 ff6cf2b dddc284 ff6cf2b 8f0a418 c66c983 8f0a418 cf59bb9 8f0a418 65e5c65 8f0a418 befb453 8f0a418 e9df813 8f0a418 39dfa2e d283683 ee71380 a752196 8f0a418 9ada427 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 db6e166 4676bde |
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 |
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
# Вывод на страничке Streamlit без индексов и заголовков столбцов
st.write("Вот, что мы подобрали для вас сегодня:")
st.dataframe(random_rows.reset_index(drop=True), index=False)
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)
if __name__ == "__main__":
main() |