Что показывает социальный граф в ВКонтакте? Визуализация «В Контакте»: Скажи мне, кто твой друг.

Попалась мне тут когда-то интересная задача — быстро и максимально просто (с минимумом привлекаемых библиотек) нарисовать граф пересечения пользователей разных групп Вконтакте. И я ее даже сделал. Затем подумал — а вдруг кому-то еще нужно будет сделать что-то подобное?

Поэтому здесь я расскажу и покажу, как же всё-таки делать такие вещи:

1. Подключаться к веб-сайту вконтакте с помощью Python 2.7 (всегда можно переписать под 3.x, если что)

2. Создавать графы с помощью библиотеки NetworkX (здесь рассматриваем графы пересечений аудитории групп вконтакте)

3. Визуализировать эти графы (тут нам немного понадобится библиотека matplotlib)

Итак, дано:

Задание: нарисовать граф пересечений пользователей разных групп Вконтакте

Базовые инструменты: Python 2.7, NetworkX, matplotlib, numpy

Подключаемся к API

Если хорошо поискать в безбрежной сети, то можно найти полезные ресурсы, которые сильно облегчают подключение к АPI вконтакте.

Для начала нужно скачать специальную библиотеку-обертку — vk.com (aka vkontakte.ru) API wrapper.

Затем очень желательно скачать модуль для упрощения авторизации вконтакте (за этот скрипт большое спасибо хорошему человеку alexkutsan). Модуль мы будем звать vk_auth и всячески импортировать в дальнейшем, поэтому сохраняйте его в той же директории, где будут лежать основные скрипты. В случае, если ссылка нерабочая, то можно взять vk_auth у меня — напишите в комментариях или отправьте запрос мне на почту.

Итак, у нас есть все, чтобы просто и быстро подключиться к API вконтакте. Проверим, что все сделали как надо, и контакт теперь пускает нас в свои недра.

#!/usr/bin/env python2 # -*- coding: utf-8 -*- import vk_auth import vkontakte def test(): #параметры для vk_auth.auth - ваш логин вконтакте, ваш пароль вконтакте, id приложения, #и зона доступа, она же scope (token,user_id) = vk_auth.auth("your_login", "your_password", "2951857", "groups") vk = vkontakte.API(token=token) print "vk server time is ", vk.getServerTime() return 0

В этом скрипте нужно указать свой логин и пароль вконтакте (можете не беспокоиться — эта информация никуда не утечёт, можете проверить по коду скрипта vk_auth), в качестве id приложения нужно указать идентификационный номер своего приложения, которое предварительно нужно создать вконтакте вот таким, например, способом .

Если на видео не очень понятно, то на страничке vk.com/developers.php есть запрятанная кнопка «создать приложение» в верхнем правом углу. Сразу в глаза она не бросается — располагается чуть ниже кнопок меню «музыка» и «помощь». Там можно создать приложение и использовать его client_id в качестве id приложения.

Но! Можно использовать и чужой id. Я, например, использовал вот этот — 2951857 , который был опубликован вот в это й статье на хабрахабре. Если вдруг у автора будут претензии по использованию этого идентификатора, я готов его отсюда убрать.

Далее нужно указать так называемый scope — зону доступа для нашего парсера. Так как далее мы собираемся парсить группы, то стоит указать ‘group’. Подробнее о том, что можно указать в качестве scope — можно почитать

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

Парсим группы

Отлично! Все получилось (по крайней мере должно было).

А теперь попытаемся достать необходимые данные по группам вконтакте — количество участников для каждой группы и список этих самых участников в виде списка ID.

Важно знать, что API вконтакте выдает максимум 1000 пользователей группы – больше от него не допросишься. Впрочем, для проведения приблизительного анализа групп — сойдёт. Если надо больше — придётся парсить страницы групп напрямую.

Функция, которая ниже, берет на вход список имен групп вконтакте, а на выходе отдает нужные нам данные по этим группам.

