2012-10-22 6 views
-1

У меня есть список интересов пользователя, отмеченных цифрами.Как оценивать список пользователей

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

+3

У вас нет. Для этого нет «простого» запроса MongoDB и не существует схемы, которая позволяет преобразовать эту проблему в простой запрос.Это в основном n-векторное сравнение, которое вы ищете, поэтому вам нужно будет создать/найти поисковую систему, которая это сделает. –

+1

Вы можете указать, что у вас есть чувствительное к местонахождению хэширование в качестве подписи для интересов пользователя, а также для подписи на этих подписях. Если вы хотите найти похожих пользователей для определенного пользователя 'A', вы получите всех пользователей в каждом ведре, к которому принадлежит' A'. Я могу написать некоторые подробности позже. Но, короче говоря, вам нужно настроить чувствительность к местоположению, чтобы избежать n-векторного сравнения во время запроса. – greeness

ответ

2

При наличии п различных интересов, каждый пользователь может быть представлен в виде длина- п вектора Булевых, где я «го элемента является истинной тогда и только тогда пользователь в списке интереса вызывает я. Два таких векторов можно сравнить с косинус схожести, Jaccard similarity, L1, L2 расстояние расстояние и т.д.

+0

Thank. Число интересов неизвестно заранее, поэтому я не могу представить его как логический вектор, есть ли способ, который изменил число интересов – shai

+0

@shai: векторы в основном концептуальны; вы можете представить их любым способом, если хотите, просто следуя соответствующим формулам. Обратите внимание, в частности, что расстояния между двумя векторами не изменяются, когда вы добавляете равное количество нулей для обоих, поэтому, если вы действительно используете логические векторы, вы всегда можете добавлять нули позже, не влияя на предыдущие результаты. –

0

Я мог бы попытаться сделать это следующим способом

  1. у меня будет все интересы части колонны базы данных.
  2. для каждого пользователя, каждый столбец будет иметь значение 0 или 1.
  3. найти, если 2 usershave близкие интересы, я получить значения интересов из БД и хранить в domainObject (который имеет поля для каждого проценты (столбец). Затем я буду реализовывать компаратор, который будет обновлять поле int, основанное на количестве совпадающих столбцов.
  4. Основываясь на этом числе, я могу выбрать логику, например, если общий интерес равен 10 и спичек> 7, то он близок, а не закрыт и т. д.
1

Не знаю, как это сделать непосредственно с MongoDB, но если у вас есть тип данных «biginteger», то уменьшите интересы до битового поля. Затем вы не можете удалить проценты (без повторного вычисления битового поля для всех), но вы можете добавить проценты, так как их выделение просто добавит больше битов в biginteger. Тогда для сравнения interestes лиц A и B, то есть операции, в C/C++ как синтаксис:

  • common=bitCount(A&B) сколько общие интересы А и В имеют
  • onlyA=bitCount(A^(A&B)) сколько интересы А имеет, что B не есть
  • onlyB=bitCount(B^(A&B)), как много интересов в имеет, что а не имеет
  • different=bitCount(A^B), сколько различные интересы а и в есть общее (такой же, как onlyA + onlyB)
  • total=bitCount(A|B) сколько различных интересов А.Н. d B имеют общее количество (то же, что и общее + другое)

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

По меньшей мере, у класса BigInteger Java есть метод подсчета бит из коробки, в противном случае это можно сделать с помощью петли грубой силы, используя & 1 и >> 1 операцию. Не знаю, поддерживает ли MongoDB такие конструкции или имеет оператор/функцию для подсчета бит больших данных int или даже если MongoDB имеет большой тип данных int ...

Смежные вопросы