Pull to refresh

Граф отношений пользователей Google+. Gephi

IT-companies
После прочтения статьи Gephi как средство визуализации данных я оказался под сильным впечатление от программы Gephi. На тот момент я занимался генерацией логов активности пользователей в Google+. И меня посетила идея, а может быть сделать граф отношении между участниками соц. сети Google+. После нескольких часов поисков пришел к выводу, что подобных вещей еще не сделано для Gephi. Даже в wiki gephi алгоритма формирования графа для Google+ не предложено. И на волне вдохновения быстренько дописал в приложении LoggenCSG модуль выгрузки лога в файл бд sqlite, который умеет импортировать Gephi. Результаты импорта графа в Gephi мне очень понравились.
Косвенные отношения между пользователями через их активности.
Косвенные отношения между пользователями через их активности.

Прямые связи между пользователями через их активности.
Прямые отношения между пользователями через их активности.
Дальше пойдет описание того как самостоятельно построить подобные графы.


Программное обеспечение

Для того чтоб получить подобный результат нам понадобиться 2 программы:
  • Gephi — отличный инструмент для построения и анализа графов.
  • LoggenCSG — программа для генерации логов активности пользователей в Google+

Словарь

  • Пост — сообщение размещенное пользователем в своем профиле.
  • Репост — сообщение которое перепостил пользователь от другого пользователя к себе в ленту.
  • Плюс — голос (оценка) поста пользователя.
  • Решара — репост другим пользователем поста (репоста) пользователя.
  • Активность — любое публичное действие из перечисленных выше.
  • Отношение — связь между пользователями через их активности.


Работа с LoggenCSG

После запуска программы нужно вставить в поле Profile Id, id пользователя в Google+.

Поле profileId

Его можно найти перейдя в свой профиль. В адресной строке будет что-то подобное 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})
Исходя из выше сказанного при применении шаблона {actorname} для всех типов файлов, получим прямые связи между пользователями.Прямые связи между пользователями
После всех настроек нажимаем кнопку 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…
image
В диалоговом окне выбираем dirver sqlite, заполняем поля которые он подсвечивает красным, в поле имя файла выбираем сгенерированный LoggenCSG файл db. В моем случае по-умолчанию.
image
После обработки получаем следующий результат:
image

Здесь мы видим что импортировано 2019 вершин, 5891 ребер, граф динамически. Нажимаем Ок.Слева внизу выбираем алгоритм по которому обработать layout. Я выбрал ForceAtlas 2. Выставил Scaling (Масштабирование) в значение 30. Нажимаем Run.
image

Дожидаемся наиболее приятного для вас результата. Перемещаемся вверх и выбираем в списке метод Degree, мы раскрасим вершины и связанные с ними ребра соответственно их весу. Формируем нужный нам градиент или выбираем готовую палитру в углу с права. Нажимаем Apply.
image

После этого переходим во вкладку Preview. Настраиваем все как на картинке и нажимаем Refresh.
image

Возвращаемся во вкладку Overwrite. Внизу справа палитра фильтров. Выбираем в списке каталог Topology->Ego Network (Связи относительно конкретного вершины. ну ли дословно Эго сеть =). Перетаскиваем этот фильтр в область которая ниже. Переходи во вкладку Data…. В правом верхнем углу есть фильтр вводим нужное нам имя. Я ввел Kriss. Копируем или запоминаем id. Возвращаемся назад и в поле Node Id указываем его. Нажимаем Filter.
image

Значение которое можно выбрать под полем Node Id, указывает кол-во шагов от выбранной вершины до следующей, по-умолчанию выбрано 1. При применение данного фильтра видим сколько пользователей на расстоянии одного шага от Kriss'a.
image

Затем можно выбрать допустим фильтр Mutual Degree Range, он позволяет посмотреть взаимные связи между всеми вершинами. Перетаскиваем его в нижнею область и перемещаем бегунок с 0 на 1, видим всех пользователей которые имею взаимные связи от 1 до мах.
Вот карта до:
image
А вот после применения фильтра:
image

Также фильтры можно комбинировать. Достаточно перетащить один фильтр в другой.
image
Получаем Эго сеть с взаимными отношениями. Вот результат применения этого фильтра к предыдущей картинке до:
image



Заключение

Надеюсь вы во всем разберетесь. Если слишком витиевато написано извините.
Это очень интересное занятие анализировать взаимные отношения между пользователями. =) Надеюсь вам понравится.
Как оказалось Gephi очень мощный инструмент для работы с графами. Обладает понятным интерфейсом. Позволяет посмотреть граф в динамике, это то о чем я не сказал. Так как граф генерируемый LoggenCSG динамический, то к нему можно применять динамический фильтр, при этом если будет включен какой либо из методов построение layout то очень симпатичная картинка получается.
Хабралюди, которые будут изучать исходники простите за отсутствие комментариев в коде.
Картинки не большего разрешения так как только продемонстрировать результат который видно сразу и без деталей. Детально можно посмотреть у меня в альбоме вот с это карты, к картинка есть подписи.

P.S.: Да и эти графы демонстрируют реально активных пользователей в ваших кругах.

Благодарю всех за внимание.

UPD

Результаты по разным пользователям.
Tags:
Hubs:
Total votes 52: ↑44 and ↓8 +36
Views 6K
Comments Comments 18