一篇文章看懂Facebook和新浪微博的智能FEED
本文来自网易云社区
作者:孙镍波
众所周知,新浪微博的首页动态流不像微信朋友圈是按照时间顺序排列的,而是按照一种所谓的“智能排序”的方式。这种违背了用户习惯的排序方式一直被用户骂,但是无论是Facebook还是微博都执意做下去,这是为什么呢?
本来早想写一篇科普文给大家介绍一下智能FEED,但是由于比较懒一直拖着。直到上次发布了《改进网易云音乐的“音乐社交”构想》一文后,有一位同学说到想了解一下微博点赞的故事,所以促使我写下这篇文章。
1 为什么要做智能FEED?
1.1 什么是FEED
FEED最早是指RSS订阅中用来接收该信息来源更新的接口,后来就指代站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),其本质其实是一种站内推送,通常被用于新闻和其他按顺序排列的网站,例如Blog。到后来社交媒体盛行之后,FEED几乎成为了所有社交媒体的标配。因为其交互简单,用户上手容易,后端信息配置灵活,又契合移动设备单屏操作的特点,已经被证明为内容型软件的最佳呈现方式。(甚至连支付宝在其上个大版本更新中都把首页改成了FEED)
1.2 FEED的重要性
FEED的本质是信息分发的一种方式,所以称其为内容型产品的两大命脉之一(内容生产+内容分发)。同时因为FEED通常出现在产品的第一屏,大家知道,对于大部分APP而言,首屏流量几乎占了全站的90%以上,而其余几屏其实是不怎么被关注的。所以与其大费精力对其余屏幕的功能迭代更新,不如小小优化一下首页的FEED流算法,带来的收益反而高的多。
1.3 原来的按时间排序的方式有何问题?
首先总结用户需求:
信息分发效率低下,发布者无法获得更多浏览,内容消费者依赖主动寻找内容,进而导致社区互动不足
信息过载,当一个用户关注过多其它用户时,其每天使用微博的时间里无法看完所有更新的内容,所以会错过很多有价值的内容
信息垃圾,我们会关注很多企业、网红的账号,这些账号一天发数十条消息,把我们真实好友发布的内容都冲散了,这个必须要限制
中心化现象严重,大部分用户都缺乏主动探索的动力,那么如果都按照好友转载的大号来关注,很快流量都会中心化集中到少数营销号
信息流通能力弱,大部分用户都是只浏览点赞,不发布转载,如果我们的好友都这么做,我们的动态流中将不再出现新的用户发布的内容
再总结下产品方的需求:
主要是从商业角度,将 Feed 排序交给上帝的做法,非常不利于商业化,营销号可以使用很多伎俩吸引用户关注,然后肆无忌惮发广告,即一干营销号赚得盆满钵满,而平台方得不到半点好处。
如果看明白这些,你就明白了为什么朋友圈不需要使用智能FEED,因为首先它是个封闭的熟人圈子,本身消息质量少而精,不会出现营销号和中心化,不需要担心信息流通问题;同时大家花在朋友圈的时间非常多,不必担心内容过载的问题。
2 怎么做智能FEED
既然原来的自然FEED流存在诸多问题,那么我们怎么优化呢?
2.1 优化策略
核心思路很简单,就是把有价值的内容权重提高,把低价值甚至垃圾内容权重降低。那如何判断一条信息的价值呢?可以拿Facebook早期的EdgeRank为例介绍:
EdgeRank 主要有三个因素在起作用:
亲密度(Affinity Score)
生产成本(Edge Weight)
新鲜程度(Time Decay)
亲密度的量化就是考虑该信息的来源者和你之间交流是否频繁密切。例如你女朋友发的状态比某个高中同学发的要重要。
生产成本指产生一条新鲜事的成本,成本越高权重越大。例如好友发布了9张图片的成本比起发了9个字成本高,前者就会被优先推荐;又例如发布的成本远高于点赞,所以原创内容的优先级高于因为好友点赞而被你获知的消息。
新鲜度最好理解,就是越近发生的事约容易被推荐,一般都是用一个指数衰减函数来量化动态的新旧程度。
三个分数,最终用相乘的方式共同作用于每一条新鲜事的分数,用于排序和筛选。
大家可以看出来,EdgeRank算法只考虑了社交因素,而没有考虑内容本身是否对用户有吸引力。因此后续Facebook引入机器学习,通过图像识别、语义分析等去预估新鲜事的质量,同时引入更多判断维度,例如阅读时长、视频内容、用户反馈等,去综合判断一条消息的权重。同时,FB 严格限制商业广告和普通用户的触达,网红营销号的消息曝光率从2016年的16%降低到2014年的6%。
总结一下:
智能FEED让用户在使用应用的有限时间内阅读到最感兴趣的内容,从而提高用户的粘性。
不按时间线排序,可以更自由安排广告的插入。这也是Facebook上广告大卖的原因。
自由控制内容,人为干预削减社区内的不利内容(如段子、鸡汤、微商)
得益于此,Facebook多年来一直保持高速增长,社区氛围没有崩坏。而隔壁坚持时间信息流的Twitter早已增长乏力。
2.2 微博的策略
微博大体上借鉴了Facebook的算法思路,主要也是基于LR算法(协同过滤)来做的。但是做了以下创新:
微博发现用户错过的90+%信息中,只有部分内容是对用户具有极高价值且不容错过的,所以这里无需对未读Feed全排序,只需要将最高价值的信息找出来并推荐给用户,其它的Feed仍按正常时间序排列。这样做一方面可以让Feed流整体上符合Timeline的排序,用户感觉自然流畅;另一方面,与用户对最高价值的信息认知上比较接近,算法效果比较理想。
推出了“未读池”功能 即你关注的用户发布的内容,只要是你还没看到过的都会进入未读池。当你刷新FEED的时候,会按照算法权重高低每次取出15~30条。未读池功能很好地解决了“有价值的内容没有被看到”和“无聊的时候没内容可以看”两大难题,是一个不错的点子。然而,因为未读池里内容的时间限制为3天,导致用户习惯性去刷新看看朋友有没有发布新消息的时候,却刷出了3天前的消息,从而又引来一片骂声。
3 总结和风控
智能FEED对于普通用户而言,可以帮助其提升阅读效率,第一时间看到感兴趣的内容,剔除没营养的垃圾信息,无论是关注太少没内容可看还是关注太多内容泛滥的用户,都能获得一个更佳的阅读体验。对于平台而言,可以提升用户的活跃度、互动率、留存率,同时控制社区氛围的质量,最重要的是为商业变现做好了铺垫(大幅降低网红、营销号的内容曝光,迫使企业必须使用平台自身的广告服务)
但是,智能FEED带来的一系列负面影响,包括:
将用户的操作行为公布给其所有粉丝,损害了用户隐私,让用户不敢随意点赞
混乱的时间线,让用户在看好友动态的时候一头雾水
普通用户主动发布的部分正常内容(如长图、转发等)也会被降权
这些问题虽然远不及智能FEED带来的好处,但是长此以往会给社区带来不佳的口碑,而口碑的损害可不是一朝一夕可以挽回的,因此一定要慎重处理,尽量做好每一个细节,才能让智能FEED发挥出最大的价值。
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 GDB抓虫之旅(中篇)
一篇文章看懂Facebook和新浪微博的智能FEED的更多相关文章
- 一篇文章看懂JS闭包,都要2020年了,你怎么能还不懂闭包?
壹 ❀ 引 我觉得每一位JavaScript工作者都无法避免与闭包打交道,就算在实际开发中不使用但面试中被问及也是常态了.就我而言对于闭包的理解仅止步于一些概念,看到相关代码我知道这是个闭包,但闭包 ...
- 一篇文章看懂angularjs component组件
壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中详细介绍了directive基本用法与完整属性介绍.directive是个很神奇的存在,你可以不设置templa ...
- angularjs 一篇文章看懂自定义指令directive
壹 ❀ 引 在angularjs开发中,指令的使用是无处无在的,我们习惯使用指令来拓展HTML:那么如何理解指令呢,你可以把它理解成在DOM元素上运行的函数,它可以帮助我们拓展DOM元素的功能.比如 ...
- 一篇文章看懂spark 1.3+各版本特性
Spark 1.6.x的新特性Spark-1.6是Spark-2.0之前的最后一个版本.主要是三个大方面的改进:性能提升,新的 Dataset API 和数据科学功能的扩展.这是社区开发非常重要的一个 ...
- 一篇文章看懂JS执行上下文
壹 ❀ 引 我们都知道,JS代码的执行顺序总是与代码先后顺序有所差异,当先抛开异步问题你会发现就算是同步代码,它的执行也与你的预期不一致,比如: function f1() { console.lo ...
- rabbitMQ教程(二)一篇文章看懂rabbitMQ
一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...
- 一篇文章看懂Java并发和线程安全
一.前言 长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章. 二.导读 1.为什 ...
- rabbitMQ教程(三)一篇文章看懂rabbitMQ
一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...
- 一篇文章看懂iOS代码块Block
block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返 ...
随机推荐
- 前端三剑客之javascript
前端三剑客之javascript 给个小目录 一.JavaScript介绍 二.ECMAScript(核心) 三.BOM对象(浏览器对象) 四.DOM对象(文档对象模型) 总结: JS的组成: a ...
- react的setState使用中遇到的问题
setState()更新的数据和自己预期的不一致 对 React 新手来说,使用 setState 是一件很复杂的事情.即使是熟练的 React 开发,也很有可能因为 React 的一些机制而产生一些 ...
- java网络编程—TCP(1)
演示tcp的传输的客户端和服务端的互访. 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1,建立socket服务.指定要连接主机和端口. 2,获取socket流中的输出流. ...
- ArcMap中提取影像数据边界
1.前言 客户手里有一些经过裁剪的不规则多边形影像数据(如图例所示),希望能批量获取该类影像的边界信息,即影像对应的面信息,边界线信息.这里我们提供一种利用镶嵌数据集Footprint图层的方法来获取 ...
- Linux文件的三个时间属性(Atime,Mtime,Ctime)
Linux下,一个文件有三种时间,分别是: 访问时间:atime 修改时间:mtime 状态时间:ctime 访问时间:对文件进行一次读操作,它的访问时间就会改变.例如像:cat.more等操作,但是 ...
- zabbix-2.2.2(Ubuntu 14.04 LTS/OpenLogic 7.2)
平台: arm 类型: ARM 模板 软件包: apache-2.4.7 mariadb-5.5.50 mysql-5.5.52-0ubuntu0.14.04.1 php-5.4.16 php-5.5 ...
- HDU 3697 Selecting courses 选课(贪心)
题意: 一个学生要选课,给出一系列课程的可选时间(按分钟计),在同一时刻只能选一门课程(精确的),每隔5分钟才能选一次课,也就是说,从你第一次开始选课起,每过5分钟,要么选课,要么不选,不能隔6分钟再 ...
- 文件IO——将文件dfs的文件内容第三个字节之后的内容复制到文件dfd中
/* 使用文件IO将文件fds中的内容复制到文件fdd中去 1.创建两个文件描述符 2.使用open()方法分别以只读只写方式将文件描述符符文件连接 3.将读位置后移三位 4.将fds内容存储到缓冲区 ...
- js 正则匹配(去掉html标签)
正则匹配去掉所有html标签 var a = "<span>999</span>" a = a.replace(/<[^>]+>/g,' ...
- POJ 2104 K-th Number(分桶,线段树,主席树)
一道比较经典的数据结构题.可以用多种方式来做. 一,分桶法(平方分解). 根据数字x的大小和区间内不大于x的数字数量cnt的单调性,可知第k大数kth对应的cnt应该满足cnt≥k, 且kth是满足条 ...