基于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://…

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;还支持自定义正则表达式。而且支…

Linux中fork()函数详解

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

Android学习之PopupWindow

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

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

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

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…

css文件修改后没变化 static_Go Web编程使用Go语言创建静态文件服务器

上篇关于Go模板库应用实践的文章最后我们留下一个问题&#xff0c;页面模板是通过 CDN引用的 BootStrap的 css&#xff0c; js文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过 Nginx服务器的一定知道 Nginx天然支持…

【linux】学习2

鸟哥那本书的第6章 文件权限&#xff1a; ^ ^ ^ ^ ^ ^ ^ 1 2 3 4 5 6 7 文件有 文件所有者、文件所属用户组 的概念如上图. 1. 十个字母表示文件…

IE 8 开发人员工具详解 【转载】

我的体会&#xff0c;IE 8 较之前面的的版本还是有不少改进的。使用体验上好很多&#xff0c;速度也不错。IE 要继续加油&#xff0c; 对于网页开发人员&#xff0c;IE8也提供了一个所谓的开发人员工具&#xff0c;通过F12可以调用出来 关于这套工具的使用细节&#xff0c;我就…

scrollwidth ,clientwidth ,offsetwidth 三者的区别

clientwidth:内容可视区域的宽度 offsetwidth:元素整体宽度 scrollwidth:实际内容的宽度 转载于:https://www.cnblogs.com/cuijin-book/p/10760656.html

python运算符与表达式

2019独角兽企业重金招聘Python工程师标准>>> 运算符用于连接两个相同类型的序列&#xff0c;s*n用于创建一个序列的n个副本。但是这些都是仅仅复制元素引用的浅复制。 例&#xff1a; a[3,4,5] b[a] c2*b 则c[[3,4,5],[3,4,5]] a[0]-7; 则c[[-7,4,5],[-7,4,5]]. 也…

phper必知必会之类库自动加载的七种方式(三)

## php自动加载 下面显示例子的文件目录结构图 一、没有使用命名空间的几种实现 test/oneClass.php class oneClass{public function show(){echo "这里是oneClass.php的show方法<br/>";}} test/twoClass.php <?phpclass twoClass{public function show(){…

c++ 箭头符号怎么打_焊接图纸符号标注图解示例,焊接符号标注实例及方法

基本坡口符号坡口符号(注&#xff1a;图中“破”应为“坡”)焊接图纸符号标注图解示例焊接符号标注实例及方法在焊接结构图样上&#xff0c;焊接方法可按国家标准GB5185-85的规定用阿拉伯效字表示&#xff0c;标注在指引线的尾部。常用焊接方法代号见表3-9所示。如果是组合焊接…

演示: GTS流量×××和CAR流量监管的效果及相关实践计划

演示&#xff1a; GTS流量和CAR流量监管的效果及相关实践计划演示目标&#xff1a;1 理解clock rate(时钟频率)和bandwidth&#xff08;带宽&#xff09;与接入速率的关系2 在模拟运营商的接入路由器ISP上配置CAR监管用户流量到认购速率64K3 取证模拟的企业网络以128K的接入速率…

跨线程访问控件

【转帖】 我们在做winform应用的时候&#xff0c;大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题&#xff0c;下面我将详细的介绍。 首先来看传统方法&#xff1a; public partial class Form1 : Form { public Fo…

解析Nginx负载均衡

摘要&#xff1a;对于一个大型网站来说&#xff0c;负载均衡是永恒的话题。随着硬件技术的迅猛发展&#xff0c;越来越多的负载均衡硬件设备涌现出来&#xff0c;如F5 BIG-IP、Citrix NetScaler、Radware等等&#xff0c;虽然可以解决问题&#xff0c;但其高昂的价格却往往令人…

深圳办理cdn经营许可证_深圳危化品经营许可证申请流程怎么申请?办理危化学品经营许可证...

随着深圳地区慢慢的进入了产业整合和城市规划规范化的运营中&#xff0c;很多涉及到生产的公司都逐渐被有效的整合在一起了&#xff0c;而随着深圳地区越发有效的整合生产规划&#xff0c;很多地区都逐渐的在将涉及到危险化学品生产和经营的企业都进行合理的管制&#xff0c;在…