#!/usr/bin/env python2 # -*- coding: utf-8 -*- import vk_auth import vkontakte import time def get_groups_users(groups_list): groups_out = {} (token,user_id) = vk_auth.auth("your_login", "your_password", "2951857", "groups") vk = vkontakte.API(token=token) for group in groups_list: #здесь му указываем count=10, который выдаст нам 10 пользователей из группы #это делается для наглядности. Максимум можно вытащить 1000 пользователей groups_out = vk.get("groups.getMembers", group_id=group, sort="id_asc", offset=100, count=10) time.sleep(1) return groups_out if __name__ == "__main__": group_list = ["oldlentach", "obrazovach", "superdiscoteka"] print get_groups_users(group_list) >>> {"oldlentach": {u"count": 740868, u"users": }, "obrazovach": {u"count": 217978, u"users": }, "superdiscoteka": {u"count": 150538, u"users": }}

Структура выходных данных такова: ключ — это имя группы, значение — это словарь с двумя ключами: u’count’ — количество участников в группе и u’users’ — список ID участников этой группы (максимум 1000, как мы помним)

В качестве имени группы берется ее адрес вконтакте, например, есть группа Образовач, которая находится по адресу http://vk.com/obrazovach и мы берем последнюю часть адреса, т.е. «obrazovach» в качестве имени группы .

Строим социальный граф

Теперь переходим непосредственно к построению социального графа.

Здесь мы будем применять библиотеку NetworkX , которая прекраснейшим образом подходит для составления, анализа и визуализации графов.

Вот таким вот образом можно создать граф для групп вконтакте:

  1. На вход подается словарь, где ключом является название группы вконтакте, а значением — количество участников этой группы и список из максимум 1000 ID участников группы (каждый ID — это ID пользователя вконтакте)
  2. Создаём вершину в графе для каждой группы, в качестве атрибута присваиваем каждой вершине вес, равный количеству участников в группе
  3. Затем для каждой пары вершин, если между ними есть пересечение по ID участников, создается ребро, и в качестве атрибута присваиваем каждому ребру вес, равный количеству пользователей, которые присутствуют в обеих группах.

Атрибуты, которые присваиваются вершинам и ребрам, необходимы для последующей визуализации. Чем больше вес вершины (количество участников в группе), тем больше будет размер вершины на диаграмме. Чем больше вес ребра (пересечение количества участников), тем толще будет ребро на диаграмме.

Вот эта функция как раз и строит описанный выше граф:

#!/usr/bin/env python2 # -*- coding: utf-8 -*- import networkx as nx def make_graph(groups_out): graph = nx.Graph() groups_out = groups_out.items() for i_group in xrange(len(groups_out)): graph.add_node(groups_out, size=groups_out["count"]) for k_group in xrange(i_group+2, len(groups_out)): intersection = set(groups_out["users"]).intersection(set(groups_out["users"])) if len(intersection) > 0: graph.add_edge(groups_out, groups_out, weight=len(intersection)) return graph

Визуализируем

Визуализация проводится с помощью методов NetworkX на базе matplotlib. Подробнее о том, как визуализировать граф, можно прочитать . А вот пример того, как визуализируется именно тот граф, который мы создали выше. Параметры методов говорят сами за себя, так что дополнительных объяснений, полагаю, не требуется 🙂

Вот таким образом можно визуализировать созданный нами граф:

#!/usr/bin/env python2 # -*- coding: utf-8 -*- import networkx as nx import matplotlib.pyplot as plt import numpy def plot_graph(graph, adjust_nodesize): pos=nx.spring_layout(graph, k=1) #нормализуем размер вершины для визуализации. Оптимальное значение параметра #adjust_nodesize - от 300 до 500 nodesize = ["size"]/adjust_nodesize for i in graph.nodes()] #нормализуем толщину ребра графа. Здесь хорошо подходит #нормализация по Standard Score edge_mean = numpy.mean([i]["weight"] for i in graph.edges()]) edge_std_dev = numpy.std([i]["weight"] for i in graph.edges()]) edgewidth = [((graph.edge[i][i]["weight"] - edge_mean)/edge_std_dev) for i in graph.edges()] #создаем граф для визуализации nx.draw_networkx_nodes(graph, pos,node_size=nodesize, node_color="y", alpha=0.6) nx.draw_networkx_edges(graph,pos,width=edgewidth,edge_color="b") nx.draw_networkx_labels(graph,pos,fontsize=10) #сохраняем и показываем визуализированный граф plt.savefig("/path/to/save/figure") plt.show()

