Spaces:
Runtime error
Runtime error
File size: 3,678 Bytes
83a648d c1b3993 83a648d 5bbc734 7f410f4 19a6530 83a648d 2753f31 5bbc734 2753f31 5bbc734 fb540e3 5bbc734 e79c988 5bbc734 83a648d 5bbc734 a2707f7 5bbc734 8e3efa7 5bbc734 c1b3993 caeed94 6acbd69 c1b3993 ff099dc c892af5 c1b3993 c892af5 7f410f4 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 |
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.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 = 512
# Определение запроса пользователя
query = st.text_input("Введите запрос")
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_embedding.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("---")
|