Shchushch commited on
Commit
6851338
·
1 Parent(s): 7576ded

Upload 10 files

Browse files
Files changed (9) hide show
  1. .gitattributes +2 -0
  2. app.py +60 -36
  3. embs+lem.pickle +3 -0
  4. final+lem.csv +3 -0
  5. find.py +127 -22
  6. log.log +0 -0
  7. packages.txt +211 -0
  8. parsing.ipynb +3 -0
  9. russian.txt +422 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ final+lem.csv filter=lfs diff=lfs merge=lfs -text
37
+ parsing.ipynb filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -2,55 +2,79 @@ import streamlit as st
2
  import pandas as pd
3
  import random as rd
4
  import webbrowser as wb
5
- from find import find_similar,df
 
 
6
  st.set_page_config(
7
  page_title="Умный поиск книг",
8
- page_icon="path/to/favicon.ico",
9
  layout="wide",
10
- initial_sidebar_state="expanded"
11
  )
12
-
13
- df
 
 
 
14
  st.title('Умный поиск книг')
15
- form = st.form(key='search_form')
16
- input=form.text_input('Введите поисковый запрос')
 
 
17
 
18
- # if 'clicked' not in st.session_state:
19
- # st.session_state.clicked = False
20
- #df= pd.read_csv('books_booksle.csv')
21
 
22
- items_per_page=form.number_input('Количество книг на странице',min_value=1,max_value=10,value=5)
23
- search_but=form.form_submit_button('Искать')
24
 
 
25
 
 
26
  # if search_but:
27
  # st.session_state.clicked = True
28
-
29
- @st.cache_data(experimental_allow_widgets=True)
30
- def books_show(books,sims):
31
  col=[]
32
- for i in range(len(books)):
33
- col.append(st.columns([0.2,0.8]))
 
 
 
 
 
 
 
 
 
34
  '---'
35
 
36
- url=books.iloc[i,0]#'page_url'][i]
37
- col[i][0].image(books['image_url'][i],width=200)
38
- col[i][0].markdown('<a href={url} target="_blank">Ссылка на книгу</a>', unsafe_allow_html=True)
39
- col[i][0].markdown(f'**Степень похожести:** {books["sims"][i]:.4f}')
 
 
40
  #col[i][0].button('Купить',key=books['page_url'][i],on_click=lambda: wb.open_new_tab(books['page_url'][i]))
41
- col[i][1].markdown('## '+ f"{books['title'][i]}")
42
- col[i][1].markdown('**Автор:** ' +books['author'][i])
43
- col[i][1].markdown('**Аннотация:** ' +books['annotation'][i])
 
 
 
44
  if search_but:
45
- sims,books_idx=find_similar(input)
46
- #sims
47
- books=df.copy()
48
- books['sims']=sims
49
- books=books.iloc[books_idx].iloc[:items_per_page]
50
- #books=books.iloc[:items_per_page]
51
- #books=df.iloc[books_idx]
52
- #[:items_per_page]
53
- #sims
54
- books
55
- #books['sims'][0]
56
- books_show(books,sims)
 
 
 
 
 
2
  import pandas as pd
3
  import random as rd
4
  import webbrowser as wb
5
+ import numpy as np
6
+ from find import find_similar,df,lems_eng,lems_rus,clean,find_unsimilar
7
+
8
  st.set_page_config(
9
  page_title="Умный поиск книг",
10
+ page_icon="📖",
11
  layout="wide",
12
+ #initial_sidebar_state="expanded"
13
  )
14
+ with st.expander('Исходный датафрейм'):
15
+ if st.checkbox('С лемматизацией'):
16
+ df
17
+ else:
18
+ df.iloc[:,:-1]
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
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"]:.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
+ cleaned_input=clean(lems_eng(lems_rus(input[:neg_mark])))
67
+ cleaned_neg=clean(lems_eng(lems_rus(input[neg_mark+2:])))
68
+ #print(cleaned_neg.split(),df.loc[15390,'lemmatized'].split())
69
+ with st.spinner('Wait for it...'):
70
+ if neg_mark!=-1:
71
+ st.markdown(f'**Лемматизированный запрос:** {cleaned_input} \n\n **Лемматизированый негативный запрос:** {cleaned_neg}')
72
+ sims,books_idx=find_similar(cleaned_input,50)
73
+ for book in books_idx:
74
+ if any(word in cleaned_neg.split() for word in df.loc[book,'lemmatized'].split()):
75
+ books_idx=np.delete(books_idx,np.where(books_idx==book))
76
+ else:
77
+ st.markdown(f'**Лемматизированный запрос:** {cleaned_input}')
78
+ sims,books_idx=find_similar(cleaned_input)
79
+ print(f'Похожести:\n{sims}\nИндексы:\n{books_idx}')
80
+ books_show(books_idx,sims)
embs+lem.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:70b09c1da9bf9301fa2190a356e36b3dbe651b98a18d196c5d54e41beb97386f
3
+ size 83429968
final+lem.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e2f5008c8734513ce810bd588277c233402be603535ab4c06a07c23957a28716
3
+ size 170696424
find.py CHANGED
@@ -2,11 +2,26 @@ import torch
2
  import pandas as pd