Кстати, можно значительно упростить нормализацию рёбер по Standard Score (он же Z-score), применив метод scipy.stats.mstats.zscore из библиотеки scipy.

Всё просто, не так ли?

Теперь, если собрать всё воедино,

If __name__ == "__main__": groups = ["oldlentach", "echomsk", "meduzaproject", "tvrain", "bbc", "1tv", "izvestia", "rt_russian", "lentaru", "ntv", "habr", "postnauka", "cloudytech", "space_live", "popularmechanics", "inbest", "lovestime", "orealno", "devpoymut", "padik_adik"] groups_out = get_groups_users(groups) graph = make_graph(groups_out) plot_graph(graph, 500)

то можно нарисовать вот такой вот граф (щелкните по картинке, чтобы увеличить её):

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

Интересно, кстати, что между группами хабрахабра, телеканала Дождь (tvrain), Эха Москвы (echomsk), журнала Популярная механика (popularmechanics) и информационного проекта Медуза (meduzaproject) (и еще немного паблика Постнаука (postnauka)) существуют серьёзные связи — аудитория групп довольно сильно пересекается. А группа padik_adik, которая на визуализации предстает изолированной вершиной — это группа «Пацаны поймут» с соответствующим контингентом, который, как можно видеть, не особенно любит связываться со всем остальным миром

Я буду очень признателен, если вы оставите здесь комментарий — можно хвалебный, можно ругательный.

Привет, Хабралюди!

Это мои друзья. Каждая точка - человек, целый мир, с которым так или иначе мне повезло встретиться. Линия между точками обозначает дружбу. По этой сети можно, правда, сказать многое о человеке.

Как построить сеть своих друзей?
1. Проверьте что браузер поддерживает WebGL: get.webgl.org - должен быть кубик. Если кубика нет - попробуйте другой браузер. Часто хром/лис блокируют видеокарты с устаревшими драйверами. Увы, кубик - это ключ к успешной визуализации:).

2. Зайти на www.yasiv.com/vk - это визуализация ваших друзей на ВК.

Почему синие квадраты вместо аватарок?
У WebGL есть очень строгие ограничения на картинки, используемые в текстурах. Если они приходят из другого домена, сервер с картинками должен разрешить их кросс-доменное использование. Исправляется добавлением в заголовок ответа с картинкой Access-Control-Allow-Origin:* , но увы, ВКонтакте этого пока не поддерживает. Если вы, читатель, являетесь сотрудником ВКонтакте, и имеете доступ к коду - добавьте, пожалуйста хедер. Я вам спасибо огромное скажу, и визуализацию подправлю:).
Почему WebGL?
Ни CSS, ни SVG, ни даже простой canvas 2D не сравнятся с производительностью WebGL. vivagraph.js поддерживает SVG и CSS, но в обоих случаях основным тормозом визуализации является браузерный код отрисовки элементов. Лишь с использованием WebGL ботлнек перемещается в мой алгоритм укладки:).
Маленький Мир
Помните историю о шести рукопожатиях ? Недавний анализ полной сети Фейсбука вывел число 4.7. Я забавы ради начал достраивать сеть от мало знакомого мне друга в неизвестность и такая картина наблюдалась очень часто:
Что скажете?
Мне очень-очень важны ваши отзывы и предложения. Это всего лишь мое хобби, но я очень люблю его. Понимаю, что все еще сыровато, и на огромных графах (больше 2000 узлов) все работает слишком медленно. Но вместо того, чтобы пытаться сделать все правильно с первого раза, я хотел бы спросить у вас, что бы вы посоветовали сделать лучше? Ну и буду очень рад, если присоединитесь к

Социальный граф VK June 22nd, 2012

Не так давно во всем известной российской соцсети появилось приложение, которое позволяет построить граф связей собственных друзей. Глобальной пользы в этом нет, но для личного исследования — довольно интересная штука. Процедура проста: устанавливаешь приложение — запускаешь — ждёшь — смотришь результат. После 10-15 минут приложение закончило обработку информации и я получил такой занятный граф:

