Seppukku commited on
Commit
8fb2bb2
·
1 Parent(s): f04438b

initial commit

Browse files
app.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ import streamlit as st
2
+
3
+ st.title('NLP project of GPT Team')
finetuned/config.json ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "sberbank-ai/rugpt3small_based_on_gpt2",
3
+ "activation_function": "gelu_new",
4
+ "architectures": [
5
+ "GPT2LMHeadModel"
6
+ ],
7
+ "attn_pdrop": 0.1,
8
+ "bos_token_id": 1,
9
+ "embd_pdrop": 0.1,
10
+ "eos_token_id": 2,
11
+ "gradient_checkpointing": false,
12
+ "id2label": {
13
+ "0": "LABEL_0"
14
+ },
15
+ "initializer_range": 0.02,
16
+ "label2id": {
17
+ "LABEL_0": 0
18
+ },
19
+ "layer_norm_epsilon": 1e-05,
20
+ "model_type": "gpt2",
21
+ "n_ctx": 2048,
22
+ "n_embd": 768,
23
+ "n_head": 12,
24
+ "n_inner": null,
25
+ "n_layer": 12,
26
+ "n_positions": 2048,
27
+ "pad_token_id": 0,
28
+ "reorder_and_upcast_attn": false,
29
+ "resid_pdrop": 0.1,
30
+ "scale_attn_by_inverse_layer_idx": false,
31
+ "scale_attn_weights": true,
32
+ "summary_activation": null,
33
+ "summary_first_dropout": 0.1,
34
+ "summary_proj_to_labels": true,
35
+ "summary_type": "cls_index",
36
+ "summary_use_proj": true,
37
+ "torch_dtype": "float32",
38
+ "transformers_version": "4.42.4",
39
+ "use_cache": true,
40
+ "vocab_size": 50264
41
+ }
finetuned/generation_config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "bos_token_id": 1,
4
+ "eos_token_id": 2,
5
+ "pad_token_id": 0,
6
+ "transformers_version": "4.42.4"
7
+ }
finetuned/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ea4e8802b9588c2b35a233a23febb2bb574c98a04c27cbd31deafc92912a3295
3
+ size 500941440
funcs/__pycache__/nastya_funcs.cpython-310.pyc ADDED
Binary file (4.47 kB). View file
 
funcs/__pycache__/sasha_funcs.cpython-310.pyc ADDED
Binary file (2.02 kB). View file
 
