Импортируем BigARTM:
In [2]:
from matplotlib import pyplot as plt
%matplotlib inline
In [3]:
import artm
Первое считывание данных (преобразуем удобный для человека формат в формат, который использует модель):
In [5]:
batch_vectorizer = artm.BatchVectorizer(data_path="school.txt", data_format="vowpal_wabbit", target_folder="school_batches",
batch_size=100)
В следующий раз данные можно считывать уже из батчей:
In [6]:
batch_vectorizer = artm.BatchVectorizer(data_path="school_batches", data_format='batches')
Создаем объект модели:
In [31]:
T = 10 # количество тем
model_artm = artm.ARTM(num_topics=T, topic_names=["sbj"+str(i) for i in range(T)], class_ids={"text":1},
num_document_passes=1, reuse_theta=True, cache_theta=True, seed=-1)
# число после названия модальностей - это их веса
Создаем словарь и инициализируем модель с его помощью
In [32]:
dictionary = artm.Dictionary('dictionary')
dictionary.gather(batch_vectorizer.data_path)
In [33]:
model_artm.scores.add(artm.PerplexityScore(name='PerplexityScore',
use_unigram_document_model=False,
dictionary='dictionary'))
model_artm.scores.add(artm.SparsityPhiScore(name='SparsityPhiScore', class_id="text"))
model_artm.scores.add(artm.SparsityThetaScore(name='SparsityThetaScore'))
model_artm.scores.add(artm.TopTokensScore(name="top_words", num_tokens=15, class_id="text"))
In [34]:
model_artm.initialize('dictionary')
Строим модель. Offline - проходит по всей коллекции много раз. Удобно, когда коллекция маленькая.
In [35]:
model_artm.fit_offline(batch_vectorizer=batch_vectorizer, num_collection_passes=40)
Необходимое число итераций можно отслеживать по графику перплексии. Когда она перестала меняться, модель сошлась.
In [36]:
plt.plot(model_artm.score_tracker["PerplexityScore"].value)
Out[36]:
Выведем топы слов:
In [37]:
for topic_name in model_artm.topic_names:
print topic_name + ': ',
tokens = model_artm.score_tracker["top_words"].last_tokens
for word in tokens[topic_name]:
print word,
print
Давайте посмотрим также на разреженность матриц:
In [38]:
print model_artm.score_tracker["SparsityPhiScore"].last_value
print model_artm.score_tracker["SparsityThetaScore"].last_value
В темах много общеупотребительных слов (так называемой, фоновой лексики). Чтобы этого избежать, будем использовать разреживающий регуляризатор для матрицы фи. Он будет подавлять слова, которые имеют большую частоту во всей коллекции.
In [39]:
model_artm.regularizers.add(artm.SmoothSparsePhiRegularizer(name='SparsePhi', tau=-100, dictionary=dictionary))
#если вы хотите применять регуляризатор только к некоторым модальностям, указывайте это в параметре class_ids: class_ids=["text"]
In [40]:
model_artm.fit_offline(batch_vectorizer=batch_vectorizer, num_collection_passes=15)
In [41]:
for topic_name in model_artm.topic_names:
print topic_name + ': ',
tokens = model_artm.score_tracker["top_words"].last_tokens
for word in tokens[topic_name]:
print word,
print
In [42]:
print model_artm.score_tracker["SparsityPhiScore"].last_value
print model_artm.score_tracker["SparsityThetaScore"].last_value
Попробуем менять коэффициент регуляризации:
In [43]:
model_artm.regularizers['SparsePhi'].tau = -5*1e4
In [44]:
model_artm.fit_offline(batch_vectorizer=batch_vectorizer, num_collection_passes=15)
In [45]:
for topic_name in model_artm.topic_names:
print topic_name + ': ',
tokens = model_artm.score_tracker["top_words"].last_tokens
for word in tokens[topic_name]:
print word,
print
In [46]:
# еще раз посмотрим на разреженность
print model_artm.score_tracker["SparsityPhiScore"].last_value
print model_artm.score_tracker["SparsityThetaScore"].last_value
Обратите внимание, что разреживать модель рекомендуется только после того, как она сошлась без регуляризации.
Сохранение и загрузка модели:
In [ ]:
model_artm.save("my_model")
In [ ]:
model_artm.load("my_model")
Можно попросить матрицы в чистом виде:
In [47]:
phi = model_artm.get_phi()
In [48]:
phi
Out[48]:
Матрица вероятностей тем в документах.
In [50]:
theta = model_artm.get_theta()
theta
Out[50]:
Если бы у нас были новые батчи, по которым мы не строим модель, а хотим только получить матрицу theta, можно пользоваться методом transform.
In [28]:
theta_test = model_artm.transform(batch_vectorizer)