Чтобы понять, какие области к чему относятся, я выделил основные из них:

Центральный и наиболее многочисленный кластер — это факультет математики Волгоградского Гос Университета, что логично, родной факультет ведь. Справа от него отдельно выделяется физический факультет, что обусловлено двумя причинами:

  • Часть моего первого факультета информационных технологий вошла в состав физфака (другая, соответственно, в состав матфака), и большинство связей — оттуда;
  • У нас с физфаком был общий отдельный учебный корпус.

Чуть ниже выделил группу Бизнес-Информатики в ВолГУ — свою родную группу. Интересный факт, что большинство одногруппников почти не заводили знакомств на новом факультете, так и оставшись в стороне.

Ещё ниже находится кластер, включающий в себя тех людей, с которыми я учился на переводчика на факультете лингвистики.

Слева от матфака находится кластер волгоградских ЧГКшников. На самом деле, границы кластеров здесь заданы очень грубо, и красный прямоугольник ЧГК должен захватывать и часть матфака. С ЧГКшниками пересекается кластер со всеми остальными студентами ВолГУ, преимущественно с теми, с кем я познакомился на ЧГК, будучи редактором и в разных университетских поездках.

Отдельно слева идёт кластер со школьными связями, в большинстве своём мой бывший класс. Как видно, уровень социализации там достаточно мал и ограничивается определённым кругом лиц.

Второй по размеру кластер после ВолГУ — это НИУ ВШЭ, в основном факультет Бизнес-Информатики, выделен жёлтым цветом. От него идёт два ответвления, которые я не выделял — это связи на работе (такое малое количество обусловлено тем, что большинство там не пользуется VK, предпочитая вместо него FB и LinkedIn). Два ответвления — это два отдела, в одном я работал раньше, в другом работаю сейчас. Как видно, в каждом из них есть один или два человека, так или иначе связанные с Вышкой.

Последний кластер — это ЧГКшники из Москвы и Ярославля. Изначально я думал, что кластер будет связан с Высшей Школой Экономики, ибо оттуда и пошли все знакомства. Но, как оказалось, московские чгкшники знают гораздо больше знатоков из Волгограда, нежели студенитов факультета БИ (что, наверное, логично).

Оставшиеся точки — это люди, с которыми я знакомился либо как-то случайно на улице, в индивидуальных путешествиях или по интернету. Таких не очень много — около 6%.

В целом, факультет математики ВолГУ (включая Бизнес-Информатику) и Вышка составляют по 1/3 всех связей соответственно. Последняя треть связей приходится на оставшиеся 6 кластеров и пользователей, которых я не включил в какую-то выборку.

Конечно, это не все, кого я знаю, а только те, кто есть в VK и кто есть у меня в «друзьях». Так что выборка не совсем точная, но очень-очень приблизительная.

