File size: 3,968 Bytes
83a648d
 
 
 
c1b3993
83a648d
5bbc734
7f410f4
19a6530
 
83a648d
 
 
 
 
 
 
 
 
3ce4e56
feb52ca
19d9a62
5bbc734
19d9a62
 
 
5bbc734
 
19d9a62
 
 
 
 
 
e79c988
 
19d9a62
 
5bbc734
83a648d
 
5bbc734
19d9a62
5bbc734
 
8e3efa7
5bbc734
c1b3993
335a91c
3897726
 
d0246f1
3897726
 
 
caeed94
3897726
caeed94
6acbd69
c1b3993
ff099dc
 
 
 
 
 
 
 
 
 
c892af5
 
c1b3993
c892af5
7f410f4
 
d135b9d
6acbd69
7f410f4
 
 
c1b3993
7f410f4
c1b3993
fc00e9f
c1b3993
 
fc00e9f
3da28d3
 
fc00e9f
 
 
 
 
60ac7de
3da28d3
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
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

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)
#books.dropna(inplace=True)

#books = books[books['annotation'].apply(lambda x: len(x.split()) >= 40)]
#books.drop_duplicates(subset='title', keep='first', inplace=True)
#books = books.reset_index(drop=True)


#def data_preprocessing(text: str) -> str:
    #text = re.sub(r'http\S+', " ", text)  # удаляем ссылки
    #text = re.sub(r'@\w+', ' ', text)  # удаляем упоминания пользователей
    #text = re.sub(r'#\w+', ' ', text)  # удаляем хэштеги
    #text = re.sub(r'<.*?>', ' ', text)  # html tags
   # return text


#for i in ['author', 'title', 'annotation']:
    #books[i] = books[i].apply(data_preprocessing)

annot = books['annotation']

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

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

if st.button('Сгенерировать'):
    with open("book_embeddings256xxx.pkl", "rb") as f:
        book_embeddings = pickle.load(f)

    #book_embeddings = torch.tensor(book_embeddings, device=torch.device('cpu'))


#if st.button('Сгенерировать'):
    #with open("book_embeddingsN.pkl", "rb") as f:
    #book_embeddings = torch.load("book_embeddingsN.pkl", map_location=torch.device('cpu'))
#
        #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]  # Сортировка по убыванию

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

    for i in indices[:num_books_per_page]:
        cols = st.columns(2)  # Создание двух столбцов для размещения информации и изображения
        cols[1].write("## " + books['title'][i])
        cols[1].markdown("**Автор:** " + books['author'][i])
        cols[1].markdown("**Аннотация:** " + books['annotation'][i])
        image_url = books['image_url'][i]
        response = requests.get(image_url)
        image = Image.open(BytesIO(response.content))
        cols[0].image(image)
        cols[0].write(cosine_similarities[i])
        cols[1].write("---")