3
  from transformers import AutoTokenizer, AutoModel
4
  import numpy as np
5
-
 
 
 
 
 
 
 
 
 
6
  tokenizer = AutoTokenizer.from_pretrained("cointegrated/rubert-tiny2")
7
  model = AutoModel.from_pretrained("cointegrated/rubert-tiny2")
8
-
9
- def embed_bert_cls(text, model=model, tokenizer=tokenizer):
 
 
 
 
 
 
10
  """
11
  Встраивает входной текст с использованием модели на основе BERT.
12
 
@@ -36,16 +51,89 @@ def embed_bert_cls(text, model=model, tokenizer=tokenizer):
36
  # Преобразуем встроенные представления в массив numpy и возвращаем первый элемент
37
  return embeddings
38
 
39
- df=pd.read_csv('books_sample.csv',index_col=0)
40
- embs=[]
41
- for annotation in df['annotation']:
42
- # embd=
43
- #print(embd)
44
- embs.append(embed_bert_cls(annotation))
45
- #embs.append(embed_bert_cls(annotation))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  embs =np.array(embs)
 
 
 
47
 
48
- def find_similar(text, embeddings=embs, threshold=0.5):
 
 
 
49
  """
50
  Находит похожие тексты на основе косинусного сходства.
51
 
@@ -57,17 +145,34 @@ def find_similar(text, embeddings=embs, threshold=0.5):
57
  Возвращает:
58
  numpy.ndarray: Сходства между входным текстом и каждым текстом во встроенных представлениях.
59
  """
 
60
  # Встраиваем входной текст
61
- embedding = embed_bert_cls(text)
62
-
63
- # Вычисляем косинусное сходство между встроенным представлением входного текста и всеми встроенными представлениями
64
- similarities = embeddings.dot(embedding)
65
- sorted_indeces=similarities.argsort()[::-1]#[::1]
66
- return similarities,sorted_indeces
67
-
68
-
69
-
70
-
71
- print(find_similar('пук',embeddings=embs))
72
 
 
 
 
 
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import pandas as pd
3
  from transformers import AutoTokenizer, AutoModel
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
 
 
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['lemmatized'][i]))
118
+
119
+ # with open('embs+lem.pickle', 'wb') as f:
120
+ # pickle.dump(embs, f)
121
+
122
+
123
+
124
+ #Читаем эмбединги
125
+ with open('embs+lem.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.IndexFlatIP(embs.shape[1])
134
+ index.add(embs)
135
+ @lru_cache()
136
+ def find_similar(text, k=10):
137
  """
138
  Находит похожие тексты на основе косинусного сходства.
139
 
 
145
  Возвращает:
146
  numpy.ndarray: Сходства между входным текстом и каждым текстом во встроенных представлениях.
147
  """
148
+
149
  # Встраиваем входной текст
150
+ text_emb = embed_bert_cls(text)
151
+ text_emb = np.expand_dims(text_emb, axis=0)
152
+ print(f'Тип поискового запроса: {type(text_emb)}\nРазмер полученного запроса: {text_emb.shape}')#\nСам запрос:\n{text_emb}\n')
153
+ dist,idx=index.search(text_emb,k)
154
+
155
+ return dist.squeeze(),idx.squeeze()#,idx
156
+ @lru_cache()
157
+ def find_unsimilar(text,n=10, d=embs.shape[0]):
158
+ """
159
+ Находит похожие тексты на основе косинусного сходства.
 
160
 
161
+ Аргументы:
162
+ text (str): Входной текст для поиска похожих текстов.
163
+ embeddings (numpy.ndarray): Предварительно вычисленные встроенные представления текстов.
164
+ threshold (float): Порог, выше которого тексты считаются похожими.
165
 
