File size: 4,208 Bytes
8f0a418
 
 
fa7222f
 
 
 
 
a112502
51c3be1
e6e6052
fa7222f
8f0a418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fa7222f
 
 
 
 
3bf5220
fa7222f
3bf5220
 
 
 
 
73159f3
8d176bf
e6e6052
 
8d176bf
 
fa7222f
8d176bf
630ecc3
8d176bf
 
fa7222f
8d176bf
 
73159f3
fa7222f
8d176bf
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 numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer, util
from transformers import AutoTokenizer, AutoModel
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
import torch
import ast
import re




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")

    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
    df2 = pd.read_csv('data_with_embeddings.csv')
    embeddings = pd.read_pickle('embeddings.pkl')
    user_input = st.text_area('Введите описание фильма')
    input_embedding = encode_description(user_input)
    embeddings_tensor = torch.stack([torch.Tensor(ast.literal_eval(embedding_str)) for embedding_str in df2['description_embedding']]).numpy()


    # Рассчитайте косинусное сходство
    similarity_scores = cosine_similarity(input_embedding.view(1, -1).detach().numpy(), embeddings_tensor.reshape(embeddings_tensor.shape[0], -1))[0]

    # Получение индексов отсортированных значений
    sorted_indices = similarity_scores.argsort()[::-1]

    # Используйте индексы для извлечения строк из DataFrame
    recs = df2.iloc[sorted_indices[:10]].reset_index(drop=True)
    recs.index = recs.index + 1   
    st.write(recs[['movie_title', 'description']])