Shchushch commited on
Commit
0dc87bc
1 Parent(s): cce9310
Files changed (2) hide show
  1. find.py +179 -0
  2. russian.txt +422 -0
find.py ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import pandas as pd
3
+ from transformers import AutoTokenizer, AutoModel,BertTokenizer,BertModel
4
+ import numpy as np
5
+ import pickle
6
+ # import sklearn
7
+ from nltk.stem import WordNetLemmatizer
8
+ from nltk.tag import pos_tag
9
+ from nltk.corpus import stopwords
10
+ from pymystem3 import Mystem
11
+ from functools import lru_cache
12
+ import string
13
+ import faiss
14
+ from tqdm import tqdm
15
+ tokenizer = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny2")
16
+ model = AutoModel.from_pretrained("cointegrated/rubert-tiny2")
17
+ eng_stop_words = stopwords.words('english')
18
+ with open('russian.txt', 'r') as f:
19
+ ru_stop_words = f.read()
20
+ ru_stop_words=ru_stop_words.split('\n')
21
+ allow="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789-' \n\t"
22
+ #Задаём стеммер
23
+ m= Mystem()
24
+ def embed_bert_cls(text, model=model, tokenizer=tokenizer)->np.array:
25
+ """
26
+ Встраивает входной текст с использованием модели на основе BERT.
27
+
28
+ Аргументы:
29
+ text (str): Входной текст для встраивания.
30
+ model (torch.nn.Module): Модель на основе BERT для использования при встраивании.
31
+ tokenizer (transformers.PreTrainedTokenizer): Токенизатор для токенизации текста.
32
+
33
+ Возвращает:
34
+ numpy.ndarray: Встроенное представление входного текста.
35
+ """
36
+ # Токенизируем текст и преобразуем его в PyTorch тензоры
37
+ t = tokenizer(text, padding=True, truncation=True, return_tensors='pt')
38
+
39
+ # Отключаем вычисление градиентов
40
+ with torch.no_grad():
41
+ # Пропускаем тензоры через модель
42
+ model_output = model(**{k: v.to(model.device) for k, v in t.items()})
43
+
44
+ # Извлекаем последний скрытый состояние из выходных данных модели
45
+ embeddings = model_output.last_hidden_state[:, 0, :]
46
+
47
+ # Нормализуем встроенные представления
48
+ embeddings = torch.nn.functional.normalize(embeddings)
49
+ embeddings=embeddings[0].cpu().numpy()
50
+
51
+ # Преобразуем встроенные представления в массив numpy и возвращаем первый элемент
52
+ return embeddings
53
+
54
+ def lems_eng(text):
55
+ if type(text)==type('text'):
56
+ text=text.split()
57
+ wnl= WordNetLemmatizer()
58
+ lemmatized= []
59
+ pos_map = {
60
+ 'NN': 'n', # существительное
61
+ 'NNS': 'n', # существительное (множественное число)
62
+ 'NNP': 'n', # собственное имя (единственное число)
63
+ 'NNPS': 'n', # собственное имя (множественное число)
64
+ 'VB': 'v', # глагол (инфинитив)
65
+ 'VBD': 'v', # глагол (прошедшее время)
66
+ 'VBG': 'v', # глагол (настоящее причастие/герундий)
67
+ 'VBN': 'v', # глагол (прошедшее причастие)
68
+ 'JJ': 'a', # прилагательное
69
+ 'JJR': 'a', # прилагательное (сравнительная степень)
70
+ 'JJS': 'a', # прилагательное (превосходная степень)
71
+ 'RB': 'r', # наречие
72
+ 'RBR': 'r', # наречие (сравнительная степень)
73
+ 'RBS': 'r', # наречие (превосходная степень)
74
+ 'PRP': 'n', # личное местоимение
75
+ 'PRP$': 'n', # притяжательное местоимение
76
+ 'DT': 'n' # определитель
77
+ }
78
+ pos_tags = pos_tag(text)
79
+ lemmas = []
80
+ for token, pos in pos_tags:
81
+ pos = pos_map.get(pos,'n')
82
+ lemma = wnl.lemmatize(token, pos=pos)
83
+ lemmas.append(lemma)
84
+ return ' '.join(lemmas)
85
+
86
+ def lems_rus(texts):
87
+ if type(texts)==type([]):
88
+ texts=' '.join(texts)
89
+ #lemmatized =[]
90
+ lemmas = m.lemmatize(texts)
91
+ return ''.join(lemmas)
92
+ def clean(text: str)-> str:
93
+
94
+
95
+ text = ''.join(c for c in text if c in allow)
96
+ text= text.split()
97
+ text = [word for word in text if word.lower() not in ru_stop_words]
98
+ text = [word for word in text if word.lower() not in eng_stop_words]
99
+ return ' '.join(text)
100
+
101
+
102
+ def improved_lemmatizer(texts,batch_size=1000):
103
+ if type(texts)==type('text'):
104
+ texts=texts.split()
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+ #Читаем датасет книжек
113
+ df=pd.read_csv('final+lem.csv',index_col=0).reset_index(drop=True)
114
+
115
+ # embs=[]
116
+ # for i in tqdm(df.index):
117
+ # embs.append(embed_bert_cls(df['annotation'][i]))
118
+
119
+ # with open('embs.pickle', 'wb') as f:
120
+ # pickle.dump(embs, f)
121
+
122
+
123
+
124
+ #Читаем эмбединги
125
+ with open('embs.pickle', 'rb') as f:
126
+ embs = pickle.load(f)
127
+ #df['']
128
+ embs =np.array(embs)
129
+ print('Тип выхода:',type(embs),'Размер выхода: ',embs.shape)
130
+
131
+ #Читаем стоп-слова
132
+
133
+ index=faiss.IndexFlatL2(embs.shape[1])
134
+ index.add(embs)
135
+ @lru_cache()
136
+ def find_similar(text, k=10):
137
+ """
138
+ Находит похожие тексты на основе косинусного сходства.
139
+
140
+ Аргументы:
141
+ text (str): Входной текст для поиска похожих текстов.
142
+ embeddings (numpy.ndarray): Предварительно вычисленные встроенные представления текстов.
143
+ threshold (float): Порог, выше которого тексты считаются похожими.
144
+
145
+ Возвращает:
146
+ numpy.ndarray: Сходства между входным текстом и каждым текстом во встроенных представлениях.
147
+ """
148
+
149
+ # Встраиваем входной текст
150
+ text_emb = embed_bert_cls(text)
151
+ print('Текстовые эмбединги\t',text_emb )
152
+ text_emb = np.expand_dims(text_emb, axis=0)
153
+ print(f'Тип поискового запроса: {type(text_emb)}\nРазмер полученного запроса: {text_emb.shape}')#\nСам запрос:\n{text_emb}\n')
154
+ dist,idx=index.search(text_emb,k)
155
+
156
+ return dist.squeeze(),idx.squeeze()#,idx
157
+ #@lru_cache()
158
+ # def find_unsimilar(text,n=10, d=embs.shape[0]):
159
+ # """
160
+ # Находит похожие тексты на основе косинусного сходства.
161
+
162
+ # Аргументы:
163
+ # text (str): Входной текст для поиска похожих текстов.
164
+ # embeddings (numpy.ndarray): Предварительно вычисленные встроенные представления текстов.
165
+ # threshold (float): Порог, выше которого тексты считаются похожими.
166
+
167
+ # Возвращает:
168
+ # numpy.ndarray: Сходства между входным текстом и каждым текстом во встроенных представлениях.
169
+ # """
170
+
171
+ # # Встраиваем входной текст
172
+ # text_emb = embed_bert_cls(text)
173
+ # text_emb = np.expand_dims(text_emb, axis=0)
174
+ # print(f'Тип поискового запроса: {type(text_emb)}\nРазмер полученного запроса: {text_emb.shape}')#\nСам запрос:\n{text_emb}\n')
175
+ # dist,idx=index.search(text_emb,d)
176
+ # dist=dist.flatten()[::-1]
177
+ # idx=idx.flatten()[::-1]
178
+
179
+ # return dist[:n],idx[:n]#,idx
russian.txt ADDED
@@ -0,0 +1,422 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ оно
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
+ многочисленный