funcs/nastya_funcs.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import joblib
3
+ import re
4
+ import string
5
+ import pymorphy3
6
+ import torch
7
+ from transformers import BertModel, BertTokenizer
8
+ from torch import nn
9
+
10
+
11
+ model_name = "cointegrated/rubert-tiny2"
12
+ tokenizer = BertTokenizer.from_pretrained(model_name)
13
+
14
+ bert_model = BertModel.from_pretrained(model_name)
15
+
16
+
17
+ class MyTinyBERT(nn.Module):
18
+ def __init__(self):
19
+ super().__init__()
20
+ self.bert = bert_model
21
+ for param in self.bert.parameters():
22
+ param.requires_grad = False
23
+ self.linear = nn.Sequential(
24
+ nn.Linear(312, 256),
25
+ nn.Sigmoid(),
26
+ nn.Dropout(),
27
+ nn.Linear(256, 6)
28
+ )
29
+
30
+
31
+ def forward(self, input_ids, attention_mask=None):
32
+ # Pass the input_ids and attention_mask to the BERT model
33
+ bert_out = self.bert(input_ids=input_ids, attention_mask=attention_mask)
34
+
35
+ # Normalize the output from BERT
36
+ normed_bert_out = nn.functional.normalize(bert_out.last_hidden_state[:, 0, :])
37
+
38
+ # Pass through the linear layer
39
+ out = self.linear(normed_bert_out)
40
+
41
+ return out
42
+
43
+
44
+ weights_path = "models/clf_rewievs_bert.pt"
45
+
46
+ model = MyTinyBERT()
47
+ model.load_state_dict(torch.load(weights_path, map_location=torch.device('cpu')))
48
+ model.to('cpu')
49
+ # tokenizer = transformers.AutoTokenizer.from_pretrained("cointegrated/rubert-tiny2")
50
+
51
+
52
+ # bert_model = transformers.AutoModel.from_pretrained("cointegrated/rubert-tiny2")
53
+ # weights_path = "./model_weights.pt" # Replace with your .pt file path
54
+ # bert_model.load_state_dict(torch.load('models/clf_rewievs_bert.pt', map_location=torch.device('cpu')))
55
+
56
+ # bert_model.to('cpu')
57
+
58
+ morph = pymorphy3.MorphAnalyzer()
59
+
60
+ def lemmatize(text):
61
+ words = text.split()
62
+ lem_words = [morph.parse(word)[0].normal_form for word in words]
63
+ return " ".join(lem_words)
64
+
65
+
66
+
67
+
68
+ logreg = joblib.load('models/logregmodel_restaurants.pkl')
69
+ vectorizer = joblib.load('models/tfidf_vectorizer_restaurants.pkl')
70
+
71
+ with open(
72
+ "funcs/stopwords-ru.txt", "r", encoding="utf-8"
73
+ ) as file:
74
+ stop_words = set(file.read().split())
75
+
76
+
77
+ rating_dict = {
78
+ 1: "Отвратительно",
79
+ 2: "Плохо",
80
+ 3: "Удовлетворительно",
81
+ 4: "Хорошо",
82
+ 5: "Великолепно",}
83
+
84
+
85
+ emoji_pattern = re.compile(
86
+ "["
87
+ "\U0001F600-\U0001F64F" # Emoticons
88
+ "\U0001F300-\U0001F5FF" # Symbols & Pictographs
89
+ "\U0001F680-\U0001F6FF" # Transport & Map Symbols
90
+ "\U0001F1E0-\U0001F1FF" # Flags (iOS)
91
+ "\U00002700-\U000027BF" # Dingbats
92
+ "\U0001F900-\U0001F9FF" # Supplemental Symbols and Pictographs
93
+ "\U00002600-\U000026FF" # Miscellaneous Symbols
94
+ "\U00002B50-\U00002B55" # Miscellaneous Symbols and Pictographs
95
+ "\U0001FA70-\U0001FAFF" # Symbols and Pictographs Extended-A
96
+ "\U0001F700-\U0001F77F" # Alchemical Symbols
97
+ "\U0001F780-\U0001F7FF" # Geometric Shapes Extended
98
+ "\U0001F800-\U0001F8FF" # Supplemental Arrows-C
99
+ "\U0001F900-\U0001F9FF" # Supplemental Symbols and Pictographs
100
+ "\U0001FA00-\U0001FA6F" # Chess Symbols
101
+ "]+",
102
+ flags=re.UNICODE,
103
+ )
104
+
105
+ def clean(text, stopwords):
106
+ text = text.lower() # нижний регистр
107
+ text = re.sub(r"http\S+", " ", text) # удаляем ссылки
108
+ text = re.sub(r"@\w+", " ", text) # удаляем упоминания пользователей
109
+ text = re.sub(r"#\w+", " ", text) # удаляем хэштеги
110
+ text = re.sub(r"\d+", " ", text) # удаляем числа
111
+ text = text.translate(str.maketrans("", "", string.punctuation))
112
+ text = re.sub(r"<.*?>", " ", text) #
113
+ text = re.sub(r"[️«»—]", " ", text)
114
+ text = re.sub(r"[^а-яё ]", " ", text)
115
+ text = text.lower()
116
+ text = emoji_pattern.sub(r"", text)
117
+ text = " ".join([word for word in text.split() if word not in stopwords])
118
+ return text
119
+
120
+
121
+ def predict_review(review):
122
+ start_time = time.time()
123
+
124
+ # Очистка и лемматизация текста
125
+ clean_text = clean(review, stop_words)
126
+ lem_text = lemmatize(clean_text)
127
+
128
+ # Преобразование текста в TF-IDF представление
129
+ X_new = vectorizer.transform([lem_text])
130
+
131
+ # Предсказание
132
+ prediction = logreg.predict(X_new)[0]
133
+
134
+ # Проверка допустимости предсказания
135
+ if prediction not in rating_dict:
136
+ rating = "Ошибка предсказания"
137
+ else:
138
+ rating = rating_dict[prediction]
139
+
140
+ # Измерение времени
141
+ end_time = time.time()
142
+ elapsed_time = end_time - start_time
143
+
144
+ print(f"Лейбл: {prediction}")
145
+ print(f"Оценка отзыва: {rating}")
146
+ print(f"Затраченное время: {elapsed_time:.6f} seconds")
147
+ return prediction, rating, elapsed_time
148
+
149
+
150
+ def preprocess_input(text):
151
+ inputs = tokenizer(text, return_tensors='pt', max_length=512, truncation=True, padding=True)
152
+ return inputs
153
+
154
+
155
+ def predict_bert(text):
156
+ start_time = time.time()
157
+
158
+ model.eval()
159
+ inputs = preprocess_input(text)
160
+
161
+ # Move tensors to the correct device if using GPU
162
+ inputs = {k: v.to('cpu') for k, v in inputs.items()}
163
+
164
+ # Get model predictions
165
+ with torch.no_grad():
166
+ outputs = model(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'])
167
+
168
+ # Since the output is already logits, no need to access outputs.logits
169
+ predicted_class = outputs.argmax(dim=-1).item()
170
+ end_time = time.time()
171
+ elapsed_time = end_time - start_time
172
+
173
+ return predicted_class, rating_dict[predicted_class], elapsed_time
funcs/sasha_funcs.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from transformers import AutoTokenizer, AutoModel
3
+ import numpy as np
4
+ import re
5
+ import string
6
+ import time
7
+
8
+ emoji_pattern = re.compile(
9
+ "["
10
+ "\U0001F600-\U0001F64F" # Emoticons
11
+ "\U0001F300-\U0001F5FF" # Symbols & Pictographs
12
+ "\U0001F680-\U0001F6FF" # Transport & Map Symbols
13
+ "\U0001F1E0-\U0001F1FF" # Flags (iOS)
14
+ "\U00002700-\U000027BF" # Dingbats
15
+ "\U0001F900-\U0001F9FF" # Supplemental Symbols and Pictographs
16
+ "\U00002600-\U000026FF" # Miscellaneous Symbols
17
+ "\U00002B50-\U00002B55" # Miscellaneous Symbols and Pictographs
18
+ "\U0001FA70-\U0001FAFF" # Symbols and Pictographs Extended-A
19
+ "\U0001F700-\U0001F77F" # Alchemical Symbols
20
+ "\U0001F780-\U0001F7FF" # Geometric Shapes Extended
21
+ "\U0001F800-\U0001F8FF" # Supplemental Arrows-C
22
+ "\U0001F900-\U0001F9FF" # Supplemental Symbols and Pictographs
23
+ "\U0001FA00-\U0001FA6F" # Chess Symbols
24
+ "]+",
25
+ flags=re.UNICODE,
26
+ )
27
+
28
+
29
+ def clean(text):
30
+ text = text.lower() # нижний регистр
31
+ text = re.sub(r"http\S+", " ", text) # удаляем ссылки
32
+ text = re.sub(r"@\w+", " ", text) # удаляем упоминания пользователей
33
+ text = re.sub(r"#\w+", " ", text) # удаляем хэштеги
34
+ text = re.sub(r"\d+", " ", text) # удаляем числа
35
+ text = text.translate(str.maketrans("", "", string.punctuation))
36
+ text = re.sub(r"<.*?>", " ", text) #
37
+ text = re.sub(r"[️«»—]", " ", text)
38
+ text = re.sub(r"[^а-яё ]", " ", text)
39
+ text = text.lower()
40
+ text = emoji_pattern.sub(r"", text)
41
+ return text
42
+
43
+ def predict_class(text,model_to_embed, model_to_predict, tokenizer):
44
+ start_time = time.time()
45
+ text = clean(text)
46
+ class_list = ['Крипта', 'Мода', 'Спорт', 'Технологии', 'Финансы']
47
+ encoded_input = tokenizer(text, max_length=64, truncation=True, padding='max_length', return_tensors='pt')
48
+ encoded_input = {k: v.to(model_to_embed.device) for k, v in encoded_input.items()}
49
+
50
+ with torch.no_grad():
51
+ model_output = model_to_embed(**encoded_input)
52
+
53
+ embeddings = model_output.last_hidden_state[:, 0, :]
54
+
55
+ embeddings = torch.nn.functional.normalize(embeddings)
56
+
57
+ embeddings_np = embeddings.cpu().numpy()
58
+
59
+ pred_class = model_to_predict.predict(embeddings_np)
60
+
61
+ pred_proba = model_to_predict.predict_proba(embeddings_np)
62
+ confidence = np.max(pred_proba)
63
+ end_time = time.time()
64
+ elapsed_time = end_time - start_time
65
+
66
+ return f'Predicted class: {class_list[pred_class[0]]}, Confidence: {confidence:.4f}, Time: {round(elapsed_time, 4)}c'
funcs/stopwords-ru.txt ADDED
@@ -0,0 +1,559 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ c
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
+ две
112
+ двенадцатый
113
+ двенадцать
114
+ дверь
115
+ двух
116
+ девятнадцатый
117
+ девятнадцать
118
+ девятый
119
+ девять
120
+ действительно
121
+ дел
122
+ делал
123
+ делать
124
+ делаю
125
+ дело
126
+ день
127
+ деньги
128
+ десятый
129
+ десять
130
+ для
131
+ до
132
+ довольно
133
+ долго
134
+ должен
135
+ должно
136
+ должный
137
+ дом
138
+ дорога
139
+ друг
140
+ другая
141
+ другие
142
+ других
143
+ друго
144
+ другое
145
+ другой
146
+ думать
147
+ душа
148
+ е
149
+ его
150
+ ее
151
+ ей
152
+ ему
153
+ если
154
+ есть
155
+ еще
156
+ ещё
157
+ ею
158
+ её
159
+ ж
160
+ ждать
161
+ же
162
+ жена
163
+ женщина
164
+ жизнь
165
+ жить
166
+ за
167
+ занят
168
+ занята
169
+ занято
170
+ заняты
171
+ затем
172
+ зато
173
+ зачем
174
+ здесь
175
+ земля
176
+ знать
177
+ значит
178
+ значить
179
+ и
180
+ иди
181
+ идти
182
+ из
183
+ или
184
+ им
185
+ имеет
186
+ имел
187
+ именно
188
+ иметь
189
+ ими
190
+ имя
191
+ иногда
192
+ их
193
+ к
194
+ каждая
195
+ каждое
196
+ каждые
197
+ каждый
198
+ кажется
199
+ казаться
200
+ как
201
+ какая
202
+ какой
203
+ кем
204
+ книга
205
+ когда
206
+ кого
207
+ ком
208
+ комната
209
+ кому
210
+ конец
211
+ конечно
212
+ которая
213
+ которого
214
+ которой
215
+ которые
216
+ который
217
+ которых
218
+ кроме
219
+ кругом
220
+ кто
221
+ куда
222
+ лежать
223
+ лет
224
+ ли
225
+ лицо
226
+ лишь
227
+ лучше
228
+ любить
229
+ люди
230
+ м
231
+ маленький
232
+ мало
233
+ мать
234
+ машина
235
+ между
236
+ меля
237
+ менее
238
+ меньше
239
+ меня
240
+ место
241
+ миллионов
242
+ мимо
243
+ минута
244
+ мир
245
+ мира
246
+ мне
247
+ много
248
+ многочисленная
249
+ многочисленное
250
+ многочисленные
251
+ многочисленный
252
+ мной
253
+ мною
254
+ мог
255
+ могу
256
+ могут
257
+ мож
258
+ может
259
+ может быть
260
+ можно
261
+ можхо
262
+ мои
263
+ мой
264
+ мор
265
+ москва
266
+ мочь
267
+ моя
268
+ моё
269
+ мы
270
+ на
271
+ наверху
272
+ над
273
+ надо
274
+ назад
275
+ наиболее
276
+ найти
277
+ наконец
278
+ нам
279
+ нами
280
+ народ
281
+ нас
282
+ начала
283
+ начать
284
+ наш
285
+ наша
286
+ наше
287
+ наши
288
+ не
289
+ него
290
+ недавно
291
+ недалеко
292
+ нее
293
+ ней
294
+ некоторый
295
+ нельзя
296
+ нем
297
+ немного
298
+ нему
299
+ непрерывно
300
+ нередко
301
+ несколько
302
+ нет
303
+ нею
304
+ неё
305
+ ни
306
+ нибудь
307
+ ниже
308
+ низко
309
+ никакой
310
+ никогда
311
+ никто
312
+ никуда
313
+ ним
314
+ ними
315
+ них
316
+ ничего
317
+ ничто
318
+ но
319
+ новый
320
+ нога
321
+ ночь
322
+ ну
323
+ нужно
324
+ нужный
325
+ нх
326
+ о
327
+ об
328
+ оба
329
+ обычно
330
+ один
331
+ одиннадцатый
332
+ одиннадцать
333
+ однажды
334
+ однако
335
+ одного
336
+ одной
337
+ оказаться
338
+ окно
339
+ около
340
+ он
341
+ она
342
+ они
343
+ оно
344
+ опять
345
+ особенно
346
+ остаться
347
+ от
348
+ ответить
349
+ отец
350
+ откуда
351
+ отовсюду
352
+ отсюда
353
+ очень
354
+ первый
355
+ перед
356
+ писать
357
+ плечо
358
+ по
359
+ под
360
+ подойди
361
+ подумать
362
+ пожалуйста
363
+ позже
364
+ пойти
365
+ пока
366
+ пол
367
+ получить
368
+ помнить
369
+ понимать
370
+ понять
371
+ пор
372
+ пора
373
+ после
374
+ последний
375
+ посмотреть
376
+ посреди
377
+ потом
378
+ потому
379
+ почему
380
+ почти
381
+ правда
382
+ прекрасно
383
+ при
384
+ про
385
+ просто
386
+ против
387
+ процентов
388
+ путь
389
+ пятнадцатый
390
+ пятнадцать
391
+ пятый
392
+ пять
393
+ работа
394
+ работать
395
+ раз
396
+ разве
397
+ рано
398
+ раньше
399
+ ребенок
400
+ решить
401
+ россия
402
+ рука
403
+ русский
404
+ ряд
405
+ рядом
406
+ с
407
+ с кем
408
+ сам
409
+ сама
410
+ сами
411
+ самим
412
+ самими
413
+ самих
414
+ само
415
+ самого
416
+ самой
417
+ самом
418
+ самому
419
+ саму
420
+ самый
421
+ свет
422
+ свое
423
+ своего
424
+ своей
425
+ свои
426
+ своих
427
+ свой
428
+ свою
429
+ сделать
430
+ сеаой
431
+ себе
432
+ себя
433
+ сегодня
434
+ седьмой
435
+ сейчас
436
+ семнадцатый
437
+ семнадцать
438
+ семь
439
+ сидеть
440
+ сила
441
+ сих
442
+ сказал
443
+ сказала
444
+ сказать
445
+ сколько
446
+ слишком
447
+ слово
448
+ случай
449
+ смотреть
450
+ сначала
451
+ снова
452
+ со
453
+ собой
454
+ собою
455
+ советский
456
+ совсем
457
+ спасибо
458
+ спросить
459
+ сразу
460
+ стал
461
+ старый
462
+ стать
463
+ стол
464
+ сторона
465
+ стоять
466
+ страна
467
+ суть
468
+ считать
469
+ т
470
+ та
471
+ так
472
+ такая
473
+ также
474
+ таки
475
+ такие
476
+ такое
477
+ такой
478
+ там
479
+ твои
480
+ твой
481
+ твоя
482
+ твоё
483
+ те
484
+ тебе
485
+ тебя
486
+ тем
487
+ теми
488
+ теперь
489
+ тех
490
+ то
491
+ тобой
492
+ тобою
493
+ товарищ
494
+ тогда
495
+ того
496
+ тоже
497
+ только
498
+ том
499
+ тому
500
+ тот
501
+ тою
502
+ третий
503
+ три
504
+ тринадцатый
505
+ тринадцать
506
+ ту
507
+ туда
508
+ тут
509
+ ты
510
+ тысяч
511
+ у
512
+ увидеть
513
+ уж
514
+ уже
515
+ улица
516
+ уметь
517
+ утро
518
+ хороший
519
+ хорошо
520
+ хотел бы
521
+ хотеть
522
+ хоть
523
+ хотя
524
+ хочешь
525
+ час
526
+ часто
527
+ часть
528
+ чаще
529
+ чего
530
+ человек
531
+ чем
532
+ чему
533
+ через
534
+ четвертый
535
+ четыре
536
+ четырнадцатый
537
+ четырнадцать
538
+ что
539
+ чтоб
540
+ чтобы
541
+ чуть
542
+ шестнадцатый
543
+ шестнадцать
544
+ шестой
545
+ шесть
546
+ эта
547
+ эти
548
+ этим
549
+ этими
550
+ этих
551
+ это
552
+ этого
553
+ этой
554
+ этом
555
+ этому
556
+ этот
557
+ эту
558
+ я
559
+ являюсь
images/logo.jpg ADDED
images/scatter_of_tg_channels.png ADDED
models/clf_rewievs_bert.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:25fa1b959aaf1db00859f5e7d810f5695ccf591e4c740bb331801082fdf817f8
3
+ size 117124895
models/logistic_regression_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5e9beac70aa912c76375182e7691c75101fbbdc66193aa01112f6bfcceebefd2
3
+ size 31647
models/logregmodel_restaurants.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:56b514b2a4a51ed3da58fa4e3a2ad63ed7d1bdc8df43d26a7e3a032097e98117
3
+ size 945743
models/tfidf_vectorizer_restaurants.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2b42710530abefbd8dcc2f6b13c368fd655b2b468e12fe6149a105ec16a087fb
3
+ size 10682830
notebooks/Classification_tg_content.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
pages/generator.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import torch
3
+ from transformers import GPT2LMHeadModel, GPT2Tokenizer
4
+ import textwrap
5
+
6
+ st.title('GPT2 trained on tg chat')
7
+
8
+ model_directory = 'finetuned/' # Directory where the model is located
9
+ model = GPT2LMHeadModel.from_pretrained(model_directory, use_safetensors=True)
10
+ tokenizer = GPT2Tokenizer.from_pretrained('sberbank-ai/rugpt3small_based_on_gpt2')
11
+
12
+ def predict(text, max_len=100, num_beams=10, temperature=1.5, top_p=0.7):
13
+ with torch.inference_mode():
14
+ prompt = text
15
+ prompt = tokenizer.encode(prompt, return_tensors='pt')
16
+ out = model.generate(
17
+ input_ids=prompt,
18
+ max_length=max_len,
19
+ num_beams=num_beams,
20
+ do_sample=True,
21
+ temperature=temperature,
22
+ top_p=top_p,
23
+ no_repeat_ngram_size=1,
24
+ num_return_sequences=1,
25
+ ).cpu().numpy()
26
+
27
+ return textwrap.fill(tokenizer.decode(out[0]))
28
+
29
+
30
+
31
+ prompt = st.text_input("Твоя фраза")
32
+ col = st.columns(4)
33
+ with col[0]:
34
+ max_len = st.slider("Text len", 20, 200, 100)
35
+ with col[1]:
36
+ num_beams = st.slider("Beams", 0.1, 1., 0.5)
37
+ with col[2]:
38
+ temperature = st.slider("Temperature", 0.1, 0.9, 0.35)
39
+ with col[3]:
40
+ top_p = st.slider("Top-p", 0.1, 1.0, 0.7)
41
+
42
+ submit = st.button('Сгенерировать ответ')
43
+
44
+ if submit:
45
+ if prompt:
46
+ pred = predict(prompt, max_len=max_len, num_beams=int(num_beams * 20), temperature=(1-temperature) * 5, top_p=top_p)
47
+ st.write(pred)
pages/restaurants_rewiew.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from funcs.nastya_funcs import predict_review, predict_bert
3
+ st.title('Restaurant reviews classifier')
4
+
5
+
6
+ text = st.text_input("Text to classify")
7
+
8
+ if text:
9
+ label, rating, time = predict_review(text)
10
+ col = st.columns(2)
11
+ col[0].write('Model: Tf-Idf + LogReg')
12
+ col[0].write(f"Отзыв: {rating}({label})")
13
+ col[0].write(f"Затраченное время: {time:.6f}с")
14
+
15
+ cls_name, name, time1 = predict_bert(text)
16
+ col[1].write('Model: Bert')
17
+ col[1].write(f"Отзыв: {name}({cls_name})")
18
+ col[1].write(f"Затраченное время: {time1:.6f}с")
19
+
pages/tg_channels_clf.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import joblib
3
+ from transformers import AutoTokenizer, AutoModel
4
+ from funcs.sasha_funcs import predict_class
5
+ st.title('TG channels classifier')
6
+ st.subheader('Model: Bert + LogReg')
7
+
8
+ model_clf = joblib.load('models/logistic_regression_model.pkl')
9
+ tokenizer = AutoTokenizer.from_pretrained("DeepPavlov/rubert-base-cased")
10
+ model_bert = AutoModel.from_pretrained("DeepPavlov/rubert-base-cased")
11
+
12
+
13
+ text = st.text_input("Text to classify")
14
+
15
+ if text:
16
+ st.write(predict_class(text, model_bert, model_clf, tokenizer))
17
+
18
+ button = st.button('Show 2 components with Umap Decomposition')
19
+
20
+ if button:
21
+ st.image('images/scatter_of_tg_channels.png', width=500)
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ streamlit
2
+ Pillow
3
+ torch==2.4.0
4
+ transformers==4.44.0
5
+ torchvision
6
+ matplotlib
7
+ transformers
8
+ joblib
9
+ pymorphy3