Skip to content

Commit ae8085d

Browse files
committed
merge updates
2 parents 6513835 + b4d160d commit ae8085d

File tree

5 files changed

+413
-45
lines changed

5 files changed

+413
-45
lines changed

README-rus.md

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
# TopicNet
2+
[English version](README.md)
3+
4+
---
5+
### Что такое TopicNet?
6+
Библиотека ```topicnet``` помогает строить тематические модели посредством автоматизации рутинных процессов моделирования.
7+
8+
### Как работать с библиотекой?
9+
Сначала, вы инициализируете объект ```TopicModel``` с помощью имеющейся ARTM модели или конструируете первую модель
10+
при помощи модуля ```model_constructor```.
11+
Полученной моделью нужно проинициализировать экземпляр класса ```Experiment``` ведущий учёт этапов тренировки
12+
и моделей полученных в ходе этих этапов.
13+
Все возможные на данный момент типы этапов тренировки содержатся в ```cooking_machine.cubes``` а просмотреть полученные модели
14+
можно при помощи модуля ```viewers``` имеющего широкий функционал способов выведения информации о модели.
15+
16+
### Кому может быть полезна данная библиотека?
17+
Данный проект будет интересен двум категориям пользователей.
18+
* Во-первых, он будет полезен для тех, кто хочет воспользоваться функционалом предоставляемым библиотекой BigARTM, но не готов
19+
писать дополнительный код для построения пайплайнов тренировки и вывода результатов моделирования.
20+
* Во-вторых этот код будет полезен опытным конструкторам тематических моделей, так как позволяет быстро построить
21+
прототип желаемого решения.
22+
23+
---
24+
## Как установить TopicNet
25+
**Большая часть** функционала TopicNet завязана на библиотеку BigARTM, требующей рученой установки.
26+
Чтобы облегчить этот процесс вы можете воспользоваться [докер образами с предустановленным BigARTM](https://hub.docker.com/r/xtonev/bigartm/tags).
27+
Если по каким-то причинам использование докер образов вам не подходит, то подробное описание установки BigARTM можно найти здесь: [BigARTM installation manual](https://bigartm.readthedocs.io/en/stable/installation/index.html).
28+
В полученный образ с BigARTM форкнуть данный репозиторий или же установить его с помощью команды: ```pip install topicnet```.
29+
30+
---
31+
## Краткая инструкция по работе с TopicNet
32+
Предположим у вас есть куча сырых текстов из какого-то источника и вы хотите навернуть тематическую модельку сверху этого всего.
33+
С чего начать?
34+
35+
### Подготовка данных
36+
Как и в любой другой ML задаче данные должны быть сначала подготовленны. TopicNet оставляет обработку данных на предусмотрение пользователя. Тем не менее для работы с предобработанными данными используется класс [Dataset (нужна документация)]()
37+
Далее средует пример такой предобработки:
38+
```
39+
import nltk
40+
import artm
41+
import string
42+
43+
import pandas as pd
44+
from glob import glob
45+
46+
WIKI_DATA_PATH = '/Wiki_raw_set/raw_plaintexts/'
47+
files = glob(WIKI_DATA_PATH+'*.txt')
48+
```
49+
Загружаем все текстовые данные оставляя только буквы:
50+
```
51+
right_symbols = string.ascii_letters + ' '
52+
data = []
53+
for path in files:
54+
entry = {}
55+
entry['id'] = path.split('/')[-1].split('.')[0]
56+
with open(path,'r') as f:
57+
text = ''.join([char for char in f.read() if char in right_symbols])
58+
entry['raw_text'] = ''.join(text.split('\n')).lower()
59+
data.append(entry)
60+
wiki_texts = pd.DataFrame(data)
61+
```
62+
#### Проведем токенизацию:
63+
```
64+
tokenized_text = []
65+
for text in wiki_texts['raw_text'].values:
66+
tokenized_text.append(' '.join(nltk.word_tokenize(text)))
67+
wiki_texts['tokenized'] = tokenized_text
68+
```
69+
#### Лемматизация:
70+
```
71+
from nltk.stem import WordNetLemmatizer
72+
lemmatized_text = []
73+
wnl = WordNetLemmatizer()
74+
for text in wiki_texts['raw_text'].values:
75+
lemmatized = [wnl.lemmatize(word) for word in text.split()]
76+
lemmatized_text.append(lemmatized)
77+
wiki_texts['lemmatized'] = lemmatized_text
78+
```
79+
#### Найдём биграмы:
80+
```
81+
from nltk.collocations import BigramAssocMeasures, BigramCollocationFinder
82+
83+
bigram_measures = BigramAssocMeasures()
84+
finder = BigramCollocationFinder.from_documents(wiki_texts['lemmatized'])
85+
finder.apply_freq_filter(5)
86+
set_dict = set(finder.nbest(bigram_measures.pmi,32100)[100:])
87+
documents = wiki_texts['lemmatized']
88+
bigrams = []
89+
for doc in documents:
90+
entry = ['_'.join([word_first, word_second])
91+
for word_first, word_second in zip(doc[:-1],doc[1:])
92+
if (word_first, word_second) in set_dict]
93+
bigrams.append(entry)
94+
wiki_texts['bigram'] = bigrams
95+
```
96+
97+
#### Переведём все в формат Vowpal Wabbit и сохраним результаты на диск:
98+
```
99+
vw_text = []
100+
for index, data in wiki_texts.iterrows():
101+
vw_string = ''
102+
doc_id = data.id
103+
lemmatized = '@lemmatized ' + ' '.join(data.lemmatized)
104+
bigram = '@bigram ' + ' '.join(data.bigram)
105+
vw_string = ' |'.join([doc_id, lemmatized, bigram])
106+
vw_text.append(vw_string)
107+
wiki_texts['vw_text'] = vw_text
108+
109+
wiki_texts[['id','raw_text', 'vw_text']].to_csv('/Wiki_raw_set/wiki_data.csv')
110+
```
111+
### Тренировка тематической модели
112+
Теперь можно приступить к самому интеерсному: создание своей собственной, самой лучшей насвете, крафтовой Тематической Модели.
113+
#### Загрузим данные
114+
```
115+
data = Dataset('/Wiki_raw_set/wiki_data.csv')
116+
```
117+
#### Создадим начальную модель
118+
В случае если вы хотите создать свежую артм модель воспользуйтесь следующим кодом:
119+
```
120+
from topicnet.cooking_machine.model_constructor import init_simple_default_model
121+
122+
model_artm = init_simple_default_model(
123+
dataset=demo_data,
124+
modalities_to_use={'@lemmatized': 1.0, '@bigram':0.5},
125+
main_modality='@lemmatized',
126+
n_specific_topics=14,
127+
n_background_topics=1,
128+
)
129+
```
130+
Следует отметить, что мы получаем модель с двумя модальностями: `'@lemmatized'` и `'@bigram'`.
131+
Далее, при необходимости, можно определить свой скор, который будет считаться при тренировки модели:
132+
```
133+
from topicnet.cooking_machine.models.base_score import BaseScore
134+
135+
class ThatCustomScore(BaseScore):
136+
def __init__(self):
137+
super().__init__()
138+
139+
def call(self, model,
140+
eps=1e-5,
141+
n_specific_topics=14):
142+
phi = model.get_phi().values[:,:n_specific_topics]
143+
specific_sparsity = np.sum(phi < eps) / np.sum(phi < 1)
144+
return specific_sparsity
145+
```
146+
Теперь, `TopicModel` с кастомным скором может быть определена следующим образом:
147+
```
148+
from topicnet.cooking_machine.models.topic_model import TopicModel
149+
150+
custom_score_dict = {'SpecificSparsity': ThatCustomScore()}
151+
tm = TopicModel(model_artm, model_id='Groot', custom_scores=custom_score_dict)
152+
```
153+
#### Определить эксперимент
154+
```
155+
from topicnet.cooking_machine.experiment import Experiment
156+
experiment = Experiment(experiment_id="simple_experiment", save_path="experiments", topic_model=tm)
157+
```
158+
#### Взять кубики
159+
Определим этап тренировки модели и применим его к имеющейся модели:
160+
```
161+
from topicnet.cooking_machine.cubes import RegularizersModifierCube
162+
163+
my_first_cube = RegularizersModifierCube(
164+
num_iter=5,
165+
tracked_score_function=retrieve_score_for_strategy('PerplexityScore@lemmatized'),
166+
regularizer_parameters={
167+
'regularizer': artm.DecorrelatorPhiRegularizer(name='decorrelation_phi', tau=1),
168+
'tau_grid': [0,1,2,3,4,5],
169+
},
170+
reg_search='grid',
171+
verbose=True
172+
)
173+
my_first_cube(tm, demo_data)
174+
```
175+
Выберем лучшую модель для следующего этапа:
176+
```
177+
perplexity_select = 'PerplexityScore@lemmatized -> min COLLECT 1'
178+
best_model = experiment.select(perplexity_select)
179+
```
180+
#### Просмотр результатов моделирования
181+
Вывести данные о модели легко: создайте необходимый вам вьювер и используйте его view метод.
182+
```
183+
thresh = 1e-5
184+
top_tok = TopTokensViewer(best_model, num_top_tokens=10, method='phi')
185+
top_tok_html = top_tok.to_html(top_tok.view(),thresh=thresh)
186+
for line in first_model_html:
187+
display_html(line, raw=True)
188+
```

0 commit comments

Comments
 (0)