-1

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

每个用户都有几个兴趣。如何组成一个代表用户兴趣的数字,以便能够在简单的 MongoDB 查询中找到具有相似或密切兴趣的其他用户。

4

3 回答 3

2

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

于 2012-10-22T07:31:49.870 回答
1

不知道如何直接使用 MongoDB,但如果你有“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 总共有多少不同的兴趣(与 onlyA+onlyB 相同)
  • total=bitCount(A|B)A和B总共有多少不同的兴趣(相同+不同)

从这些数字中,您可以评估兴趣匹配的紧密程度,确切的公式取决于您希望如何强调相同的兴趣与不同的兴趣以及您想要拥有的规模。

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

于 2012-10-22T08:12:07.410 回答
0

我可能会尝试通过以下方式做到这一点

  1. 我将拥有数据库列的所有兴趣部分。
  2. 对于每个用户,每一列的值都是 0 或 1。
  3. 要查找是否有 2 个用户有密切的兴趣,我将从 DB 中检索兴趣值并将其存储在 domainObject 中(每个兴趣(列)都有字段。然后我将实现一个比较器,它将根据数量更新一个 int 字段匹配的列。
  4. 根据这个数字,我可以决定一个逻辑,例如,如果总兴趣是 10 并且匹配 > 7,那么它是接近的,否则不接近等。
于 2012-10-22T07:43:51.493 回答