Spaces:
Sleeping
Sleeping
File size: 3,828 Bytes
38ce1fa 071f0b8 ee1c320 071f0b8 ee1c320 071f0b8 ee1c320 841911a 071f0b8 841911a 071f0b8 cc18cb2 071f0b8 b1ead15 ee1c320 cc18cb2 600a6d6 841911a b1ead15 2a4ef78 cc18cb2 ee1c320 b1ead15 ee1c320 b1ead15 ee1c320 2a4ef78 b1ead15 ee1c320 b1ead15 2a4ef78 b1ead15 2a4ef78 b1ead15 2a4ef78 b1ead15 2a4ef78 b1ead15 |
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 |
import streamlit as st
import pandas as pd
import torch
from transformers import AutoTokenizer, AutoModel
import faiss
import numpy as np
@st.cache_data
def load_data(url):
df = pd.read_csv(url)
return df
@st.cache_data
def embedding_and_index():
embeddings_array = np.load('data/embeddings_final.npy')
index = faiss.read_index('data/desc_faiss_index_final.index')
return embeddings_array, index
@st.cache_data
def load_model():
model = AutoModel.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
return model
st.header("Подбор фильмов по описанию ✏️🔍")
# Загрузка данных
tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/rubert-base-cased-sentence")
df = load_data('data/final_data.csv')
embeddings_array, index = embedding_and_index()
model = load_model()
# Пользовательский ввод
user_input = st.text_input("Введите описание фильма:", value="", help="Чем подробнее будет ваше описание, тем точнее мы сможем подобрать для вас фильм 🤗'")
if st.button("Искать🔍🎦"):
if user_input:
def encode_description(description, tokenizer, model):
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')
# Векторизация введенного запроса с использованием переданных tokenizer и model
input_embedding = encode_description(user_input, tokenizer, model)
# Поиск с использованием Faiss
_, sorted_indices = index.search(input_embedding.reshape(1, -1), 5)
# Используйте индексы для извлечения строк из DataFrame
recs = df.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("Пожалуйста, введите отзыв перед отправкой.")
|