File size: 4,636 Bytes
8f0a418
 
a112502
ff6cf2b
dddc284
ff6cf2b
8f0a418
 
 
c66c983
8f0a418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa7222f
 
 
 
 
ff6cf2b
c66c983
ff6cf2b
 
 
fa7222f
3bf5220
 
 
 
ac6735c
 
 
 
ff6cf2b
52cd9c3
ff6cf2b
 
1adb805
8d176bf
11be106
1adb805
ac6735c
1adb805
fa7222f
ac6735c
1adb805
8d176bf
ac6735c
c66c983
1adb805
8d176bf
ff6cf2b
2ca7a2f
 
b19e411
 
089d2c5
ff6cf2b
1adb805
 
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
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(f"<span style='font-size:{20}px; color:purple'>{'Задача №1: Спарсить информацию по 5 тыс. [фильмов](https://www.kinoafisha.info/) и обработать ее'}</span>", unsafe_allow_html=True)
    st.markdown(f"<span style='font-size:{20}px; 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.info('🌟Сервис принимает на вход описание фильма от пользователя и возвращает заданное количество подходящих вариантов')

    df = pd.read_csv('data_with_adds.csv')
    st.info('🌟Если не знаете, что посмотреть, нажмите кнопку "Сгенерировать" - сервис предложит вам 10 случайных фильмов из библиотеки')
    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("Случайные 10 фильмов")
        st.write(random_rows)

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('data_with_adds.csv') 
    embeddings_array = np.load('embeddings.npy')
    index = faiss.read_index('desc_faiss_index.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("Введите описание фильма:")

        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)
                    st.info(recs['description'].iloc[i])  # Вывести полное описание фильма
                    st.image(recs['image_url'].iloc[i], caption=recs['movie_title'].iloc[i], width=200)

    if __name__ == "__main__":
        main()