基于Google Reader发展起来的个性化推荐系统之三大问题

郑昀@玩聚SR 20091003

    中科院的xlvector(即项亮,他所在的团队The Ensemble在7月份获得Netflix大奖赛公开测试排名第一,但在9月22日Netflix宣布BPC获胜,原因据说只是因为项亮他们提交结果晚了20分钟)最近发布了一个小工具GRSuggest,有点像之前Kuber在FeedzShare所做过的“个性化阅读”,都属于“基于某个Google Reader用户的Shared Items中的文章,为该用户推荐他可能感兴趣的其他文章”,基本都是基于 User-based Collaborative Filtering 算法原理。

   项亮在《关于GRSuggest的一些思考》中说:“去重的问题,这个问题在文章推荐中非常常见,很多文章都被转载N次了,经常发现一个几年前的老贴又被转载,其实我的推荐系统本身也是转载”。

   这个延伸出来的是三个常见问题,确实不好解决。

一、火星人现象

   我前一段发了一个tweet:“不知道 Digg 能否解决火星帖频频被推荐的问题,这应该是所有digg类社区共同面临的问题:不管一个帖子或段子有多近期老多频繁被digg,隔一段时间总会有一个人当成宝贝发出来并被一大批火星人推荐。”

   有人认为,火星帖如果是优秀的,当然有权利被翻出来啊。但请注意,在某一个单一社区中,可以假设用户群有相似的知识结构,那么以往的老贴子可以被翻出来,是可以的,天涯社区就屡屡这么搞,但在一个推荐系统中,如果还是不顾用户的知识结构,屡屡出现很多老段子,那就真的是在驱赶用户了。
   火星人现象的关键是,以前大家也讨论过很多遍的:“推荐系统无法获知用户以前的知识结构”的问题。也就是说,一个单一的、新出现的个性化推荐系统,由于不知道用户的知识结构(即以往的阅读经历、经验),推荐的很多Item一定是用户已经熟知和阅读过的,这对于应用创始人和用户来说都是一个很不好的体验,但又完全无法规避。我们举一个很简单的例子,如果你在豆瓣中厮混时间不长的话,总会被豆瓣猜按照你的寥寥无几的动作推荐很多你看过、听过、读过的东西,而且是屡屡如此,你被逼的不得不一个一个点击掉,来让豆瓣了解你许久以来的经历。

   从Google Reader Shared Items衍生出来的推荐系统就存在这个问题,Shared Items并不能反映用户的阅读经历,因为你在GReader里看了一篇文章,不代表你会Shared它,也不一定会Like它。这是问题一:从根子上就无法完整反映用户的阅读经历。

   经过对Shared Items中文用户统计,相当一部分用户(我估计在50~60%)分享的文章所属之channels(即博客源)数量不会超过5个,10%的用户甚至只分享至多2个源的文章。多数中文用户分享的文章都出自“名人榜|LeaderBoard”所列出的这些站点。这是问题二:如此大量的阅读视野狭窄的用户,推荐系统能否发挥作用呢?

二、有时效性和无时效性

    以前刘未鹏针对玩聚SR曾经提过一个很好的建议:“应该将文章分为"有时效性(如新闻时政类)"和"无时效性"(如读书笔记、GTD方法等等),看上去这需要手工分配或者高级的自然语言处理,但我意识到一个很好的办法:一般人们是在greader里面共享时效性文章,在twitter上讨论时效性文章,但"无时效性",或者timeless的文章会收藏到delicious上面,因为greader/twitter代表分享讨论交流,而delicious则代表收藏以后翻查。”

    他观察到一个技巧:“无时效性的文章一般很久以后还会有人往delicious上面收藏,这是个极好的判断依据。而时效性强的文章就不会存在这个属性。”也就是说,你可以通过检查一个文章在delicious的被用户收藏的时间,从中发现哪些文章是有时效性的。

    项亮也提到:“究竟要不要把老帖子翻出来,这个首先要解决一个新闻和文章的区别,对于新闻,翻出来是没有意义的,但对于知识性的文章,还是可以翻出来的。”

    这就是基于Google Reader的推荐系统的另一个问题:要不要推荐时效性强的文章

    如果真的能分辨一篇文章的时效性,那么可以针对“火星人现象”加一个规则:推荐系统不推荐时效性强的文章,因为一是用户完全有可能通过各种渠道早已看到,比如论坛比如twitter比如IM,二是虽然用户不一定看过,但让使用推荐系统频度不高的用户总看过时的文章也会产生这个系统很烂的印象。毕竟,阅读和电影不一样,你可以推荐很老的电影,但不能推荐很老的新闻资讯。

    无时效性的文章还可以这么搞:刘未鹏认为可以“判断时效性是为了增加信噪比,将无时效性的文章单立一个tab来做榜单,可以使后来的用户持续访问到以往一段时间的精华文章,而不是大量的八卦或时政,timeless的精华文章列表的好处是一下能够建立新读者对玩聚SR的高质量的信任。”我后来虽然提供了存档入口,但并没有区分时效性。

