Узнать возраст пользователя VK или о чём ещё может рассказать социальный граф

в 16:51, , рубрики: data mining, анализ графов, Вконтакте, Вконтакте API, гадалка возраста, Социальные сети и сообщества, социальный граф, чат-бот

«Скажи мне кто твой друг и я скажу, кто ты.»
Еврипид 480—406 до н. э.

Долгое время я смотрел на API VK как кот на стиральную машину — меня гипнотизировала возможность провести какое-нибудь исследование в одной из крупнейших социальных сетей, которая проникла во многие сферы нашей жизни. И вот однажды родился вопрос, а можно ли по кругу общения пользователя социальной сети определить его возраст?

Узнать возраст пользователя VK или о чём ещё может рассказать социальный граф - 1

Для желающих узнать скрытый возраст и раньше был небольшой хак. Надо лишь воспользоваться поиском по людям, указать узкие параметры, чтобы искомый профиль попадал в выдачу, а затем бинарным поиском определить возрастной диапазон. Или окажется, что в контактной информации вдруг указан год окончания школы. И никаких скриптов писать не надо. Но скрытый возраст и косвенная информация могут быть искажены, а главное статья всё-таки не о том, как добыть побольше персональной информации. В статье предлагается проанализировать один из аспектов социального графа.

Одно из первых, что приходит на ум при рассмотрении связей профиля: давайте посмотрим возраст одноклассников и одногруппников, в подавляющем большинстве у данного пользователя будет возраст +- 1 год. За это спасибо всеобщему среднему образованию. Есть только один нюанс: выявить одноклассников. Чем больше проходит времени с выпускного, тем в более разношёрстных по возрасту кругах мы начинаем вращаться. Школьные друзья словно оказываются в прошлой жизни, и вот их уже почти незаметно среди большого количества новых знакомых. Можно ли для профилей людей зрелого возраста как-то понять в какой поток они учились и, следовательно, примерный возраст?

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

Давайте для наглядности рассмотрим один из профилей ВК с большим количеством друзей. Получим список друзей пользователя с помощью запроса friends.get. Рассмотрим профили только с указанным возрастом и расположим их на временной шкале в виде гистограммы по годам. Есть небольшой нюанс с тем как разбивать множество друзей на годовые интервалы. Мы ведь хотим добиться, чтобы одноклассники вошли в один интервал, а не размазались по двум соседним. Опытным путём было установлено, что разбивать год лучше всего осенью, причём чтобы пользователи с датами рождения в жёлтое время года вошли сразу в два смежных интервала. То есть получаются 15 месячные интервалы с сентября по ноябрь с шагом 12 месяцев.
Узнать возраст пользователя VK или о чём ещё может рассказать социальный граф - 2
oX — возраст пользователей, оY — количество пользователей, попавших в заданный интервал.

Мы наблюдаем пятилетнее плато с максимальным годовым количеством друзей. Совсем не очевидно найти группу одногодок среди этого 5 летнего отрезка. По правде говоря, такая картина нетипична. Чаще год рождения одноклассников/одногруппников значительно выделяется среди других по большему количеству друзей. Но давайте в сложном случае для каждого пользователя найдём отношение дружеских связей внутри годовой группы к количеству связей с другими друзьями изначального пользователя, для кого мы определяем возраст; далее усредним этот показатель по каждому году. Назовём это нормированный коэффициент связности.
Узнать возраст пользователя VK или о чём ещё может рассказать социальный граф - 3
oX — возраст пользователей, оY — нормированный коэффициент связности для заданного интервала.

