Алгоритм расчёта социального доверия

Наверное, каждый, получая запрос в друзья в социальной сети от незнакомого человека, задавался вопросом, а кто это вообще и что от него ожидать. Нормальный ли это человек, желающий пообщаться, тролль, просто неадекват или очередная попытка продать что-то? Большие социальные сети, такие как VKontakte или Facebook, пытаются решить эту проблему, показывая список общих друзей. Но этого явно недостаточно: кто-то из друзей добавляет всех подряд, кто-то добавился к вам в друзья много лет назад, но вы с ним давно не общались и уже толком не помните кто это. Или же общих друзей и вовсе нет. Возникает необходимость в какой-то дополнительной оценке незнакомца, причем такой, чтобы ее можно было посчитать алгоритмически.
Но что же может быть исходными данными для такого алгоритма? Для начала рассмотрим первый уровень социального графа — тех людей, с которыми мы когда-либо взаимодействовали в Сети непосредственно. Среди них есть те, с кем мы с кем мы общаемся интенсивно, кому уделяем больше времени, и те, о ком даже вспоминаем изредка. Очевидно, что в большинстве случаев уровень доверия у первых выше. Но измерить время общения напрямую — задача сложная, кроме того, еще будет влиять скорость чтения и скорость печати. Гораздо проще измерять результаты взаимодействия: подсчитать количество лайков, репостов, комментариев, личных сообщений — иными словами, социальных взаимодействий. Очевидно, что разные взаимодействия будут иметь разный «вес»: полноценный комментарий ценнее простого лайка. Ориентировочно значения коэффициентов такие: лайк — 1, личное сообщение — 1, репост без комментария — 2, репост с комментарием — 3, написание комментария к сообщению — 5, отправка записи на стену — 6, добавление в друзья — 15, нахождение в одной группе — 1. Также можно ввести еще отрицательный коэффициент за бан, но это немного усложит расчеты. При этом считаются только взаимодействия с нашей стороны, чтобы сделать рейтинг устойчивым к накрутке. Теперь, просуммируем вес взаимодействий по каждому пользователю (обозначим это как Ni) и общий вес всех наших взаимодействий (Ns) и рассчитаем коэффициент доверия как их отношение:

T0,i=Ni/Ns

Перейдем теперь ко второму уровню социального графа. На нем находятся все те, с кем взаимодействовали пользователи первого уровня (но для избежаний зацикливания исключим из их числа тех, для кого уже известны коэффициенты доверия, то есть себя и других пользователей 1-ого уровня), проще говоря — «друзья друзей». Для каждого пользователя первого уровня мы можем посчитать их коэффициенты доверия по отношению к пользователям второго уровня по той форумле, которая была описана на предыдущем шаге (обозначим их как Ti,j, где i — i-ый пользователь из первого уровня, j — j-ый пользователь второго уровня, а нулевой пользователь — мы сами). Очевидно, что наше доверие «другу друга» должно определяться двумя составляющими — тем, насколько ему доверят «друг» с первого уровня, и тем, насколько мы доверяем «другу». С точки зрения математики это можно записать как произведение соответствующих коэффициентов доверия. Но часто бывает так, что с одним пользователем второго уровня взаимодействовало несколько человек из тех, с кем взаимодействуем мы. В этом случае нужно просто просуммировать получившиеся произведения коэффициентов доверия. В итоге получаем следующую формулу (суммирование ведется по i):

T0,j=∑T0,i*Ti,j

Зная коэффициенты доверия к пользователям второго уровня социального графа, можно аналогичным образом рассчитывать коэффициенты для последующих уровней. Делать это потребуется до того момента, пока не доберемся до уровня, на котором находится тот незнакомец, уровень доверия к которому необходимо рассчитать. Если предположить, что «теория семи рукопожатий» верна, то получится, что таких уровней будет не более семи.

За счет того, что мы считаем только взаимодействия, инициированные самим пользователем, алгоритм является устойчивым к накруткам до тех пор, пока верно предположение, что большинство людей в нашем окружении первого-второго уровней не взаимодействуют с деструктивными аккаунтами (боты, спаммеры) активнее, чем с нормальными людьми. Кроме того, следует учитывать, что некоторые виды взаимодействий (в первую очередь комментарии) могут не означать доверие в привычном смысле этого слова. Например, можно писать множество комментариев тому, кто по тем или иным причинам вызывает бурное неприятие.

Главная сложность в реализации этого алгоритма для больших социальных сетей (Одноклассники, ВК, Facebook) заключается в том, что нет готовых методов, которые позволили бы быстро получить количество взаимодействий. Чтобы подсчитать количество лайков, репостов и т.п., нужно просканировать всю соцсеть, что с учетом ограничений на количество запросов по API в единицу времени, будет очень долгой операцией. А часть информации — количество личных сообщений или факт внесения в черный список — и вовсе останется недоступной.

Но существуют так же и децентрализованные соцсети, основанные на open source-решениях и расширяемых протоколах, например, Diaspora или Mastodon. В них эту проблему можно решить гораздо горзадо проще: модифицировать программное обеспечение таким образом, чтобы подсчитывались все исходящие взаимодействия, а потом добавить в протокол либо выдачу их количества (показателя Ni), либо самого доверия вместе с профилем пользователя или с списком его друзей. Более того, на мой взгляд, реализация такого алгоритма может дать дополнительное преимущество таким соцсетям и стать одним из факторов, который развернет Интернет обратно в сторону децентрализации.