File size: 6,317 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
4053457
5919c61
a468014
 
 
 
 
5919c61
 
a468014
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
111
112
113
114
115
116
117
118
119
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.markdown("<p style='font-size: 16px; color: violet;'>Мы смогли помочь вам с выбором?</p>", unsafe_allow_html=True)
                        feedback = st.text_input("")
                        feedback_button = st.button("Отправить отзыв", key="feedback_button")
                    
                    # Обработка отзыва, например, сохранение в файл или отправка на сервер
                    if feedback_button:
                        st.success("Спасибо, каждый день мы стараемся быть лучше для вас🤗")

    if __name__ == "__main__":
        main()