三、惊喜很难吗?

    项亮认为:“推荐文章除了要和用户的兴趣相关,还要起到帮助用户拓展眼界的作用,这个方面的研究这几年已经有不少了,也就是找出所谓的能让用户惊喜的东西,但是这方面的算法的主要问题是无法评测,因为不知道什么东西是用户惊喜的。”

    是的,惊喜很难。

    何谓惊喜?就是在用户的知识结构之外,又是用户当下喜欢的条目(文章、电影、音乐、图片、视频)。所谓提及“当下”,是因为一个用户的兴趣点是动态的。

    stumbleupon为何总能给用户带来惊喜?

    stumbleupon的算法设计师Garrett Camp曾给出一张流程图,描述了当按下stumbel!按钮时,stumbleupon的后台流程:

stumbleupon的后台流程

    图中列出了三个因子:

    A、Your Topics,也就是你对网页的动作,比如like、dislike、quick stumbles(指当一个用户stumble!到一个页面时,没有对这个页面做任何投票行为,而直接再次点击stumble!按钮跳转到另一个页面的动作,他们将这个动作定义为:“soft not for me” or “down-vote”)。

    B、Socially Endorsed Pages,就是你的站内好友所like的那些条目。

    C、Peer Endorsed Pages,是系统计算出来的、跟你有相似投票习惯的人所like的条目。

    从中我们可以总结以下要点:

    1、一个能让用户有“惊喜”的推荐系统,必须捕捉足够多的用户行为细节。显然,基于Google Reader的第三方推荐系统,拿到的数据是严重不足的,你无法知道用户有意忽略了哪些文章,你很难拿到他的好友列表,Google不像FriendFeed那样提供Dislike/Hide的按钮;你只知道他何时Share或like了某篇文章从何处(值得注意的一个细节是,如果用户是自己订阅了煎蛋并推荐其中一篇文章,显然煎蛋对用户来说更加重要;相比而言,用户只是从其他人的Shared Items订阅中share了煎蛋的某篇文章,却不去订阅煎蛋,说明煎蛋对他来说可能还不算重要。这个细节有点像“quick stumbles”的思路)。

    2、一个能让用户有“惊喜”的推荐系统,必须拥有海量用户,处理海量数据。今年2月份,stumbleupon 即已突破七百万用户,每天估计处理1千万以上次投票行为,至少新增3万以上个新推荐条目。Google Reader中文用户还是太少,而且用户行为太集中,单凭Shared Items出来的新增文章数目太少。

    这两点都限制了第三方挖掘“惊喜”的力度。

    目前貌似只有twitter能毫无保留地提供各种用户行为细节以及海量数据。

郑昀@玩聚SR 北京报道

参考我的类似主题文章:

1、《如何测量Google Reader用户的分享活跃度》 20090918;

2、《What’s popular的交叉验证模式》 20090919.

转载于:https://www.cnblogs.com/zhengyun_ustc/archive/2009/10/04/gr_re.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直接从chrome中复制的body到postman中希望能自动识别去除空格

Describe the bug直接从chrome开发者工具中request的body复制到postman中时会带有空格,需要手动删除空格。 To Reproduce1、使用chrome开发者工具抓取一个post请求2、复制请求中参数3、粘贴到postman的body中 Expected behavior3、把带的空格删除掉 转载于:https://…

气象ts评分_给大家分享一个格点插值到站点然后TS评分的程序

登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册x!****************************************************************************!! PROGRAM: T639格点资料插值成站点资料!!**********************************************…

RichTextBox 右键显示 ContextMenuTrip

说明&#xff1a; (1)命名&#xff1a; RichTextBox -> rtxt1 ContextMenuTrip -> cms1 (2)截图&#xff1a; (3)完整代码&#xff1a; <span style"font-size:14px;">using System; using System.Collections.Generic; using System.ComponentModel; u…

设计模式学习笔记--Mediator 中介者模式

我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成。当彼此引用的对象数量比较少时&#xff0c;此时对象之间就为直接交互&#xff08;点对点)。而当对象的数量增加时&#xff0c;这种直接交互会导致对象之间复杂的、混乱的引用,最后形成一张巨大的网&…

Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

vee-validate 是为 Vue.js 量身打造的表单校验框架&#xff0c;允许您校验输入的内容并显示对应的错误提示信息。它内置了很多常见的校验规则&#xff0c;可以组合使用多种校验规则&#xff0c;大部分场景只需要配置就能实现开箱即用&#xff0c;还支持自定义正则表达式。而且支…

python微博自动评论转发_python3 调用新浪微博api实现自动发布评论

新浪微博开放平台提供了丰富的API接口&#xff0c;利用这些接口&#xff0c;开发者能够开发出独具特色的微博应用。但是&#xff0c;大部分接口都需要用户授权给应用&#xff0c;应用利用授权得到的Access Token来调用相应的接口来获取内容。新浪微博的授权机制目前主要有3种应…

