Как работают предложения друзей или 2-й степени (связанный) алгоритм

Я думал о предложениях facebook и другой подобной системе ссылок.

Я думаю, что предложение Facebook также основано на личных знаниях, таких как школьные годы, компании, с которыми я работал, или что-то подобное.

Но помимо этого более конкретным является схема facebook suggestion scheme

Case1 выглядит просто, но когда подсчет друзей увеличивается (в среднем около 300 друзей), он неэффективен. Как насчет Case2? Какой алгоритм может это сделать.

Я понятия не имею о Case3, потому что думаю, что-то особенное для facebook. но как я могу обнаружить человека 4. связана ли степень?

Ответ 1

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

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

Первые два в основном ищут всех людей, которых знают ваши знакомые друзья:

FriendHash = {}
foreach Friend in me.getFriends()
    foreach FriendOfFriend in Friend.getFriends()
        FriendHash{FriendOfFriend} += 1

foreach PotentialFriend in keys FriendHash
    if FriendHash{PotentialFriend} > 1
        me.suggestFriend(PotentialFriend)

В случае 1 связь между друзьями 1 и 2 может быть дополнительным ограничением, которое фактически сделало бы это дело более сложным для реализации. Требуя, чтобы друзья 1 и 2 имели ссылку, вам нужно будет обнаружить потенциальных друзей, итерации пар друзей, а не один раз в конце.

foreach Friend in me.getFriends()
    foreach SecondFriend in me.getFriends()
        # skip already processed friends and Friend == SecondFriend
        if Friend.getFriends() contains SecondFriend
            foreach FriendOfFriend in Friend.getFriends()
                # skip already suggested friends
                if SecondFriend.getFriends() contains FriendOfFriend
                    me.suggestFriend(PotentialFriend)

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

Последний случай изменяет первый сегмент псевдокода, распространяя предложение друга всем друзьям знакомых друзей друзей:

foreach PotentialFriend in keys FriendHash
    if FriendHash{PotentialFriend} > 1
        foreach ExtendedFriend in PotentialFriend.getFriends()
            me.suggestFriend(ExtendedFriend)

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

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

Ответ 2

Facebook, вероятно, берет информацию из вашего профиля, сообщений и использует количество подключений и т.д. Расстояние может быть одним из факторов, который снова помещается в взвешенную матрицу, например, вычисление. Затем суммируются и выбираются верхние предложения с использованием порогового значения для этой суммы. Информация о распространенных симпатиях, прямых комментариях и т.д. Сбрасывается с серверов на журнал. Затем этот журнал анализируется каждую неделю или около того, чтобы предлагать друзьям использовать Hadoop MapReduce. Этот результат на одного человека может быть передан в веб-сервис, который представляет информацию пользователям при входе в систему.

Простое предложение друзей с использованием MapReduce

Измененное предложение друга с использованием Mahout и MapReduce