После прочтения статьи Gephi как средство визуализации данных я оказался под сильным впечатление от программы Gephi. На тот момент я занимался генерацией логов активности пользователей в Google+. И меня посетила идея, а может быть сделать граф отношении между участниками соц. сети Google+. После нескольких часов поисков пришел к выводу, что подобных вещей еще не сделано для Gephi. Даже в wiki gephi алгоритма формирования графа для Google+ не предложено. И на волне вдохновения быстренько дописал в приложении LoggenCSG модуль выгрузки лога в файл бд sqlite, который умеет импортировать Gephi. Результаты импорта графа в Gephi мне очень понравились.
Косвенные отношения между пользователями через их активности.
Прямые связи между пользователями через их активности.
Дальше пойдет описание того как самостоятельно построить подобные графы.
Его можно найти перейдя в свой профиль. В адресной строке будет что-то подобное https://plus.google.com/u/0/101113754039426612780/posts.
После того как вы вставите Id. Надо выбрать максимальное колво последних постов пользователя.
Его указываем в первом счетчике. Во-втором, кол-во комментариев, а соответственно и авторов, которые их оставили. Затем максимальное кол-во результатов по запросу плюсов и решар, соответственно 3 и 4 счетчик.
Так же можно выбрать галочку глубокий поиск. Этот параметр отвечает за алгоритм выборки данных. Если параметр будет включен, то сначала будет получено указанное кол-во последних сообщении пользователя (по чьему Uid генерируется лог активности), после чего будут выявлены автороты активностей. Потом для каждого выявленного автора срабатывает классический алгоритм: по его uid получается указанное кол-во последних постов и проводится анализ активностей. Глубокий алгоритм нужен для получение более общей картины отношении, но он затратней классического.
Можно выбрать для каких визуализаторов будут сделаны логи. И указать файлы в которые их следует сохранить.
Для каждого визуализатора свой набор шаблонов. Но нас интересует колонка Gephi. По умолчанию предложен шаблон для всех файлов {type}:{title}:
Если генерировать данные по этому шаблону то мы получаем граф косвенных отношении между пользователями, то есть будет граф где от пользователя (автора) идет ребро до его поста, а от другого пользователя (комментатора) к активности, которую он проявил по отношению к посту. Между постом и активностью тоже формируется ребро. В следствии чего мы получаем связи между пользователями через их активности.
Для получения иной картины, а именно для получения не посредственных связей между пользователя, надо изменить шаблоны для всех типов файлов на {actorname}:
После всех настроек нажимаем кнопку Generate. Программа откроет браузер по умолчанию для авторизации приложения через OAuth2, для того чтоб иметь ваши полномочия для получения информации. Как это сделано вот код. Взял не особо лукавя у Google из их примеров.
Работа с бд осуществляется через провайдер System.Data.SQLite с использованием технологии Linq to Entities. Вот класс GephiAppender. Вроде все данные есть теперь их надо обработать в gephi.
После запуска программы выбираем File->Import Database->Edge list…
В диалоговом окне выбираем dirver sqlite, заполняем поля которые он подсвечивает красным, в поле имя файла выбираем сгенерированный LoggenCSG файл db. В моем случае по-умолчанию.
После обработки получаем следующий результат:
Здесь мы видим что импортировано 2019 вершин, 5891 ребер, граф динамически. Нажимаем Ок.Слева внизу выбираем алгоритм по которому обработать layout. Я выбрал ForceAtlas 2. Выставил Scaling (Масштабирование) в значение 30. Нажимаем Run.
Дожидаемся наиболее приятного для вас результата. Перемещаемся вверх и выбираем в списке метод Degree, мы раскрасим вершины и связанные с ними ребра соответственно их весу. Формируем нужный нам градиент или выбираем готовую палитру в углу с права. Нажимаем Apply.
После этого переходим во вкладку Preview. Настраиваем все как на картинке и нажимаем Refresh.
Возвращаемся во вкладку Overwrite. Внизу справа палитра фильтров. Выбираем в списке каталог Topology->Ego Network (Связи относительно конкретного вершины. ну ли дословно Эго сеть =). Перетаскиваем этот фильтр в область которая ниже. Переходи во вкладку Data…. В правом верхнем углу есть фильтр вводим нужное нам имя. Я ввел Kriss. Копируем или запоминаем id. Возвращаемся назад и в поле Node Id указываем его. Нажимаем Filter.
Значение которое можно выбрать под полем Node Id, указывает кол-во шагов от выбранной вершины до следующей, по-умолчанию выбрано 1. При применение данного фильтра видим сколько пользователей на расстоянии одного шага от Kriss'a.
Затем можно выбрать допустим фильтр Mutual Degree Range, он позволяет посмотреть взаимные связи между всеми вершинами. Перетаскиваем его в нижнею область и перемещаем бегунок с 0 на 1, видим всех пользователей которые имею взаимные связи от 1 до мах.
Вот карта до:
А вот после применения фильтра:
Также фильтры можно комбинировать. Достаточно перетащить один фильтр в другой.
Получаем Эго сеть с взаимными отношениями. Вот результат применения этого фильтра к предыдущей картинке до:
Это очень интересное занятие анализировать взаимные отношения между пользователями. =) Надеюсь вам понравится.
Как оказалось Gephi очень мощный инструмент для работы с графами. Обладает понятным интерфейсом. Позволяет посмотреть граф в динамике, это то о чем я не сказал. Так как граф генерируемый LoggenCSG динамический, то к нему можно применять динамический фильтр, при этом если будет включен какой либо из методов построение layout то очень симпатичная картинка получается.
Хабралюди, которые будут изучать исходники простите за отсутствие комментариев в коде.
Картинки не большего разрешения так как только продемонстрировать результат который видно сразу и без деталей. Детально можно посмотреть у меня в альбоме вот с это карты, к картинка есть подписи.
P.S.: Да и эти графы демонстрируют реально активных пользователей в ваших кругах.
Благодарю всех за внимание.
Косвенные отношения между пользователями через их активности.
Прямые связи между пользователями через их активности.
Дальше пойдет описание того как самостоятельно построить подобные графы.
Программное обеспечение
Для того чтоб получить подобный результат нам понадобиться 2 программы:- Gephi — отличный инструмент для построения и анализа графов.
- LoggenCSG — программа для генерации логов активности пользователей в Google+
Словарь
- Пост — сообщение размещенное пользователем в своем профиле.
- Репост — сообщение которое перепостил пользователь от другого пользователя к себе в ленту.
- Плюс — голос (оценка) поста пользователя.
- Решара — репост другим пользователем поста (репоста) пользователя.
- Активность — любое публичное действие из перечисленных выше.
- Отношение — связь между пользователями через их активности.
Работа с LoggenCSG
После запуска программы нужно вставить в поле Profile Id, id пользователя в Google+.Его можно найти перейдя в свой профиль. В адресной строке будет что-то подобное https://plus.google.com/u/0/101113754039426612780/posts.
После того как вы вставите Id. Надо выбрать максимальное колво последних постов пользователя.
Его указываем в первом счетчике. Во-втором, кол-во комментариев, а соответственно и авторов, которые их оставили. Затем максимальное кол-во результатов по запросу плюсов и решар, соответственно 3 и 4 счетчик.
Так же можно выбрать галочку глубокий поиск. Этот параметр отвечает за алгоритм выборки данных. Если параметр будет включен, то сначала будет получено указанное кол-во последних сообщении пользователя (по чьему Uid генерируется лог активности), после чего будут выявлены автороты активностей. Потом для каждого выявленного автора срабатывает классический алгоритм: по его uid получается указанное кол-во последних постов и проводится анализ активностей. Глубокий алгоритм нужен для получение более общей картины отношении, но он затратней классического.
Можно выбрать для каких визуализаторов будут сделаны логи. И указать файлы в которые их следует сохранить.
Шаблоны имен файлов.
Самая интересная часть это формирование шаблонов генерации имен фалов.Для каждого визуализатора свой набор шаблонов. Но нас интересует колонка Gephi. По умолчанию предложен шаблон для всех файлов {type}:{title}:
- {type} — тип активности (post, plus, reshare, share, comment)
- {title} — 100 первых символов из текста сообщения, или полностью сообщение если оно короче 100 символов.
Если генерировать данные по этому шаблону то мы получаем граф косвенных отношении между пользователями, то есть будет граф где от пользователя (автора) идет ребро до его поста, а от другого пользователя (комментатора) к активности, которую он проявил по отношению к посту. Между постом и активностью тоже формируется ребро. В следствии чего мы получаем связи между пользователями через их активности.
Для получения иной картины, а именно для получения не посредственных связей между пользователя, надо изменить шаблоны для всех типов файлов на {actorname}:
- {actorname} — имя пользователя совершающего активность.
- Дата и время активности.
- Автор активности.
- Имя файла.
- И тип активности (принимает значения М или A это для визуализаторов).
- Для gephi еще передается параметр From (то есть от кого идет активность, для плюсов, решар и комментариев передается полное название файла поста. {postfilename})
После всех настроек нажимаем кнопку Generate. Программа откроет браузер по умолчанию для авторизации приложения через OAuth2, для того чтоб иметь ваши полномочия для получения информации. Как это сделано вот код. Взял не особо лукавя у Google из их примеров.
Как добавляются данные в бд.
Алгоритм следующий:- Если вершина источник (переданный в функцию автор активности) не существует, добавляем ее, иначе увеличиваем ее параметр Size на еденицу.
- Если целевая вершина (переданное имя файла) не существует, добавляем ее, иначе увеличиваем счетчик Size на единицу.
- Если ребро источник приемник существу увеличиваем его параметр Size на единицу, иначе создаем ребро.
- Если параметр from не пуст, формируем новую исходную вершину, если она существует увеличиваем Size, иначе добавляем новую.
- Проверяем существует ли связь между целевой вершиной и новой исходной. существует увеличиваем Size, иначе создаем.
Работа с бд осуществляется через провайдер System.Data.SQLite с использованием технологии Linq to Entities. Вот класс GephiAppender. Вроде все данные есть теперь их надо обработать в gephi.
Работа с Gephi
Исходник, на котором сделан пример. Данные сгенерированны по профилю Kriss Selitser.
После запуска программы выбираем File->Import Database->Edge list…
В диалоговом окне выбираем dirver sqlite, заполняем поля которые он подсвечивает красным, в поле имя файла выбираем сгенерированный LoggenCSG файл db. В моем случае по-умолчанию.
После обработки получаем следующий результат:
Здесь мы видим что импортировано 2019 вершин, 5891 ребер, граф динамически. Нажимаем Ок.Слева внизу выбираем алгоритм по которому обработать layout. Я выбрал ForceAtlas 2. Выставил Scaling (Масштабирование) в значение 30. Нажимаем Run.
Дожидаемся наиболее приятного для вас результата. Перемещаемся вверх и выбираем в списке метод Degree, мы раскрасим вершины и связанные с ними ребра соответственно их весу. Формируем нужный нам градиент или выбираем готовую палитру в углу с права. Нажимаем Apply.
После этого переходим во вкладку Preview. Настраиваем все как на картинке и нажимаем Refresh.
Возвращаемся во вкладку Overwrite. Внизу справа палитра фильтров. Выбираем в списке каталог Topology->Ego Network (Связи относительно конкретного вершины. ну ли дословно Эго сеть =). Перетаскиваем этот фильтр в область которая ниже. Переходи во вкладку Data…. В правом верхнем углу есть фильтр вводим нужное нам имя. Я ввел Kriss. Копируем или запоминаем id. Возвращаемся назад и в поле Node Id указываем его. Нажимаем Filter.
Значение которое можно выбрать под полем Node Id, указывает кол-во шагов от выбранной вершины до следующей, по-умолчанию выбрано 1. При применение данного фильтра видим сколько пользователей на расстоянии одного шага от Kriss'a.
Затем можно выбрать допустим фильтр Mutual Degree Range, он позволяет посмотреть взаимные связи между всеми вершинами. Перетаскиваем его в нижнею область и перемещаем бегунок с 0 на 1, видим всех пользователей которые имею взаимные связи от 1 до мах.
Вот карта до:
А вот после применения фильтра:
Также фильтры можно комбинировать. Достаточно перетащить один фильтр в другой.
Получаем Эго сеть с взаимными отношениями. Вот результат применения этого фильтра к предыдущей картинке до:
Заключение
Надеюсь вы во всем разберетесь. Если слишком витиевато написано извините.Это очень интересное занятие анализировать взаимные отношения между пользователями. =) Надеюсь вам понравится.
Как оказалось Gephi очень мощный инструмент для работы с графами. Обладает понятным интерфейсом. Позволяет посмотреть граф в динамике, это то о чем я не сказал. Так как граф генерируемый LoggenCSG динамический, то к нему можно применять динамический фильтр, при этом если будет включен какой либо из методов построение layout то очень симпатичная картинка получается.
Хабралюди, которые будут изучать исходники простите за отсутствие комментариев в коде.
Картинки не большего разрешения так как только продемонстрировать результат который видно сразу и без деталей. Детально можно посмотреть у меня в альбоме вот с это карты, к картинка есть подписи.
P.S.: Да и эти графы демонстрируют реально активных пользователей в ваших кругах.
Благодарю всех за внимание.