File size: 2,817 Bytes
943df62
5bdc726
 
 
 
 
 
 
943df62
 
 
5bdc726
c8880c1
 
5bdc726
 
c8880c1
5bdc726
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
943df62
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
import numpy as np
import faiss
import streamlit as st
from transformers import AutoTokenizer, AutoModel
import torch
import joblib
import pandas as pd

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Загрузка сохраненных данных и индекса
text_embeddings = joblib.load('mail_embeddings.joblib')
index = faiss.read_index('mail_faiss_index.index')

# Датасет
df = pd.read_csv('clean_mail_movie.csv')
titles = df['movie_title'].tolist()
images = df['image_url'].tolist()
descr = df['description'].tolist()
links = df['page_url'].tolist()

# Загрузка модели и токенизатора
tokenizer = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny2")
model = AutoModel.from_pretrained("cointegrated/rubert-tiny2")

# Функция для векторизации текста
def embed_bert_cls(text, model, tokenizer):
    t = tokenizer(text, padding=True, truncation=True, return_tensors='pt', max_length=1024)
    with torch.no_grad():
        model_output = model(**{k: v.to(model.device) for k, v in t.items()})
    embeddings = model_output.last_hidden_state[:, 0, :]
    embeddings = torch.nn.functional.normalize(embeddings)
    return embeddings[0].cpu().numpy()



# Streamlit интерфейс
st.title("Умный поиск фильмов")

user_input = st.text_area("Введите описание фильма:")
num_recs = st.selectbox("Количество рекомендаций:", [1, 3, 5, 10])

if st.button("Найти"):
    if user_input:
        user_embedding = embed_bert_cls(user_input, model, tokenizer).astype('float32').reshape(1, -1)
        distances, top_indices = index.search(user_embedding, num_recs)  # Здесь добавляем переменную distances
        
        st.write(f"Рекомендованные фильмы (Топ-{num_recs}):")
        
        for i, index in enumerate(top_indices[0]):
            col1, col2, col3 = st.columns([1, 4, 1])  # Добавляем ещё одну колонку для уверенности
            
            with col1:
                try:
                    st.image(images[index])  # Загружаем обложку фильма
                except Exception as e:
                    st.write(f"Could not display image at index {index}. Error: {e}")  # Это на случай отсутствия обложки

            with col2:
                st.markdown(f"[{titles[index]}]({links[index]})")  # Название фильма сделано кликабельным
                st.write(descr[index])  # Выводим описание фильма
            
            with col3:
                st.write(f"Уверенность: {(1-sigmoid(distances[0][i]))*100:.1f}%")  # Выводим уверенность