我有一个标有数字的用户兴趣列表。
每个用户都有几个兴趣。如何组成一个代表用户兴趣的数字,以便能够在简单的 MongoDB 查询中找到具有相似或密切兴趣的其他用户。
我有一个标有数字的用户兴趣列表。
每个用户都有几个兴趣。如何组成一个代表用户兴趣的数字,以便能够在简单的 MongoDB 查询中找到具有相似或密切兴趣的其他用户。
当有n 个不同的兴趣时,每个用户都可以表示为一个长度为n的布尔向量,其中如果用户列出了兴趣i ,则第i个元素为真。两个这样的向量可以用余弦相似度、Jaccard 相似度、L1 距离、L2 距离等进行比较。
不知道如何直接使用 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 数据类型......
我可能会尝试通过以下方式做到这一点