基于内容的项目建议的方法

时间:2010-12-28 16:07:54

标签: cluster-analysis recommendation-engine collaborative-filtering collective-intelligence

我正在开发一个我希望将类似项目分组的应用程序。用户可以创建项目(如视频),也可以在以后更改或扩展其属性(如新标签)。而不是依靠用户的偏好,因为大多数协同过滤机制做了,我想比较基础上的项目项目相似性的属性(如相似的长度,相似的颜色,类似的一组标签等)。计算对于两个主要目的是必要的:为给定项目建议x个类似项目,并将其聚类成类似项目的组。

到目前为止,我的应用程序遵循异步设计,我希望尽可能地将此群集组件分离。新项目的创建或现有项目的新属性的添加将通过发布组件可以使用的事件来公布。

计算中可以被提供尽力而为和“快照”,这意味着,我很好用最好的结果可能在给定时间点,虽然结果质量将最终增加。

所以我现在正在寻找适当的算法来计算类似的项目和集群。重要的约束是可扩展性。最初,应用程序必须处理几千个项目,但后来也可能有数百万个项目。当然,计算将在其他节点上执行,但算法本身应该扩展。如果算法在数据的部分变化上支持某种增量模式,也会很好。

我最初的想法是将每个项目相互比较并存储数字相似度听起来有点粗糙。此外,它需要n*(n-1)/2条目来存储所有相似性,任何更改或新项目最终都会导致n相似度计算。

提前致谢!

UPDATE tl; dr

为了澄清我想要的,这是我的目标场景:

  • 用户生成条目(想想文件)
  • 用户编辑条目元数据(想到标签)

以下是我的系统应该提供的内容:

  • 作为推荐的给定项目的类似条目的列表
  • 类似条目的集群

两项计算都应基于:

  • 条目的元数据/属性(即类似标签的使用)
  • 因此,使用适当的指标
  • 的两个条目的距离
  • 不基于用户投票,偏好或操作(与协同过滤不同)。虽然用户可以创建条目和更改属性,但计算应该只考虑项目及其属性,而不考虑与之关联的用户(就像只有项目和没有用户的系统一样)。

理想情况下,该算法应支持:

  • 条目属性的永久更改
  • 在更改时逐步计算类似的条目/群集
  • scale
  • 比简单的距离表更好的东西,如果可能的话(因为O(n²)空间复杂度)

7 个答案:

答案 0 :(得分:4)

不要从头开始写一下mahout.apache.org。它具有您正在寻找的聚类算法以及推荐算法。它与Hadoop一起使用,因此您可以轻松地scale it out

这将允许您执行的操作是根据您的关键字和/或视频说明确定群集中的类似文档。

https://cwiki.apache.org/MAHOUT/k-means-clustering.html

有一个关于使用Reuters数据集聚类文档的快速教程。它与您想要实现的非常相似。 Mahout包括推荐算法,例如斜率一,基于用户,基于项目,并且非常容易扩展。它还有一些非常有用的聚类算法,支持降维功能。如果您的矩阵稀疏(即很多使用统计信息非常少的标记),这对您很有用。

另请查看Lucene以使用其tfidf功能对标记和文档进行聚类。同时检查Solr。两者都是Apache项目。

答案 1 :(得分:3)

Recommendation Algorithm会非常有用,因为它列出了处理您目的的标准算法。

更新:

我猜你所看到的是Collaborative Quality Filtering而不仅仅是Collaborative Filtering,我已经附上了纸张链接,希望这会有所帮助。

答案 2 :(得分:3)

K-means clustering可能就是你想要的。

N.B:

  

群集k的数量是一个输入参数:k的不恰当选择可能会产生不良结果......它在某些数据集上运行得很好,而在其他数据集上却很失败。

因此,您应该考虑有多少个群集,有多少个标记以及哪个指标。

另请参阅Stack Overflow questions/tagged/k-means

答案 3 :(得分:2)

http://taste.sourceforge.net/old.html

  

味道灵活,快速   协同过滤引擎   Java的。引擎带用户'   物品的喜好(“品味”)和   返回估计的偏好   其他项目。例如,一个网站   销售书籍或CD可以轻松使用   尝试从过去中弄清楚   购买数据,CD是客户   可能有兴趣听。

     

品味提供了丰富的一套   您可以从中获得的组件   构建一个定制的推荐人   系统来自一系列算法。   味道的设计是   企业就绪;它的设计目的   性能,可扩展性和   灵活性。它支持标准   基于J2EE的EJB接口   应用程序,但味道不仅仅是   对于Java;它可以作为外部运行   暴露推荐的服务器   通过Web为您的应用程序提供逻辑   服务和HTTP。

http://savannah.nongnu.org/projects/cofi/

  

目前,想要使用的程序员   协同过滤必须阅读   文献并实施自己的   算法。通常,   程序员可能会自己设计   算法和他们一般   产生次优算法。我们想要   建立已经的基础   测试算法并记录下来   可以广泛使用   从研究到研究的背景   应用。指导原则   是设计应该很薄。   Cofi不希望成为一切   为所有人。所以重点是   提供非常少的代码行,   并依靠程序员   提供必要的胶水。

少有here

答案 4 :(得分:1)

在开始实施,改编或使用现有图书馆之前,请确保您了解该域名;阅读类似“Collective Intelligence in Action”的内容是一个良好的开端。

答案 5 :(得分:1)

您需要基于项目的协作过滤而不是基于用户。谷歌有很多算法可以解决这个问题。基于项目的解决方案总是比基于用户的解决方案更好。 Item based collaborative filtering in PHP 有一些易于理解的示例代码,可以满足您的需求:

答案 6 :(得分:0)

您必须根据产品的具体情况和良好的判断来确定相似性指标的含义。视频长度重要吗?如果是这样,它应该得到很高的重量。