我有一个大约70万用户的数据库以及他们观看/收听/阅读/购买/等的项目。 我想建立一个推荐引擎,推荐基于具有相似品味的用户喜欢的新项目,以及实际上找到用户可能希望在我正在构建的社交网络上成为朋友的人(类似于最后.FM)。
我的要求如下:
请不要给出像“使用pysuggest或mahout”这样的答案,因为那些实现了大量的算法,我正在寻找最适合我的数据/使用的算法。我一直对Neo4j感兴趣,以及如何将它们表示为用户和项目之间的连接图。
答案 0 :(得分:4)
要确定用户之间的相似性,您可以在用户向量中运行余弦或皮尔逊相似性(在Mahout中找到并且在网上的所有位置!)。因此,您的数据表示应该类似于
u1 [1,2,3,4,5,6]
u2 [35,24,3,4,5,6]
u1 [35,3,9,2,1,11]
在您想要考虑多个项目的位置,您可以使用上述内容来确定某些人员配置文件的相似程度。相关分数越高,他们拥有非常相似的项目的可能性就越大。您可以设置阈值,以便具有.75相似度的人在其个人资料中具有类似的项目集。
当你缺少价值观时,你当然可以构成自己的价值观。我只是保留它们二进制并尝试混合各种不同的算法。这被称为合奏。
总体而言,您正在寻找一种称为基于项目的协同过滤作为您设置的推荐方面,并且还用于识别类似项目。它是一种标准推荐算法,几乎可以满足您的所有要求。
尝试查找类似用户时,您可以在用户向量中执行某种类型的相似性指标。
关于Python,这本名为集体智能编程的书在python中提供了所有样本,所以去拿一份副本并阅读第1章。
将所有这些表示为图表将有点过量,因为你的不朽代表是Bipartile Graph。有许多推荐方法使用基于图表的方法,但它通常不是最佳表现方法。
答案 1 :(得分:4)
实际上,这是像Neo4j这样的图形数据库的甜点之一。
因此,如果您的数据模型如下所示:
user -[:LIKE|:BOUGHT]-> item
您可以使用cypher语句轻松获取有关此用户的建议:
start user = node:users(id="doctorkohaku")
match user -[r:LIKE]->item<-[r2:LIKE]-other-[r3:LIKE]->rec_item
where r.stars > 2 and r2.stars > 2 and r3.stars > 2
return rec_item.name, count(*) as cnt, avg(r3.stars) as rating
order by rating desc, cnt desc limit 10
这也可以使用Neo4j Core-API或Traversal-API完成。
Neo4j有Python API,也可以运行密码查询。
免责声明:我为Neo4j工作
Marko Rodriguez还有一些关于协同过滤的有趣文章。
答案 2 :(得分:1)
我建议您查看我的开源项目Reco4j。它是一个基于图形的推荐引擎,可以像你这样的图形数据库以非常直接的方式使用它。我们支持图形数据库neo4j。它处于早期版本,但很快就会有更完整的版本。与此同时,我们正在寻找我们项目的一些用例,所以请联系我,以便我们了解我们如何合作。