Картина изменилась, и в лидерах имеется единственный год. В нём большую долю имеет коллектив с однородным возрастом, следовательно имеем право ожидать, что раз пользователь является его частью, то имеет схожий возраст. А что, если человек в этом коллективе играет какую-то особенную роль, например, не одноклассник, а учитель? И вправду, для случая учителей/тренеров, могут существовать подргуппы с большой плотностью связей в узком возрастном промежутке. Частично такой случай удается обработать, если при выбирать группу не с самой высокой связностью, а с самым большим возрастом среди групп с достаточно большой связностью. Иными словами использовать логику, что человек на своем жизненном пути сначала должен побывать рядовым учеником, а уж потом играть выделенную роль в “коллективах с однородным возрастом”.

Более подробное описание и немного формул

Выразим численно обнаруженное на графике явление. Обозначим за F0 — множество друзей пользователя, для которого вычисляется возраст. Fi — множество друзей произвольного профиля. Fi,y — множество друзей профиля, имеющих указанную дату рождения в годовом интервале y. Тогда Сi,y — связность профиля i в интервале у:

$$display$$C_{i,y} = frac{|F_0 cap F_{i,y}|}{|F_0 cap F_i|}$$display$$

Сy — ненормированный коэффициент связности в интервале у по всем профилям:

$$display$$C_y = sum_i^{F_{0,y}} C_{i,y}$$display$$

И наконец искомый год рождения:

$$display$$DeclareMathOperator*{argmax}{argmax} year_of_bearth= argmax_y(frac {C_y} {|F_{0,y}|}) : C_y geq 0.7max_{yin Y}(C_y)$$display$$

Ещё была идея рассматривать к какому типу относится та или иная связь. Если тип связи школьные или университетские друзья, то учитывать их с повышенным весом. А если тип коллеги, родственники и всё остальное, то не учитывать такие связи вообще. Однако, если использовать запросы, загружающие такую информацию, то время ожидания увеличивается раз в 5. К тому же, указывать тип связи — не популярная практика, поэтому было принято решение запрашивать такую информацию только для профилей с малым количеством друзей.

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

Как насчёт попробовать это безобразие в деле? Был реализован шуточный сервис в ВК группе «Гадалка возраста». Там дружелюбный бот погадает на возраст, если скинуть ему ссылку на незакрытый профиль ВК, используя вышеупомянутый алгоритм.

Как устроен сервис

Первым звеном в работе гадалки является механизм сообщений группы ВК. В настройках группы подключается callback API на собственный сервер. В качестве отправляемых типов событий надо выбрать “Входящее сообщение”. Таким способом сообщение группы превращается в запрос на нашем сервере. Если вы также как и я не дружите с фронтендом, то это супер вариант. Далее с сервера происходит обращение к VK API с запросами users.get для рассматриваемого профиля и friends.get для друзей профиля с известной датой рождения. Для их осуществления требуется access token приложения ВК. Я не использовал запросов, требующих подтверждения прав от пользователя, чтобы не грузить людей запросами на разрешение доступа. После того как произведён расчёт предполагаемого возраста, формируется ответ на запрос из группы, и пользователь гадалки видит ответ в диалогах. Дёшево и сердито.

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

В заключении хочется затронуть аспект этичности. На мой взгляд “Гадалка возраста” находится на границе частной жизни, но всё-таки не переступает её, потому что использует для анализа открытые данные. Собственно поэтому для пользователей со скрытым профилем сервис работать не будет.

Есть ощущение, что всякие «гадалки возраста», поисковики лайков, SearchFace – это лишь первые ласточки социально-прозрачного мира. В некоторой степени это можно назвать возвращением к истокам. Человек долгое время существовал в небольших социумах, где все друг у друга были на виду. Открытая репутация являлась неотъемлемой частью механизма социального регулирования. Да, новые инструменты постепенно позволят вновь сделать социальные взаимодействия человека как на ладони, только теперь уже на глобальном уровне. Да, как и любой инструмент, это можно использовать во вред. Нужно ли делать их доступными для каждого? Не знаю. Но я уверен, что если такие инструменты будут доступны лишь ограниченному кругу лиц, то баланс в сторону конструктивного использования точно не сместится.

Автор: Андрей Белобородов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js