我有一个标有数字的用户兴趣列表。
每个用户都有几个兴趣点。如何编写代表用户兴趣的数字,以便我能够在简单的MongoDB查询中找到具有相似或近似兴趣的其他用户。
答案 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)
我可能会尝试以下列方式执行此操作