如何对用户的兴趣列表进行排名

时间:2012-10-22 07:29:59

标签: java mongodb machine-learning

我有一个标有数字的用户兴趣列表。

每个用户都有几个兴趣点。如何编写代表用户兴趣的数字,以便我能够在简单的MongoDB查询中找到具有相似或近似兴趣的其他用户。

3 个答案:

答案 0 :(得分:2)

n 有不同兴趣时,每个用户都可以表示为布尔的长度 n 向量,其中 i '元素如果用户列出了兴趣 i ,则为true。可以将两个这样的矢量与余弦相似度Jaccard similarity,L1距离,L2距离等进行比较。

答案 1 :(得分:1)

不知道如何直接使用MongoDB,但如果你有“biginteger”数据类型,那么将兴趣降低到一个位域。然后你不能删除interestes(没有为每个人重新计算bitfield),但你可以添加interestes,因为选中它们只会向biginteger添加更多位。然后为了比较A和B人的内容,你有操作,用C / C ++语法:

  • common=bitCount(A&B)有多少共同兴趣A和B
  • onlyA=bitCount(A^(A&B)) A有多少兴趣,B没有
  • onlyB=bitCount(B^(A&B)) B有多少兴趣,A没有
  • different=bitCount(A^B)有多少不同的兴趣A和B有总数(仅与A +仅B相同)
  • total=bitCount(A|B)有多少不同的兴趣A和B有总数(与普通+不同)

根据这些数字,您可以评估兴趣的匹配程度,确切的公式取决于您希望如何强调相同的兴趣与不同的兴趣以及您希望的规模。

至少Java的BigInteger类具有开箱即用的位计数方法,否则可以使用& 1和>> 1操作使用暴力循环。不知道MongoDB是否支持这样的构造,或者是否具有大型int数据的位数的运算符/函数,或者即使MongoDB具有大的int数据类型......

答案 2 :(得分:0)

我可能会尝试以下列方式执行此操作

  1. 我的所有兴趣都是数据库列的一部分。
  2. 对于每个用户,每列的值为0或1。
  3. 要查找2位用户是否有兴趣,我会检索这些值 来自DB的兴趣和存储在domainObject(具有字段 对于每个兴趣(列)。然后我将实现一个比较器 将根据匹配列的数量更新int字段。
  4. 根据这个数字,我可以决定一个逻辑,例如,如果 总利息为10,匹配> 7然后它很接近,否则不是 关闭等。