File size: 4,899 Bytes
777cb96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f4712b
 
777cb96
 
 
 
 
4f4712b
777cb96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234ebfe
777cb96
 
 
4f4712b
777cb96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234ebfe
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
import streamlit as st
st.set_page_config(page_title="FindMyBook", page_icon="📚", menu_items=None, initial_sidebar_state="auto")

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import csv
from joblib import load
from transformers import AutoTokenizer, AutoModel
from faiss_file import model, tokenizer, embeddings_dataset, embed_bert_cls, recommend


# Модель, токенайзер, датасет, kmeans, функция рекомендаций

device = 'cpu'

#tokenizer_k = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny")
#model_k = AutoModel.from_pretrained("cointegrated/rubert-tiny")
kmeans = load('kmeans.joblib')
emb = load('final_emb.joblib')

def recomendation(input):

    user_input = embed_bert_cls(input, model, tokenizer)#embed_bert_cls(input, model_k, tokenizer_k)
    label = kmeans.predict(user_input.reshape(1, -1))[0]
    sample_df = emb[emb['labels'] == label].copy()
    sample_df['cosine'] = sample_df['embeddings'].apply(lambda x: np.dot(x, user_input) / (np.linalg.norm(x) * np.linalg.norm(user_input)))

    return sample_df.sort_values('cosine', ascending=False)



st.title('Умный поиск книг')

with st.sidebar:
        st.markdown('Добро пожаловать в мир **FindMyBook** - самого умного поисковика книг! Это как твой личный библиотекарь, который знает все о тебе и твоих предпочтениях в литературе! Это не просто обычный поисковик, который ищет книги по авторам или названиям, это настоящий литературный детектив, который проникает в глубь содержания книг и помогает найти именно те, которые оставят неизгладимое впечатление.')
        st.markdown('**FindMyBook** работает на основе передовых алгоритмов искусственного интеллекта, которые позволяют ему анализировать содержание книг и находить связи между ними. Этот поисковик сможет найти книгу, которая понравится именно тебе, учитывая твои предпочтения и интересы.')
        st.markdown('Не нужно тратить время на бесконечный поиск книг в огромных онлайн-библиотеках. Просто введи тему, которая тебя интересует, и **FindMyBook** уже начнет искать книги, которые подходят именно тебе!')
        
user_prompt = st.text_area(label='Введите запрос:', placeholder="Хочу прочитать о...", height=200)

books_per_page = st.number_input('Количество рекомендаций:', min_value=1, max_value=5, value=3)

button = st.button("Найти")
        
tab1, tab2 = st.tabs(["Faiss Search", "K-Mean"])

with tab1:

    if button and len(user_prompt) > 1:
        book_recs = recommend(user_prompt, books_per_page)
        for i in range(books_per_page):

            col1, col2 = st.columns([2,7])
            with col1:
                image = book_recs['image_url'].iloc[i]
                st.image(image)

            with col2:
                title = book_recs['title'].iloc[i]
                try:
                    author = book_recs['author'].iloc[i].rstrip()
                except:
                    author = book_recs['author'].iloc[i]
                annotation = book_recs['annotation'].iloc[i]
                st.subheader(title)
                st.markdown(f'_{author}_')
                st.caption(annotation)
                st.markdown(f"[Подробнее...]({book_recs['page_url'].iloc[i]})")
                #st.divider()

with tab2:

    #book_recs = recommend(user_prompt, books_per_page)
    if button and len(user_prompt) > 1:
        
        book_recs = recomendation(user_prompt)
        for i in range(books_per_page):

            col1, col2 = st.columns([2,7])
            with col1:
                image = book_recs['image_url'].iloc[i]
                st.image(image)

            with col2:
                title = book_recs['title'].iloc[i]
                try:
                    author = book_recs['author'].iloc[i].rstrip()
                except:
                    author = book_recs['author'].iloc[i]
                annotation = book_recs['annotation'].iloc[i]
                st.subheader(title)
                st.markdown(f'_{author}_')
                st.caption(annotation)
                st.markdown(f"[Подробнее...]({book_recs['page_url'].iloc[i]})")
                #st.divider()