Shchushch commited on
Commit
d80f9cb
1 Parent(s): 66cc159
pages/1 📖_Умный_поиск_книг.py ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import random as rd
4
+ import webbrowser as wb
5
+ import numpy as np
6
+ from assets.find import find_similar,df,lems_eng,lems_rus,clean
7
+
8
+ st.set_page_config(
9
+ page_title="Умный поиск книг",
10
+ page_icon="📖",
11
+ layout="wide",
12
+ )
13
+ with st.expander('Исходный датафрейм'):
14
+ #print(list(df.columns))#df.columns())
15
+ columns= st.multiselect('Выберите колонки для отображения',options=list(df.columns),default=list(df.columns))
16
+
17
+ df.loc[:,columns]#'df.columns,default=df.columns)
18
+ #df.loc[:,columns]
19
+ st.title('Умный поиск книг')
20
+ #negability= st.checkbox('Негативный промт (beta)')
21
+ with st.form(key='search_form'):
22
+
23
+ input=st.text_input('Введите поисковый запрос','Пример запроса')
24
+
25
+ # if negability:
26
+ # neg=st.text_input('Введите отрицательный запрос')
27
+
28
+
29
+ search_but=st.form_submit_button('Искать')
30
+
31
+ items_per_page=st.number_input('Количество книг на странице',min_value=1,max_value=10,value=5)
32
+ # if search_but:
33
+ # st.session_state.clicked = True
34
+ #st.toast('Уфф')
35
+ #@st.cache_data(experimental_allow_widgets=True)
36
+ def books_show(books_idx,sim,n=items_per_page):
37
+ col=[]
38
+ books=df.copy().iloc[books_idx][:n]
39
+ for author in books['author']:
40
+ if author.find('Донцова')!=-1:
41
+ #st.toast('Уфф')
42
+ pass
43
+ books['sims']=sims[:n]
44
+ with st.expander('Датафрейм с результатами'):
45
+ books.loc[:,columns.__add__(['sims'])]
46
+ #print(books.index)
47
+ for i,book_id in enumerate(books_idx[:n]):
48
+ pic_col,text_col=st.columns([0.2,0.8])
49
+ '---'
50
+
51
+ url=books.loc[book_id][0]
52
+ #url
53
+ pic_col.image(books.loc[book_id,'image_url'],use_column_width=True)
54
+ pic_col.markdown(f'<a href={url} target="_blank">Ссылка на книгу</a>', unsafe_allow_html=True)
55
+ pic_col.markdown(f'**Степень похожести:** {books.loc[book_id,"sims"]*100:.4f}%')
56
+
57
+ #col[i][0].button('Купить',key=books['page_url'][i],on_click=lambda: wb.open_new_tab(books['page_url'][i]))
58
+
59
+ text_col.markdown('## ' + books.loc[book_id, 'title'])
60
+ text_col.markdown('**Автор:** ' + books.loc[book_id, 'author'])
61
+ text_col.markdown('**Жанр:** ' + books.loc[book_id, 'genre'])
62
+ text_col.markdown('**Аннотация:** ' + books.loc[book_id, 'annotation'])
63
+
64
+ if search_but:
65
+ neg_mark=input.find(' -')
66
+ if neg_mark==-1:
67
+ cleaned_input=clean(lems_eng(lems_rus(input)))
68
+ else:
69
+ cleaned_input=clean(lems_eng(lems_rus(input[:neg_mark])))
70
+ cleaned_neg=clean(lems_eng(lems_rus(input[neg_mark+2:])))
71
+ #print(cleaned_neg.split(),df.loc[15390,'lemmatized'].split())
72
+ with st.spinner('Wait for it...'):
73
+ if neg_mark!=-1:
74
+ st.markdown(f'**Лемматизированный запрос:** {cleaned_input} \n\n **Лемматизированый негативный запрос:** {cleaned_neg}')
75
+ sims,books_idx=find_similar(cleaned_input,50)
76
+ for book in books_idx:
77
+ if any(word in cleaned_neg.split() for word in df.loc[book,'lemmatized'].split()):
78
+ books_idx=np.delete(books_idx,np.where(books_idx==book))
79
+ else:
80
+ st.markdown(f'**Лемматизированный запрос:** {cleaned_input}')
81
+ sims,books_idx=find_similar(input)
82
+ print(f'Похожести:\n{sims}\nИндексы:\n{books_idx}')
83
+ books_show(books_idx,sims)
pages/2 🤡_Генератор_анекдотов.py ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from transformers import GPT2Tokenizer, GPT2LMHeadModel
3
+ import torch
4
+
5
+
6
+ DEVICE = 'cpu'
7
+
8
+
9
+ st.set_page_config(
10
+ page_title="Генератор анекдотов",
11
+ page_icon="🤡",
12
+ layout="wide",
13
+ )
14
+ st.title('Генератор анекдотов')
15
+
16
+ @st.cache_resource
17
+ def load_model():
18
+ model = GPT2LMHeadModel.from_pretrained(
19
+ 'sberbank-ai/rugpt3small_based_on_gpt2',
20
+ output_attentions = False,
21
+ output_hidden_states = False,
22
+ )
23
+
24
+ # Вешаем сохраненнки весов на нашу модель
25
+ model.load_state_dict(torch.load('assets/aneks_model.pt',map_location=DEVICE))
26
+ return model.to(DEVICE)
27
+ model = load_model()
28
+ with st.expander("Пояснения"):
29
+ """
30
+ #### Это генератор анекдотов
31
+
32
+ Немного технической информации:
33
+ Здесь используется нейросеть модель **rugp3small_based_on_gpt2** обученная Сбером. Я дообучил её на датасете из 2220 категории Б.
34
+ Кроме тех параметров, которые можно регулировать в интерфейсе заданы do_sample=True, early_stopping=True, остальное оставил дефолтным, т.к. это привело меня к лучшему результату
35
+ """
36
+
37
+ # Вешаем сохраненные веса на нашу модель
38
+ #model.load_state_dict(torch.load('resources/model.pt',map_location=DEVICE))
39
+ model_name='sberbank-ai/rugpt3small_based_on_gpt2'
40
+ tokenizer = GPT2Tokenizer.from_pretrained(model_name)
41
+ tokenizer.pad_token_id = tokenizer.eos_token_id
42
+
43
+ input=st.text_area('Введи промт для генерации анека',value="Заходит бесконечное число математиков в бар", key='input')
44
+ num_aneks= st.number_input('Количество анеков',min_value=1,max_value=5,value=3)
45
+
46
+ token_nums= st.number_input('Максимум токенов вывода',min_value=1,max_value=500,value=200)
47
+ with st.expander("А что такое токен?"):
48
+ """
49
+ Токен в контексте обработки естественного языка (Natural Language Processing, NLP) - это кусочек текста, который является частью большего текста. Токены могут быть очень короткими, например, отдельным символом, или более длинными, представляя собой целое слово или даже несколько слов.
50
+
51
+ Давайте рассмотрим несколько примеров:
52
+
53
+ 1. В слове "кошка" есть 6 символов, и каждый символ может считаться токеном (к, о, ш, к, а).
54
+
55
+ 2. В предложении "Я люблю кошек" токенами могут быть каждое слово: "Я", "люблю", "кошек".
56
+
57
+ 3. В случае работы с буквами, каждая буква может считаться токеном. Например, в слове "HELLO" будут пять токенов: "H", "E", "L", "L", "O".
58
+
59
+ Когда мы говорим о токенах в машинном обучении, особенно в нейронных сетях для обработки текста, мы часто имеем в виду минимальные единицы, с которыми модель работает. В тексте каждое слово или символ обычно преобразуется в числовое представление, называемое токеном, чтобы модель могла эффективно обрабатывать текстовую информацию.
60
+
61
+ Конкретно в этом случае токеном считается слово или знак препинания, заканчивающий предложение
62
+ """
63
+
64
+ length=st.number_input('Наказание за длину',min_value=0.0,max_value=10.0,value=0.2)
65
+ with st.expander("А как это?"):
66
+ """
67
+ Коэффициент штрафа за длину, который управляет предпочтением более коротких или более длинных ответов. Значение length_penalty < 1.0 предпочитает более короткие ответы, а значение > 1.0 предпочитает более длинные ответы.
68
+ Общие значения для length_penalty могут варьироваться от 0.0 до положительного бесконечности. Различные значения могут оказывать разное влияние на результат:
69
+ - length_penalty = 1.0: Нейтральный эффект на выбор длины ответа.
70
+ - length_penalty < 1.0: Модель будет предпочитать генерировать более короткие ответы.
71
+ - length_penalty > 1.0: Модель будет предпочитать генерировать более длинные ответы.
72
+ """
73
+
74
+ temp_num=st.number_input('Ввод температуры',min_value=0.1,max_value=5.0,value=2.0)
75
+ with st.expander("А это что такое?"):
76
+ """
77
+ Когда мы говорим о "температуре" в контексте генерации текста с использованием нейронных сетей, таких как GPT, это относится к параметру, который влияет на случайность и разнообразие ответов модели.
78
+
79
+ Простыми словами, температура контролирует, насколько "сумасшедшие" или "предсказуемые" будут ответы. Вы можете представить это как настройку, которая регулирует, насколько вероятность различия между предсказаниями модели.
80
+
81
+ - **Высокая температура (например, 1.5):**
82
+ - Большая случайность в ответах.
83
+ - Модель может генерировать неожиданные и креативные тексты.
84
+ - Ответы могут быть менее связанными с контекстом.
85
+
86
+ - **Низкая температура (например, 0.5):**
87
+ - Меньшая случайность, более предсказуемые ответы.
88
+ - Модель склонна использовать более типичные и "осмысленные" фразы.
89
+ - Ответы более связаны с контекстом.
90
+
91
+ Итак, регулировка температуры помогает вам контролировать баланс между творчеством и структурой в генерируемых текстах."""
92
+
93
+ def generator(prompt, max_new_tokens=token_nums, temperature=temp_num, num_aneks=num_aneks,length_penalty=length):
94
+ # Предполагается, что у вас уже есть определения model, tokenizer и DEVICE
95
+
96
+ prompt = tokenizer.encode(prompt, return_tensors='pt', truncation=True).to(DEVICE)
97
+
98
+ aneks = model.generate(
99
+ input_ids=prompt,
100
+ do_sample=True,
101
+ temperature=temperature,
102
+
103
+ num_return_sequences=num_aneks,
104
+ max_length=max_new_tokens,
105
+ length_penalty=length_penalty,
106
+ early_stopping=True
107
+ ).cpu().numpy()
108
+
109
+ # Используем строковый токенизатор для декодирования
110
+ out_list = [tokenizer.decode(seq, skip_special_tokens=True).split("\n")[0] for seq in aneks]
111
+
112
+ return out_list
113
+
114
+ if "generated_text" not in st.session_state:
115
+ st.session_state.generated_text = ""
116
+ if "disabled" not in st.session_state:
117
+ st.session_state.disabled = False
118
+
119
+ def show_anekdot_generator():
120
+ rad= st.empty()
121
+ butt= st.empty()
122
+
123
+ age_confirmation = rad.radio("Вам есть 18 лет?", ("Да", "Нет"))
124
+
125
+ submit =butt.button("Подтвердить")
126
+
127
+ if submit:
128
+ if age_confirmation == "Да":
129
+ # Если пользователь подтвердил, что ему 18
130
+ st.session_state.disabled = True
131
+
132
+
133
+ elif age_confirmation == "Нет":
134
+ # Если пользователь ответил "Нет"
135
+
136
+ st.write("Вы не достигли 18 лет. Вас переадресовывают...")
137
+ st.markdown('<meta http-equiv="refresh" content="0;URL=\'https://www.youtube.com/watch?v=V8Er1uk4fcw\'" />', unsafe_allow_html=True)
138
+ rad.empty()
139
+ butt.empty()
140
+
141
+ if not st.session_state.disabled:
142
+ show_anekdot_generator()
143
+ if st.session_state.disabled:
144
+ generate_anek_button = st.button("Генерировать анек",key='gen')
145
+
146
+
147
+ if st.session_state.gen:
148
+ st.session_state.generated_text = ""
149
+ out= generator(input)
150
+ for out_ in out:
151
+ st.session_state.generated_text += out_+'\n\n'
152
+
153
+ st.session_state.generated_text
154
+
155
+
pages/3 ♋_Это_рак?.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from PIL import Image
3
+ from assets.skin import get_evil
4
+ import requests
5
+ st.set_page_config(
6
+ page_title="Это рак?",
7
+ page_icon="♋",
8
+ layout="wide",
9
+ #initial_sidebar_state="expanded"
10
+ )
11
+ st.title('Это рак?')
12
+ with st.expander("Пояснения"):
13
+ """
14
+ #### Эта программа использует нейросеть чтобы определить, является ли кожное образование доброкачественным или злокачественным.
15
+
16
+ Немного технической информации:
17
+
18
+ Используется нейросеть **VGG_19_BN** дообученная на 660 фотографиях новообразований в течение **4 эпох**. **Точность** предсказания: **0.8327**
19
+ """
20
+ """Данные для обучения я брал [отсюда](https://www.kaggle.com/datasets/fanconic/skin-cancer-malignant-vs-benign), так что можно использовать их же для проверки работы программы, хоть это и не совсем чесно."""
21
+
22
+ upload_method = st.radio("Выбери метод загрузки", ["Файл", "URL"],key='method')
23
+ image = None
24
+ if st.session_state['method'] == "Файл":
25
+ uploaded_file=st.file_uploader('Загрузи сюда картинку новообразования',type=["jpg", "jpeg", "png"])
26
+ if uploaded_file is not None:
27
+ image = Image.open(uploaded_file)
28
+ st.image(image, caption='Uploaded Image')
29
+
30
+
31
+ elif st.session_state['method'] == "URL":
32
+ pic_url=st.text_input('Или вставь сюда ссылку на картинку',key='urls')
33
+ if pic_url != '':
34
+ try:
35
+ image = Image.open(requests.get(pic_url, stream=True).raw)
36
+ st.image(image)
37
+ except:
38
+ st.error('Не удалось загрузить картинку')
39
+
40
+ if image is not None and st.button('Это что'):
41
+ st.success(get_evil(image))
pages/4 🖼️_Распознаватель_картинок.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from PIL import Image
3
+ from assets.imagenet import img_class
4
+ import requests
5
+ from io import BytesIO
6
+ st.set_page_config(
7
+ page_title="Распознаватель изображений",
8
+ page_icon="🖼️",
9
+ layout="wide",
10
+ )
11
+ st.title('Распознаватель изображений')
12
+
13
+ with st.expander("Пояснения"):
14
+ """
15
+ #### Нейросеть опознаёт, что изображено на картинке
16
+
17
+ Немного технической информации:
18
+
19
+ Используется нейросеть **inception_v3** с точностью **78.1%** на датасете [imagenet](https://www.image-net.org/). Никаких изменений не внесено, просто добавлен пользовательский интерфейс.
20
+ """
21
+
22
+ upload_method = st.radio("Выбери метод загрузки", ["Файл", "URL"],key='method')
23
+
24
+ if st.session_state['method'] == "Файл":
25
+ uploaded_file=st.file_uploader('# Загрузи сюда любую картинку',type=["jpg", "jpeg", "png","svg"],key='uploader')
26
+ if uploaded_file is not None:
27
+ st.image(uploaded_file)
28
+ image = Image.open(uploaded_file)
29
+
30
+ elif st.session_state['method'] == "URL":
31
+
32
+ pic_url=st.text_input('Или вставь сюда ссылку на картинку',key='urls')
33
+ if pic_url != '':
34
+ try:
35
+ image = Image.open(requests.get(pic_url, stream=True).raw)
36
+ st.image(image, caption="Изображение по URL")
37
+ except:
38
+ st.error('Не удалось загрузить картинку')
39
+ # try:
40
+ if st.button('Определить'):
41
+ #st.write(image)
42
+ # st.image(image, caption='Uploaded Image', use_column_width=True)
43
+ st.success(img_class(image))
44
+ # except:
45
+ # st.error('Не удалось обработать картинку')