Если вам интересно, можете сами создать себе такую.

    Совсем недавно социальная сет ВКонтакте отпраздновала 10-летие и честь юбилея было предложено вспомнить все то время, сколько пользователь провел в сети со времени регистрации, тут представлены все лайки, друзья и куча всяких воспоминаний, очень забавная вещь и полезная, социальный граф представлен в виде Вселенной, адрес ссылки следующий

    https://vk.com/feed?w=vk10_years190665220

    Социальный граф сделан в честь юбилея соцсети-в 2016 году ВКонтакте исполнилось 10 лет, и любой пользователь может Вспомнить все, какая была его первая запись, статус, друзья, музыка, количество лайков, сообщений, сколько пользователь в сети в общей сложности. Словом, показана вся история станицы от первого дня регистрации до сегодняшнего момента. Очень интересно пройтись по своему прошлому.

    Социальный граф - это новое приложение в контакте , которое было разработано специально для десятилетнего юбилея сайта. Благодаря этому новому приложению, можно вспомнить с чего начиналась страничка, сколько времени страница зарегистрирована на сайте, узнать какие первые фотографии были опубликованы на странице, с кем на странице в первый раз подружились и другую полезную информацию. Приложение очень интересное и разработчики с ним угадали.

    Показывает первую фото.

    Показвает сколько лайков вы сделали сколько сообщений вами было отправлено. И самое главное сколько времени вы были с этой социальной сетью. Окунает в реальность. А не много ли?)))

    К 10-летнему юбилею VK его создатели запустили уникальный сервис, позволяющий получить статистические данные своей учетной записи. Подойдет для тех, кто испытывает ностальгию по первым годам использования ВКонтакте. Помимо возраста страницы, статистики сообщений и созданных граффити, предлагается ознакомиться с социальным графом, выполненным в форме фирменного логотипа и отражающим дружественные связи с другими пользователями популярной социальной сети.

    Совсем недавно, в связи с 10-летнем юбилеем социальной сети Вконтакте, появилось приложение Социальный граф. Это приложение непосредственно ВК может строить связь вас и ваших друзей. То есть это приложение способно выстроить всю историю вашей активности Вконтакте с момента регистрации.

    Приложение бесплатное.

    Социальная сеть В контакте отметила свой 10 летний юбилей. В связи с этим предоставили возможность пользования приложением Социальный граф. Теперь можно будет с помощью этого сервиса просмотреть моменты из прошлого, это очень увлекательно и интересно. Можно будет узнать, когда был зарегистрирован пользователь, кто стал его первым другом. Узнаете о первых добавленных фото, аудиозаписи и многое другое.

    Социальный граф это мини-сервис, который подарен пользователям был в честь 10-летия социальной сети.

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

    Социальный граф это приложение, вернее одна из функций программы Вспомнить вс, которое было создано к юбилею соц. сети Вконтакте. Недавно Вконтакте исполнилось 10 лет, и благодаря приложению Социальный граф можно отмотать время назад и вспомнить тот момент когда пользователь прошел регистрацию в соц. сети, какие были его первые загруженные фото.

Привет, Хабралюди!

Это мои друзья. Каждая точка - человек, целый мир, с которым так или иначе мне повезло встретиться. Линия между точками обозначает дружбу. По этой сети можно, правда, сказать многое о человеке.

Как построить сеть своих друзей?
1. Проверьте что браузер поддерживает WebGL: get.webgl.org - должен быть кубик. Если кубика нет - попробуйте другой браузер. Часто хром/лис блокируют видеокарты с устаревшими драйверами. Увы, кубик - это ключ к успешной визуализации:).

2. Зайти на www.yasiv.com/vk - это визуализация ваших друзей на ВК.

Почему синие квадраты вместо аватарок?
У WebGL есть очень строгие ограничения на картинки, используемые в текстурах. Если они приходят из другого домена, сервер с картинками должен разрешить их кросс-доменное использование. Исправляется добавлением в заголовок ответа с картинкой Access-Control-Allow-Origin:* , но увы, ВКонтакте этого пока не поддерживает. Если вы, читатель, являетесь сотрудником ВКонтакте, и имеете доступ к коду - добавьте, пожалуйста хедер. Я вам спасибо огромное скажу, и визуализацию подправлю:).
Почему WebGL?
Ни CSS, ни SVG, ни даже простой canvas 2D не сравнятся с производительностью WebGL. vivagraph.js поддерживает SVG и CSS, но в обоих случаях основным тормозом визуализации является браузерный код отрисовки элементов. Лишь с использованием WebGL ботлнек перемещается в мой алгоритм укладки:).
Маленький Мир
Помните историю о шести рукопожатиях ? Недавний анализ полной сети Фейсбука вывел число 4.7. Я забавы ради начал достраивать сеть от мало знакомого мне друга в неизвестность и такая картина наблюдалась очень часто:
Что скажете?
Мне очень-очень важны ваши отзывы и предложения. Это всего лишь мое хобби, но я очень люблю его. Понимаю, что все еще сыровато, и на огромных графах (больше 2000 узлов) все работает слишком медленно. Но вместо того, чтобы пытаться сделать все правильно с первого раза, я хотел бы спросить у вас, что бы вы посоветовали сделать лучше? Ну и буду очень рад, если присоединитесь к