В последнее время я активно работаю с тематическим моделированием в качестве специалиста по данным. Ресурсы по созданию тематических моделей с использованием алгоритмов (например, LDA, LSI, NMF) многочисленны и полезны. Однако мне не хватало хороших способов визуализации моих тематических моделей и их понимания, пока я не наткнулся на библиотеку Python umap-learn.

В этом посте я постараюсь рассказать о процессе создания интерактивных визуализаций, чтобы разобраться в неструктурированных данных с помощью тематических моделей. Я предполагаю базовое знакомство с тематическими моделями, поскольку здесь я сосредоточусь только на визуализации.

Проецирование распределения тем на более низкие измерения

После того, как вы подогнали модель тем к своим данным, вы можете использовать модель для прогнозирования распределения тем для отдельных документов.

# The variable 'nmf' is my Scikit-learn based NMF topic model.
# Get Document-wise Topic Distributions
X_topics_nmf = nmf.transform(tfidf) 
#Assign Topics to Documents Based on Maximum Coefficient
max_topics = np.argmax(X_topics_nmf, axis = 1)

После оценки распределения тем для отдельных документов мы готовы спроецировать распределение в более низкое измерение. С более интуитивной точки зрения, предположим, что у вас есть 10 тем. Таким образом, каждый документ будет иметь всего 10 коэффициентов. Таким образом, невозможно присвоить точку этому документу во время построения, поскольку мы можем рисовать не более чем в трех измерениях. (Однако для наших целей мы будем рисовать в двух измерениях.) Таким образом, прежде чем мы приступим к построению графика, нам придется уменьшить размерность этих 10-мерных вложений для каждого документа в два измерения. Теперь у нас есть несколько вариантов на выбор — PCA, t-SNE и UMAP являются наиболее популярными. В этом посте мы будем использовать UMAP. Вы можете прочитать больше о библиотеке Python umap-learn по ссылке ниже.

https://umap-learn.readthedocs.io/en/latest/plotting.html

import umap
# Use the handy plotting tools from the umap-learn Python package
mapper = umap.UMAP(n_neighbors=20, min_dist=0.5, random_state=12).fit(X_topics_nmf)

Интерактивные графики с использованием BokehJS

Теперь, когда мы подогнали наши данные с помощью UMAP и получили проекцию меньшего размера, мы готовы построить ее. Для этого потребуется установить несколько зависимостей, которые вы можете найти в документации umap-learn.

from bokeh.plotting import show, save, output_notebook, output_file
output_notebook()
# We create a supporting dataframe that will contain labels and     # other information we want to show in the interactive plot
hover_data = pd.DataFrame({'Title':data[title_column_name].tolist(),
                           'Topic_Number':max_topics})
# Finally, we create the plot
p = umap.plot.interactive(mapper, labels=max_topics, hover_data=hover_data, point_size=8)
show(p)

Вот так получается визуализация с другой стороны! Он интерактивен в том смысле, что вы можете наводить курсор на точки и получать необходимую информацию. Вы также можете передать больше полей в фрейм данных, который мы создали, чтобы отслеживать их, когда вы наводите курсор на точки. Вы также можете прокручивать и увеличивать/уменьшать масштаб. Довольно удобно, не так ли?

Есть и другие отличные возможности, которые библиотека umap-learn предоставляет для визуализации. Смело исследуйте их!