我目前正在开发一个应用程序,我想在其中对类似项目进行分组。项目(如视频)可以由用户创建,并且它们的属性可以在以后更改或扩展(如新标签)。我不想像大多数协同过滤机制那样依赖用户的偏好,而是想根据项目的属性(如相似的长度、相似的颜色、相似的标签集等)比较项目的相似性。计算对于两个主要目的是必要的:x
为给定项目建议相似的项目以及将相似项目聚类成组。
到目前为止,我的应用程序遵循异步设计,我想尽可能地解耦这个集群组件。新项目的创建或为现有项目添加新属性将通过发布组件随后可以使用的事件来宣传。
可以尽最大努力和“快照”提供计算,这意味着我可以在给定时间点获得可能的最佳结果,尽管结果质量最终会提高。
所以我现在正在寻找合适的算法来计算相似的项目和集群。重要的约束是可扩展性。最初,应用程序必须处理几千个项目,但后来也可能处理数百万个项目。当然,计算将在其他节点上执行,但算法本身应该是可扩展的。如果算法在数据的部分更改上支持某种增量模式,那也很好。
我最初将每个项目相互比较并存储数值相似性的想法听起来有点粗糙。此外,它需要n*(n-1)/2
用于存储所有相似性的条目,任何更改或新项目最终都会导致n
相似性计算。
提前致谢!
更新 tl;博士
为了澄清我想要的,这是我的目标场景:
- 用户生成条目(想想文档)
- 用户编辑条目元数据(想想标签)
这是我的系统应该提供的:
- 作为推荐的给定项目的类似条目列表
- 相似条目的集群
两种计算都应基于:
- 条目的元数据/属性(即相似标签的使用)
- 因此,使用适当度量的两个条目的距离
- 不基于用户投票、偏好或操作(与协同过滤不同)。尽管用户可以创建条目和更改属性,但计算应该只考虑项目及其属性,而不是与之关联的用户(就像只有项目而没有用户存在的系统一样)。
理想情况下,该算法应支持:
- 条目属性的永久更改
- 增量计算类似的条目/集群的变化
- 规模
- 如果可能的话,比简单的距离表更好(因为 O(n²) 空间复杂度)