Linux中fork()函数详解

参考地址 1.对fork函数的认识&#xff1a; 一个进程&#xff0c;包括代码、数据和分配给进程的资源。fork&#xff08;&#xff09;函数通过系统调用创建一个与原来进程几乎完全相同的进程&#xff0c; 也就是两个进程可以做完全相同的事&#xff0c;但如果初始参数或者传入的变…

类似pyinstaller_Python 打包工具对比,Nuitka vs Pyinstaller

py2exe&#xff0c;Pyinstaller&#xff0c;Cx_freeze&#xff0c;Nuitka都可以完成python打包的任务。Pyinstaller和Nuitka都号称跨平台&#xff0c;但其实顶多只能算是工具本身跨平台&#xff0c;实际体验中不仅打包产生的文件不能跨平台&#xff0c;能否成功打包本身也不确定…

Android学习之PopupWindow

Android的对话框有两种&#xff1a;PopupWindow和AlertDialog。 详细说明如下&#xff1a; AlertDialog是非阻塞式对话框&#xff1a;AlertDialog弹出时&#xff0c;后台还可以做事情&#xff1b; AlertDialog的位置固定&#xff0c;而PopupWindow的位置可以随意&#xff1b; A…

spring整合mybatis接口无法注入问题

在学习Spring完之后简单的了解了MyBatis。然后进行简单的整合&#xff0c;遇到MyBatista接口映射的Bean无法自动注入的问题&#xff1b; 代码异常&#xff1a; 线程“main”org.springframe .bean .factory中的异常。创建名为“UserController”的bean时出错:通过字段“userdao…

LR重新安装的问题

LR的安装&#xff0c;说难不难&#xff0c;说易也不易。在此就把我安装时碰到的问题记录下来&#xff0c;以供大家参考。 第一次安装时&#xff0c;我是成功了的。&#xff08;注意&#xff1a;安装程序的目录不能有中文&#xff0c;当然同时你得有lincense&#xff09; 后来因…

matlab柱状斜线_Matlab小练习:按斜线方向依次赋值矩阵

来自知乎问题&#xff0c;觉得挺有意思&#xff0c;留给学生解答之余&#xff0c;我也做了一番思考&#xff0c;得到三种解法。题目如下&#xff1a;以n80为例&#xff0c;————————————————————一、先要根据确定矩阵的阶数 如果先生成足够大矩阵&#xff0…

Programming C#.Classes and Objects.只读字段

只读字段 当字段声明中含有 readonly 修饰符时&#xff0c;该声明所引入的字段为只读字段。给只读字段的直接赋值只能作为声明的组成部分出现&#xff0c;或在同一类中的实例构造函数或静态构造函数中出现。&#xff08;在这些上下文中&#xff0c;只读字段可以被多次赋值。&am…

会计知识

毛利 等于收入纯利 等于利润 按照&#xff1a;利润&#xff1d;收入-成本-费用 收入&#xff1a;收到的现金、支票、签单金额成本&#xff1a;买材料、酒水、电、工资、等费用&#xff1a;日租金、桌椅、碗、盘子等摊销、税金等等 ------------------------------------------…

2020-12-21

蜂鸣器&#xff08;向导辅助&#xff09; /******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator ?Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpin…

xgboost 一般多少棵树_大白话人工智能算法-第32节集成学习之通俗理解XGBoost原理和过程...

本节讲解XGBoost的原理~目录1、回顾&#xff1a;1.1 有监督学习中的相关概念1.2 回归树概念1.3 树的优点2、怎么训练模型&#xff1a;2.1 案例引入2.2 XGBoost目标函数求解3、XGBoost中正则项的显式表达4、如何生长一棵新的树&#xff1f;5、xgboost相比原始GBDT的优化&#xf…

C++函数中返回引用和返回值的区别

https://www.cnblogs.com/JMLiu/p/7928425.html转载于:https://www.cnblogs.com/liuw-flexi/p/10745246.html

scala编程第16章学习笔记(1)

List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty&#xff1a;判断列表是否为空&#xff0c;空的话返回真 last&#xff1a;获得列表最后一个元素 init&#xff1a;获得除最后一个元素之外的元素 reverse&#xff1a;反转…

struts

Struts是一个基于Sun J2EE平台的MVC框架&#xff0c;主要是采用Servlet和JSP技术来实现的。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中&#xff0c;开发人员利用其进行开发时不用再自己编码实现全套MVC模式&#xff0c;极大的节省了…

css实现元素在div底部显示

#CSS .1 {position:relative;} .2 {position:absolute;left;0;bottom:0;} #HTML <div class"1"> <div class"2"></div> </div> 不影响其他元素的情况下定位最好...如果 DIV1 里 只有 DIV2 的话 在DIV2 CSS样式里 加一个 margin-to…