File size: 4,026 Bytes
77204c0
 
 
 
 
 
 
 
 
 
 
8167cc8
 
 
 
 
 
 
 
5f1798a
8167cc8
 
 
 
 
 
 
 
 
 
5f1798a
8167cc8
 
 
 
 
 
 
 
 
 
77204c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c337215
727d3c4
 
 
 
 
 
 
 
 
ea11e8e
727d3c4
666ae32
727d3c4
c337215
666ae32
727d3c4
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
import streamlit as st
import torch
import numpy as np
import pandas as pd
from PIL import Image
from transformers import AutoTokenizer, AutoModel
import re
import pickle
import requests
from io import BytesIO

import base64
import streamlit as st
import plotly.express as px

page_bg_img = f"""
<style>
[data-testid="stAppViewContainer"] > .main {{
background-image: url("https://i.ibb.co/8dKsZpV/black-and-white-books-piled-stacks.jpg");
background-size: 110%;
background-position: top left;
background-repeat: no-repeat;
background-attachment: local;
}}
[data-testid="stHeader"] {{
background: rgba(1,1,1,1);
}}
[data-testid="stToolbar"] {{
right: 2rem;
}}
div.css-1ih2q7l.e1tzin5v0 {{
background-color: rgba(238, 238, 238, 0.5);
border: 10px solid #EEEEEE;
padding: 5% 5% 5% 10%;
border-radius: 5px;
}}
</style>
"""
st.markdown(page_bg_img, unsafe_allow_html=True)


st.title("Книжные рекомендации")

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

# Загрузка датасета и аннотаций к книгам
books = pd.read_csv('all+++.csv')
books['author'].fillna('other', inplace=True)

annot = books['annotation']

# Получение эмбеддингов аннотаций каждой книги в датасете
length = 256

# Определение запроса пользователя
query = st.text_input("Введите запрос")

num_books_per_page = st.selectbox("Количество книг на странице:", [3, 5, 10], index=0)

col1, col2 = st.columns(2)
generate_button = col1.button('Сгенерировать')

if generate_button:
    with open("book_embeddings256xxx.pkl", "rb") as f:
        book_embeddings = pickle.load(f)

    query_tokens = tokenizer.encode_plus(
        query,
        add_special_tokens=True,
        max_length=length,  # Ограничение на максимальную длину входной последовательности
        pad_to_max_length=True,  # Дополним последовательность нулями до максимальной длины
        return_tensors='pt'  # Вернём тензоры PyTorch
    )

    with torch.no_grad():
        query_outputs = model(**query_tokens)
        query_hidden_states = query_outputs.hidden_states[-1][:, 0, :]
        query_hidden_states = torch.nn.functional.normalize(query_hidden_states)

    # Вычисление косинусного расстояния между эмбеддингом запроса и каждой аннотацией
    cosine_similarities = torch.nn.functional.cosine_similarity(
        query_hidden_states.squeeze(0),
        torch.stack(book_embeddings)
    )

    cosine_similarities = cosine_similarities.numpy()

    indices = np.argsort(cosine_similarities)[::-1]  # Сортировка по убыванию

    for i in indices[:num_books_per_page]:
        col1, col2 = st.columns([5,7])

        with col2:
        #cols = st.columns(2)  # Создание двух столбцов для размещения информации и изображения
            st.write("## " + books['title'][i])
            st.markdown("**Автор:** " + books['author'][i])
            st.markdown("**Аннотация:** " + books['annotation'][i])
            image_url = books['image_url'][i]
            response = requests.get(image_url)
            image = Image.open(BytesIO(response.content))
            st.markdown(f"**[Купить книгу]({books['page_url'][i]})**")
        with col1:
            st.write("<div style='text-align: center; font-size: 5px;'></div>", unsafe_allow_html=True)
            st.image(image)
            st.write(f'совпадение с запросом: {cosine_similarities[i]:.2f}')
            st.markdown(books['genre'][i])
            st.write("---")