Пользователь
0,0
рейтинг
26 января 2012 в 11:19

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

После прочтения статьи 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

Результаты по разным пользователям.
Артем Зубков @artzub
карма
58,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (18)

  • +4
    Прямо представляю себе эти звездные глубины, расцветающие завтра в моей ленте на google+!
  • +4
    Спасибо, теперь не только Google знает всё о тех кто меня читает.
    • +1
      так надо радоваться или печалиться?
      • +1
        Ни то ни другое — пользоваться для того что бы немного знать о тех кто тебя окружает виртуально.
    • +1
      Классно то, что только публичные отношения видно, так как строиться по публичной активности =)
  • +2
    Эта статья очень интересно иллюстрирует книгу которую я недавно делал и сейчас читаю: «Связанные одной сетью: Как на нас влияют люди, которых мы никогда не видели / Николас Кристакис, Джеймс Фаулер»

    С технической точки зрения — исключительно показательная и точная иллюстрация социальных процессов. Спасибо автору!
  • 0
    Красота! Как дополнение: в окне импорта (после выбора файла БД) можно выбрать «undirected», чтобы стрелочки не рисовал. Еще один интересный вариант развертки графа — «Fruchterman Reingold», особенно выполненный после ForceAtlas2.
    • +2
      ага я то всяко игрался. пусть народ сам порыщет что да как =)
  • 0
    У меня в Г+ куча народа которого я вообще не знаю, никаких общих друзей или чего-то подобного. Это у всех так?
    • +1
      У меня 10 реальных друзей, с которыми мы и в реале видимся. Но большая часть людей интересные собеседники и авторы. Просто надо заниматься формирование кругов, а не просто добавлять всех подряд в один. =)
      • 0
        Да я только друзей и добавил, откуда остальные 90+ пришли — для меня загадка.
        • +1
          Да масс-фоловинг в Г+ это болезнь пришедшая из твиттера.
  • 0
    Кстати, а кто такой этот Kriss Selitser и почему он настолько популярен? Я тоже его закруглил когда-то давным-давно.
    • 0
      общительная незаурядная личность вот и все =)
  • 0
    Использовал Gephi для дипломки, покопайтесь в настройках, самое интересное становится когда начинаете анализировать данные, и уже под данные делать карты и соответсвенно подбирать алгоритмы которые наиболее качественно этот контраст показывают, а не просто поиграться.
    • 0
      ага анализировать самое интересное =) а какие самые интересные алгоритмы для анализа? мне понравился алгоритм который определяет группы и по его результатам можно раскрасить граф. но я так и не понял что конкретно он анализирует.
      сейчас название сказать не могу не помню а Gephi под рукой нет.
      • 0
        Я имею ввиду именно данные вершин влияющие на топологию, как то согласованное смешение (assortative mixing) по языку, а под алгоритмами я имел ввиду визуализацию вершин и рёбер. Gephi кажется около 8 алгоритмов предлагает, плюс настройки, плюс установка новых.
        • 0
          ты про layout. ну я еще кучу плагинов установил. Там самые клевые это OpenOrd а после него NoverLap очень отлично обрабатываются большие колва данных и очень понятно становиться что к чему.
          А алгоритм анализа статистики про который я говорил выше называется Modularity он просчитывает кто с кем в каких отношениях и потом в Partition можно раскрасить вершины по цветовым группам.
          вот что получается image

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