166
+ Возвращает:
167
+ numpy.ndarray: Сходства между входным текстом и каждым текстом во встроенных представлениях.
168
+ """
169
+
170
+ # Встраиваем входной текст
171
+ text_emb = embed_bert_cls(text)
172
+ text_emb = np.expand_dims(text_emb, axis=0)
173
+ print(f'Тип поискового запроса: {type(text_emb)}\nРазмер полученного запроса: {text_emb.shape}')#\nСам запрос:\n{text_emb}\n')
174
+ dist,idx=index.search(text_emb,d)
175
+ dist=dist.flatten()[::-1]
176
+ idx=idx.flatten()[::-1]
177
+
178
+ return dist[:n],idx[:n]#,idx
log.log ADDED
The diff for this file is too large to render. See raw diff
 
packages.txt ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # packages in environment at /Users/evgeniyshchurkin/anaconda3/envs/faiss_env:
2
+ #
3
+ # Name Version Build Channel
4
+ aiohttp 3.8.5 py38hb192615_0 conda-forge
5
+ aiosignal 1.3.1 pyhd8ed1ab_0 conda-forge
6
+ altair 5.0.1 pyhd8ed1ab_1 conda-forge
7
+ appnope 0.1.3 pyhd8ed1ab_0 conda-forge
8
+ asttokens 2.2.1 pyhd8ed1ab_0 conda-forge
9
+ async-timeout 4.0.2 pyhd8ed1ab_0 conda-forge
10
+ attrs 23.1.0 pyh71513ae_1 conda-forge
11
+ aws-c-auth 0.7.0 hf4e22b4_2 conda-forge
12
+ aws-c-cal 0.6.0 h43a37b4_0 conda-forge
13
+ aws-c-common 0.8.23 hb547adb_0 conda-forge
14
+ aws-c-compression 0.2.17 h31a6291_1 conda-forge
15
+ aws-c-event-stream 0.3.1 h1e1aaf7_1 conda-forge
16
+ aws-c-http 0.7.11 h3107daf_0 conda-forge
17
+ aws-c-io 0.13.28 hf096fb3_0 conda-forge
18
+ aws-c-mqtt 0.8.14 h9418dbe_2 conda-forge
19
+ aws-c-s3 0.3.13 h79b0d72_2 conda-forge
20
+ aws-c-sdkutils 0.1.11 h31a6291_1 conda-forge
21
+ aws-checksums 0.1.16 h31a6291_1 conda-forge
22
+ aws-crt-cpp 0.20.3 h0918d87_4 conda-forge
23
+ aws-sdk-cpp 1.10.57 h6f3a27c_17 conda-forge
24
+ backcall 0.2.0 pyh9f0ad1d_0 conda-forge
25
+ backports 1.0 pyhd8ed1ab_3 conda-forge
26
+ backports.functools_lru_cache 1.6.5 pyhd8ed1ab_0 conda-forge
27
+ backports.zoneinfo 0.2.1 py38hb991d35_7 conda-forge
28
+ blinker 1.6.2 pyhd8ed1ab_0 conda-forge
29
+ brotli-python 1.0.9 py38h2b1e499_9 conda-forge
30
+ bzip2 1.0.8 h3422bc3_4 conda-forge
31
+ c-ares 1.19.1 hb547adb_0 conda-forge
32
+ ca-certificates 2023.7.22 hf0a4a13_0 conda-forge
33
+ cachetools 5.3.1 pyhd8ed1ab_0 conda-forge
34
+ certifi 2023.7.22 pyhd8ed1ab_0 conda-forge
35
+ charset-normalizer 3.2.0 pyhd8ed1ab_0 conda-forge
36
+ click 8.1.6 unix_pyh707e725_0 conda-forge
37
+ colorama 0.4.6 pyhd8ed1ab_0 conda-forge
38
+ comm 0.1.3 pyhd8ed1ab_0 conda-forge
39
+ dataclasses 0.8 pyhc8e2a94_3 conda-forge
40
+ datasets 2.13.1 pyhd8ed1ab_0 conda-forge
41
+ debugpy 1.6.7 py38h2b1e499_0 conda-forge
42
+ decorator 5.1.1 pyhd8ed1ab_0 conda-forge
43
+ dill 0.3.6 pyhd8ed1ab_1 conda-forge
44
+ executing 1.2.0 pyhd8ed1ab_0 conda-forge
45
+ faiss-cpu 1.7.4 py3.8_h34215f8_0_cpu pytorch
46
+ filelock 3.12.2 pyhd8ed1ab_0 conda-forge
47
+ freetype 2.12.1 hd633e50_1 conda-forge
48
+ frozenlist 1.4.0 py38hb192615_0 conda-forge
49
+ fsspec 2023.6.0 pyh1a96a4e_0 conda-forge
50
+ gflags 2.2.2 hc88da5d_1004 conda-forge
51
+ gitdb 4.0.10 pyhd8ed1ab_0 conda-forge
52
+ gitpython 3.1.32 pyhd8ed1ab_0 conda-forge
53
+ glog 0.6.0 h6da1cb0_0 conda-forge
54
+ gmp 6.2.1 h9f76cd9_0 conda-forge
55
+ gmpy2 2.1.2 py38h904d018_1 conda-forge
56
+ huggingface_hub 0.16.4 pyhd8ed1ab_0 conda-forge
57
+ idna 3.4 pyhd8ed1ab_0 conda-forge
58
+ importlib-metadata 6.8.0 pyha770c72_0 conda-forge
59
+ importlib_metadata 6.8.0 hd8ed1ab_0 conda-forge
60
+ importlib_resources 6.0.0 pyhd8ed1ab_1 conda-forge
61
+ ipykernel 6.25.0 pyh5fb750a_0 conda-forge
62
+ ipython 8.12.2 pyhd1c38e8_0 conda-forge
63
+ ipywidgets 8.0.7 pyhd8ed1ab_0 conda-forge
64
+ jedi 0.18.2 pyhd8ed1ab_0 conda-forge
65
+ jinja2 3.1.2 pyhd8ed1ab_1 conda-forge
66
+ joblib 1.3.0 pyhd8ed1ab_1 conda-forge
67
+ jsonschema 4.18.4 pyhd8ed1ab_0 conda-forge
68
+ jsonschema-specifications 2023.7.1 pyhd8ed1ab_0 conda-forge
69
+ jupyter_client 8.3.0 pyhd8ed1ab_0 conda-forge
70
+ jupyter_core 5.3.1 py38h10201cd_0 conda-forge
71
+ jupyterlab_widgets 3.0.8 pyhd8ed1ab_0 conda-forge
72
+ krb5 1.21.1 h92f50d5_0 conda-forge
73
+ lcms2 2.15 hd835a16_1 conda-forge
74
+ lerc 4.0.0 h9a09cb3_0 conda-forge
75
+ libabseil 20230125.3 cxx17_h13dd4ca_0 conda-forge
76
+ libarrow 12.0.1 h59b625a_6_cpu conda-forge
77
+ libblas 3.9.0 17_osxarm64_openblas conda-forge
78
+ libbrotlicommon 1.0.9 h1a8c8d9_9 conda-forge
79
+ libbrotlidec 1.0.9 h1a8c8d9_9 conda-forge
80
+ libbrotlienc 1.0.9 h1a8c8d9_9 conda-forge
81
+ libcblas 3.9.0 17_osxarm64_openblas conda-forge
82
+ libcrc32c 1.1.2 hbdafb3b_0 conda-forge
83
+ libcurl 8.2.1 hc52a3a8_0 conda-forge
84
+ libcxx 16.0.6 h4653b0c_0 conda-forge
85
+ libdeflate 1.18 h1a8c8d9_0 conda-forge
86
+ libedit 3.1.20191231 hc8eb9b7_2 conda-forge
87
+ libev 4.33 h642e427_1 conda-forge
88
+ libevent 2.1.12 h2757513_1 conda-forge
89
+ libfaiss 1.7.4 hcb8d3e5_0_cpu pytorch
90
+ libffi 3.4.2 h3422bc3_5 conda-forge
91
+ libgfortran 5.0.0 12_3_0_hd922786_1 conda-forge
92
+ libgfortran5 12.3.0 ha3a6a3e_1 conda-forge
93
+ libgoogle-cloud 2.12.0 he22f4c0_1 conda-forge
94
+ libgrpc 1.54.2 h0a338ca_2 conda-forge
95
+ libjpeg-turbo 2.1.5.1 h1a8c8d9_0 conda-forge
96
+ liblapack 3.9.0 17_osxarm64_openblas conda-forge
97
+ libnghttp2 1.52.0 hae82a92_0 conda-forge
98
+ libopenblas 0.3.23 openmp_hc731615_0 conda-forge
99
+ libpng 1.6.39 h76d750c_0 conda-forge
100
+ libprotobuf 3.21.12 hb5ab8b9_0 conda-forge
101
+ libsodium 1.0.18 h27ca646_1 conda-forge
102
+ libsqlite 3.42.0 hb31c410_0 conda-forge
103
+ libssh2 1.11.0 h7a5bd25_0 conda-forge
104
+ libthrift 0.18.1 ha061701_2 conda-forge
105
+ libtiff 4.5.1 h23a1a89_0 conda-forge
106
+ libutf8proc 2.8.0 h1a8c8d9_0 conda-forge
107
+ libwebp-base 1.3.1 hb547adb_0 conda-forge
108
+ libxcb 1.15 hf346824_0 conda-forge
109
+ libzlib 1.2.13 h53f4e23_5 conda-forge
110
+ llvm-openmp 16.0.6 h1c12783_0 conda-forge
111
+ lz4-c 1.9.4 hb7217d7_0 conda-forge
112
+ markdown-it-py 3.0.0 pyhd8ed1ab_0 conda-forge
113
+ markupsafe 2.1.3 py38hb192615_0 conda-forge
114
+ matplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge
115
+ mdurl 0.1.0 pyhd8ed1ab_0 conda-forge
116
+ mpc 1.3.1 h91ba8db_0 conda-forge
117
+ mpfr 4.2.0 he09a6ba_0 conda-forge
118
+ mpmath 1.3.0 pyhd8ed1ab_0 conda-forge
119
+ multidict 6.0.4 py38hb991d35_0 conda-forge
120
+ multiprocess 0.70.15 py38hb192615_0 conda-forge
121
+ ncurses 6.4 h7ea286d_0 conda-forge
122
+ nest-asyncio 1.5.6 pyhd8ed1ab_0 conda-forge
123
+ networkx 3.1 pyhd8ed1ab_0 conda-forge
124
+ nltk 3.8.1 pyhd8ed1ab_0 conda-forge
125
+ numpy 1.24.4 py38ha84db1f_0 conda-forge
126
+ openjpeg 2.5.0 hbc2ba62_2 conda-forge
127
+ openssl 3.1.1 h53f4e23_1 conda-forge
128
+ orc 1.9.0 ha98e9e8_1 conda-forge
129
+ packaging 23.1 pyhd8ed1ab_0 conda-forge
130
+ pandas 2.0.3 py38hefb543e_1 conda-forge
131
+ parso 0.8.3 pyhd8ed1ab_0 conda-forge
132
+ pexpect 4.8.0 pyh1a96a4e_2 conda-forge
133
+ pickleshare 0.7.5 py_1003 conda-forge
134
+ pillow 9.5.0 py38h3f590de_1 conda-forge
135
+ pip 23.2.1 pyhd8ed1ab_0 conda-forge
136
+ pkgutil-resolve-name 1.3.10 pyhd8ed1ab_0 conda-forge
137
+ platformdirs 3.9.1 pyhd8ed1ab_0 conda-forge
138
+ pooch 1.7.0 pyha770c72_3 conda-forge
139
+ prompt-toolkit 3.0.39 pyha770c72_0 conda-forge
140
+ prompt_toolkit 3.0.39 hd8ed1ab_0 conda-forge
141
+ protobuf 4.21.12 py38h2b1e499_0 conda-forge
142
+ psutil 5.9.5 py38hb991d35_0 conda-forge
143
+ pthread-stubs 0.4 h27ca646_1001 conda-forge
144
+ ptyprocess 0.7.0 pyhd3deb0d_0 conda-forge
145
+ pure_eval 0.2.2 pyhd8ed1ab_0 conda-forge
146
+ pyarrow 12.0.1 py38h5809dd6_6_cpu conda-forge
147
+ pydeck 0.8.0 pyhd8ed1ab_0 conda-forge
148
+ pygments 2.15.1 pyhd8ed1ab_0 conda-forge
149
+ pympler 1.0.1 pyhd8ed1ab_0 conda-forge
150
+ pymystem3 0.2.0 pypi_0 pypi
151
+ pysocks 1.7.1 pyha2e5f31_6 conda-forge
152
+ python 3.8.17 h3ba56d0_0_cpython conda-forge
153
+ python-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge
154
+ python-tzdata 2023.3 pyhd8ed1ab_0 conda-forge
155
+ python-xxhash 3.2.0 py38hb991d35_0 conda-forge
156
+ python_abi 3.8 3_cp38 conda-forge
157
+ pytorch 2.0.0 cpu_py38hb5ed39e_0 conda-forge
158
+ pytz 2023.3 pyhd8ed1ab_0 conda-forge
159
+ pytz-deprecation-shim 0.1.0.post0 py38h10201cd_3 conda-forge
160
+ pyyaml 6.0 py38hb991d35_5 conda-forge
161
+ pyzmq 25.1.0 py38hef91016_0 conda-forge
162
+ re2 2023.03.02 hc5e2d97_0 conda-forge
163
+ readline 8.2 h92ec313_1 conda-forge
164
+ referencing 0.30.0 pyhd8ed1ab_0 conda-forge
165
+ regex 2023.6.3 py38hb192615_0 conda-forge
166
+ requests 2.31.0 pyhd8ed1ab_0 conda-forge
167
+ responses 0.18.0 pyhd8ed1ab_0 conda-forge
168
+ rich 13.4.2 pyhd8ed1ab_0 conda-forge
169
+ rpds-py 0.9.2 py38hd0c8013_0 conda-forge
170
+ sacremoses 0.0.53 pyhd8ed1ab_0 conda-forge
171
+ safetensors 0.3.1 py38hd0c8013_0 conda-forge
172
+ scikit-learn 1.0.2 py38h9197a36_1 anaconda
173
+ scipy 1.10.1 py38h038e806_3 conda-forge
174
+ setuptools 68.0.0 pyhd8ed1ab_0 conda-forge
175
+ six 1.16.0 pyh6c4a22f_0 conda-forge
176
+ sleef 3.5.1 h156473d_2 conda-forge
177
+ smmap 3.0.5 pyh44b312d_0 conda-forge
178
+ snappy 1.1.10 h17c5cce_0 conda-forge
179
+ stack_data 0.6.2 pyhd8ed1ab_0 conda-forge
180
+ streamlit 1.24.1 pyhd8ed1ab_1 conda-forge
181
+ sympy 1.12 pypyh9d50eac_103 conda-forge
182
+ tenacity 8.2.2 pyhd8ed1ab_0 conda-forge
183
+ threadpoolctl 3.2.0 pyha21a80b_0 conda-forge
184
+ tk 8.6.12 he1e0b03_0 conda-forge
185
+ tokenizers 0.13.3 py38hf11c49c_0 conda-forge
186
+ toml 0.10.2 pyhd8ed1ab_0 conda-forge
187
+ toolz 0.12.0 pyhd8ed1ab_0 conda-forge
188
+ tornado 6.3.2 py38hb192615_0 conda-forge
189
+ tqdm 4.65.0 pyhd8ed1ab_1 conda-forge
190
+ traitlets 5.9.0 pyhd8ed1ab_0 conda-forge
191
+ transformers 4.31.0 pyhd8ed1ab_0 conda-forge
192
+ typing-extensions 4.7.1 hd8ed1ab_0 conda-forge
193
+ typing_extensions 4.7.1 pyha770c72_0 conda-forge
194
+ tzdata 2023c h71feb2d_0 conda-forge
195
+ tzlocal 4.3 py38h10201cd_0 conda-forge
196
+ urllib3 2.0.4 pyhd8ed1ab_0 conda-forge
197
+ validators 0.20.0 pyhd8ed1ab_0 conda-forge
198
+ watchdog 3.0.0 py38hb991d35_0 conda-forge
199
+ wcwidth 0.2.6 pyhd8ed1ab_0 conda-forge
200
+ wheel 0.41.0 pyhd8ed1ab_0 conda-forge
201
+ widgetsnbextension 4.0.8 pyhd8ed1ab_0 conda-forge
202
+ xorg-libxau 1.0.11 hb547adb_0 conda-forge
203
+ xorg-libxdmcp 1.1.3 h27ca646_0 conda-forge
204
+ xxhash 0.8.1 h1a8c8d9_0 conda-forge
205
+ xz 5.2.6 h57fd34a_0 conda-forge
206
+ yaml 0.2.5 h3422bc3_2 conda-forge
207
+ yarl 1.9.2 py38hb192615_0 conda-forge
208
+ zeromq 4.3.4 hbdafb3b_1 conda-forge
209
+ zipp 3.16.2 pyhd8ed1ab_0 conda-forge
210
+ zlib 1.2.13 h53f4e23_5 conda-forge
211
+ zstd 1.5.2 h4f39d0f_7 conda-forge
parsing.ipynb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d53ae6965dd14459f5967a0302a3ee24261da328948f373fe2a9fc4cde70b3f7
3
+ size 120076865
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
+ многочисленный