Я использую граф-инструмент для создания иерархических тематических моделей с отличными результатами, используя иерархическую стохастическую блочную модель (hSBM). Подход описан здесь: https://github.com/martingerlach/hSBM_Topicmodel
Библиотека создает двудольный граф с двумя типами узлов: слова и документы.
Хотя этот подход дает четкие темы, я хотел бы изменить двухчастную визуализацию, которую hSBM создает по умолчанию, на макет кругового графика, использующий только группы слов.
Мой вопрос: можно ли визуализировать двудольную структуру в одном круговом графе?
Все ребра существуют между документами и словами и соответствующими темами/группами. Однако круговая диаграмма должна содержать только слова и группы слов (или блоки), а не группы документов, в чем и заключается проблема. Я пробовал два подхода:
Создание фиктивной вершины привязки, к которой подключаются все слова, а не к документам. Что-то типа:
#create anchor and add edges to words anchor = model.g.add_vertex() for v in model.g.iter_vertices(): if model.g.vp['kind'][v] == 1: model.g.add_edge(v, anchor) # delete document vertices del_list = [v for v in model.g.vertices() if model.g.vp['kind'][v] == 0] for v in reversed(sorted(del_list)): model.g.remove_vertex(v)
Создание ребер между всеми соседними словами, а затем фильтрация ребер word-doc как графики">описаны здесь. Что-то типа:
from itertools import combinations for v, bipartite_label in enumerate(model.g.vp['kind']): if bipartite_label == 1: neighbours = list(model.g.vertex(v).all_neighbours()) for s, t in combinations(neighbours, 2): model.g.add_edge(s, t) g_projected = gt.Graph(gt.GraphView(model.g, vfilt=model.g.vp.kind.a == 0), prune=True)
Пока мне это не удалось, и я не могу визуализировать график. Либо мои попытки выше неверны, либо может быть невозможно изменить граф без переобучения блочной модели на новом графе.
Буду очень признателен за любую помощь или руководство, поскольку я новичок в использовании этой библиотеки.