协同过滤/推荐系统的性能和方法
作者:互联网
我真的很想了解人们如何使用协作式过滤和推荐引擎等.我的意思是,在脚本性能方面比什么都重要.我已经读过《 Programming Collective Intelligence》,这确实很有趣,但是倾向于更多地关注事物的算法方面.
我目前只有2k用户,但事实证明,我目前的系统完全不能用于将来,并且已经对服务器造成了很大的负担.整个系统是基于向用户推荐帖子.我的应用程序是PHP / MySQL,但我使用一些MongoDB进行协作过滤-我在大型Amazon EC2实例上.我的设置实际上是一个两步过程.首先,我计算项目之间的相似度,然后使用此信息提出建议.运作方式如下:
首先,我的系统计算用户帖子之间的相似度.该脚本运行一个算法,该算法返回每对的相似度得分.该算法检查诸如-常用标签,常用评论者和常用相似者之类的信息,并且能够返回相似性得分.过程如下:
>每次添加帖子时,都会添加标签,对其进行评论或顶我将其添加到队列中.
>我通过cron(一天一次)处理此队列,找出每个帖子的相关信息,例如评论者和喜欢者的user_id和tag_id的.我以以下结构将信息保存到MongoDB:{“ post_id”:1,“ tag_ids”:[12,44,67],“ commenter_user_ids”:[6,18,22],“ liker_user_ids”:[87, 6]}.这使我最终可以建立一个MongoDB集合,当我尝试计算相似度时,可以轻松快速地访问所有相关信息
>然后,我运行另一个cron脚本(也一天一次,但在前一天之后),该脚本再次进入队列.这次,对于队列中的每个帖子,我从MongoDB集合中获取它们的条目,并将其与所有其他条目进行比较.当2个条目具有一些匹配信息时,根据相似性,我给它们1个.最后,我对每对帖子都有一个总分.我将分数保存到具有以下结构的另一个MongoDB集合中:{“ post_id”:1,“相似”:{“ 23”:2,“ 2”:5,“ 7”:2}}}(“相似”为一个以post_id为键,相似度得分为值的key =>值数组.如果得分为0,我不会保存.
我有5k个帖子.因此,以上所有内容在服务器上都相当困难.有大量的读写操作要执行.现在,这只是问题的一半.然后,我将使用此信息来确定哪些帖子对特定用户而言很有趣.因此,每小时运行一次cron脚本,该脚本运行的脚本将为网站上的每个用户计算1条推荐的帖子.过程如下:
>脚本首先确定用户将获得的推荐类型.这是50-50的变化-1.与您其中一个帖子相似的帖子,或2.与您互动过的帖子相似的帖子.
>如果为1,则脚本将从MySQL抓取用户post_id,然后使用它们从MongoDB抓取其相似帖子.该脚本采用最相似的帖子,尚未向用户推荐.
>如果为2,该脚本将从MySQL中获取用户已评论或喜欢的所有帖子,并使用其ID进行上述1中的操作.
不幸的是,每小时的推荐脚本会占用大量资源,并且慢慢地需要越来越长的时间才能完成…目前需要10-15分钟.我担心有时无法再提供每小时的建议.
我只是想知道是否有人觉得我可以更好地做到这一点?
解决方法:
我正在计划如何做.
第一件事是可能摆脱数据库技术,或者用三重存储或图形技术对其进行补充.这应该为分析相似的喜欢或话题提供更好的性能.
接下来是一个子集.取得用户的一些兴趣,并获得一小部分具有相似兴趣的用户.
然后以某种有意义的顺序构建喜欢的索引,并计算反转次数(除法和征服-这与合并排序非常相似,并且您将希望在出局时进行排序以始终计算分割的反转次数).
我希望这对您有所帮助-您不想将所有内容与其他所有内容进行比较,或者肯定是n2.如果您邀请一群有着相似喜好的人并使用它,那么您应该能够用介于常数和线性之间的某种东西代替它.
例如,从图形角度来看,采取他们最近喜欢的东西,并查看in边缘,然后追踪它们并分析这些用户.也许可以在一些最近喜欢的文章上执行此操作,然后从中找到一组共同的用户,并将其用于协作过滤以查找用户可能会喜欢的文章.那么您的问题规模就可以解决了-特别是在没有索引增长的图形中(尽管可能有更多的优势可以遍历文章-尽管这给了您更多查找可用数据的变化)
更好的办法是自己键入文章的关键,这样,如果某人喜欢某篇文章,您可以根据其他用户(即亚马逊的“购买此商品的用户也购买了”)看到他们喜欢的文章.
希望能给出一些想法.对于图分析,有些框架可能会有所帮助,例如统计和派生类的动物.
标签:mongodb,mysql,php,filtering,collaborative 来源: https://codeday.me/bug/20191201/2083994.html