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)