什么是社会化推荐(Social Recommendation,SR)?
这里我们暂且定义IT人群常用的社会化分享媒体包含以下三类:
微博客;(RSS)阅读器分享;网摘收藏。
关于社会化媒体的memeTracker,有针对GoogleReader的RssMeme(包括曾经的ReadBurner、国内的Kuber做的feedzshare),针对twitter的tweetmeme和twemes(twemes是需要tweet运用#符号来形成topic聚合),FriendFeed甚至于能够在好友范围内自动汇总各种lifestreams导入的分享链接。FriendFeed能如下图所示,把不同类型的分享源合并:
FriendFeed这个功能是针对你所订阅的范围内进行链接合并(能处理tinyURL),RssMeme和tweetmeme都是针对单一站点进行不区分用户的链接聚合,玩聚SD和Techmeme都是针对有选择的高质量信息源进行社会性对话聚合的(既包含链接计算也包含文本关联计算)。
那么,我们可以不可以把这三种类型合起来,衍生出一种新服务:社会化推荐呢?激发这个想法的应该是12月5日读到pongba发起的讨论《一个整合的阅读共享方案》吧,就是寻找一个方案,既能分享有价值的信息,又能具有一定的视野发散度,尽量削减信息爆炸,又能考虑到收藏者的权威度。
那么社会化推荐可定义为:
选择一批IT业界人士的社会化媒体分享源,如曹增辉、冯大辉的GoogleReader分享,白鸦、困兽的twitter,张亮的饭否,还有叽歪de、delicious等等。对这些信息源的分享链接进行汇总,一个信息源推荐就算一票,综合票数、信息源权重、推荐时间点、信息源类型等多种因素,最终形成像鲜果热文、digg或Reddit一样的跨平台社会化推荐引擎,并进一步引入语义关联技术,进化到协同过滤+语义过滤的自动化系统。
说干就干,毕竟这对于技术人员来说,很容易实现。用了两个周末,终于把测试版放上来了:请点击玩聚SR,建议用Firefox浏览。
SR Rank的计算公式
对于分享过来的众多热文链接,肯定要有一个Rank值作为排序依据。我们定义为SR Rank。
Guwendong12月17日披露了Reddit的社会化媒体算法,我们参考了它的公式,总结了玩聚SR的公式,如下所示:
A 为某篇文章的具体发布时间,精确到秒;B 为一个固定的时间常量,2008-12-01 00:00:00。则可以计算得到 A 和 B 间隔的秒数 ts。
ts=A-B
M表示某篇文章的来自于微博客的推荐次数,R代表来自于阅读器分享的分享次数,D代表来自于网摘收藏的次数。引入不同权重因子,则可以计算得到变量Z:
Z=M*3+R*1+D*0.8
最后定义 SRRank 公式为,
SRRank=log10Z+ts/45000
参数注解基本和Reddit一样,不同的就是没有反对票:
1)时间点 B,2008-12-01 00:00:00,是一个固定的值。ts 反映了文章的新鲜程度。引入 B 是一个非常优雅的技巧,它使得新鲜度的度量可以独立于系统当前时间。
2)45000 代表的是一个 12.5 小时周期内的总秒数。它 与 ts 一起使用,随着时间的推移,新文章的得分会逐渐超越高投票数的老文章,从而实现自动更新的效果。
3)log10 的使用是另外一个技巧,它可以使得早期的投票获得更大的权重。比如,前 10 票获得的权重,与 11 到 101 票所获得的权重是一样的。
如何选择信息源:
选择十几位或几十位IT、互联网、设计方面的意见领袖的微博客或FriendFeed,然后机器遍历他们的friends列表即可得到一大批社会化媒体活跃用户。从统计学意义上说,得到的这一群人就是贴近IT科技的趣味的。(饭否和叽歪de也可以如此获得。)
(所以你能看出GFC的作用,起码她可以让你从意见领袖遍历所有活跃的互联网ID。)
对于GReader,则没有这种朋友的朋友关系课遍历,只能从feedzshare那里遍历获取。
自动收集这么一大批社会化媒体用户之后,还需要过滤掉哪些用户呢:
1、最近两个月没有新动作的;
2、英文发布的;(多半分享的页面也不是中文的。不少意见领袖的Friends中都有国外一大批顶尖Blogger,除去,必须的。)
3、从不分享链接地址的。
4、设置更新保护的(This person has protected their updates)。
5、只分享自己名下的Blog或网站链接的。
6、官方twitter,如bbcchinese。
7、分享链接的动作实际都是从其他阅读器或FriendFeed激发过来的。
8、谈论对象基本不涉及大陆的繁体/日文语言的twitter。
9、基本不谈及IT的。
10、总是发表敏感言论的。没辙,GFW的语义是很强大的。
11、原则上同一个人(真人)只保留一个信息源,比如同时抓取回了twitter、jiwai的帐号,就禁用其中一个,尽量避免重复计票。
规则挺多的吧?这些都是要人工看喽,还要打Rank分呢,工作量蛮大的。不过和 玩聚SD 最开始收集审核优质Blog源一样,建立之初的工作量较大,之后就轻松了,绝大多数工作都是机器完成的。
必须处理缩短URL的那些服务
twitter等miniblog中分享的链接很多都是缩短链接服务的网址,以至于需要用如下正则表达式来匹配:
metaUrlPattern = re.compile("(feedproxy\.google\.com|item\.feedsky\.com|tinyurl\.com|snurl\.com|ff\.im|bit\.ly|tr\.im|zuosa\.net)",
re.IGNORECASE);
网民们用的还花样蛮多的,所以只能发现一个处理一个,:D。对于这些缩短链接服务,需要发送HEADER命令探测到底302跳转到哪一个链接了,因为你必须统计真正的分享地址。
数据源必须来源广泛否则容易失真
默认的最热热文榜单的大多数排序较理想,少数几个排序离奇。估计确实是因为微博客权重高,一下就把SRRank值推高的缘故。
我预先都给微博客等信息源打了UserRank分,算是一个推荐者的权重,还没有考虑进公式。如果这个因素考虑进去,那么意见领袖的微博客推荐将大大增加得分。所以,必须加多监控用户源,否则当推荐数少的话,放大因子就放大得太多了,以至于失真了。
先说这么多。如果你对社会化推荐感兴趣的话,不妨到测试版的玩聚SR看看。
http://www.cnblogs.com/zhengyun_ustc/archive/2008/12/22/ju690_sr.html
在阅读本文之前,我们强烈建议您阅读一下郑昀 的《来,做一个社会化推荐引擎》和《一个想法从构思到实现只需7天》,本文所讨论的议题以及我们正在做的事情,都始于他以前在相同领域的工作与思考。我们的测试版社会化推荐引擎取名为“玩聚猫”(http://dullcat.com) ,也是在名称上延续郑昀在三年前发布的同类产品“玩聚SR”。
当然,我们并不是在探讨如何简单地复制郑昀以前的工作,而是探讨如何站在巨人的肩膀上,把社会化推荐引擎做得更好、更全面、更讨用户喜欢。
郑昀在三年前对此的定义是“选择一批IT业界人士的社会化媒体分享源,如曹增辉、冯大辉的GoogleReader分享,白鸦、困兽的twitter,张亮的饭否,还有叽歪de、delicious等等。对这些信息源的分享链接进行汇总,一个信息源推荐就算一票,综合票数、信息源权重、推荐时间点、信息源类型等多种因素,最终形成像鲜果热文、digg或Reddit一样的跨平台社会化推荐引擎,并进一步引入语义关联技术,进化到协同过滤+语义过滤的自动化系统。”
由于数据源的原因,郑昀的定义比较强调“IT业界人士”,而我们想淡化这一点。
我们认为,社会化推荐系统是从社会化媒体中,根据一系列的算法,发现热门内容的系统。其使用的算法除了常规的数据挖掘、聚类外,主要是对各种信息源的『分享行为』进行汇总,对『分享行为』进行加权,综合『分享行为』的数量、信息源权重、推荐时间点、信息源类型等多种因素。她能分享最有价值的信息,能具有视野发散度,能削减信息爆炸。
『分享行为』是指用户在社会化媒体中对特定内容进行分享的行为,包括但不限于新浪微博的“转发”、人人网的“喜欢”、Google Plus的“+1”、以及Digg类网站的“顶”等等。
原因很简单的,诞生于三年前的郑昀版社会化推荐系统有他的局限性:
a)由于过分依赖于IT业界人士,所推荐的内容难以吸引非IT人士
b)数据源较少(无论是种类还是数量),Google Reader Shared Item和Twitter占据了超过85%的信息。
c)由于b),没有形成在更大范围通用的排名公式。
d)没有像Google PR( Google PageRank)那样的指标,无法向用户直观地体现特定文章的价值。
e)推荐者权重模型(如名人效应)没有得到体现
因此,我们打算重新发明车轮,进行一场新的社会化推荐革命!
我们把国内社会化分享媒体分为以下四类:
a) 微博、轻博客类。包含腾讯微博、新浪微博、网易微博、点点网、新浪Qing等;
b) SNS类。包含人人网、开心网、腾讯朋友等;
c) 书签、网摘类。包含强国网摘、CSDN网摘系统、爱库网、QQ书签、有道书签、百度搜藏等等;
d)RSS阅读器。包含Google Reader、鲜果、抓虾、豆瓣9点等等。
上文也零星提及了一些,归纳起来有以下几点重要差异:
a) 『分享行为』类型不同。新浪微博有“转发”、人人网有“喜欢”、豆瓣9点有“推荐”、有的网站只有“阅读量”。
b) 网站权重不同。例如爱库网上最热的内容,权重肯定没有新浪微博上同一时间最热的内容权重高。
c)『分享行为』发起人的权重不同。例如李开复转发了一条微博,权重会比50个我转发同样一条微博更高。
d) 『分享行为』的时间也会影响权重。很多时候对于同一信息源、同一内容的『分享行为』是呈指数衰减的。例如在郭美美事件,我第一次在新浪微博看到时已经拥有了两万次转发,我看完后决定转发第两万零一次,明显我的这次转发的权重比第两千零一次转发的权重小。
e) 考虑去重复。例如我同时在我新浪微博和腾讯微博转发了同样一条微博,只能计数一次。
当然,我们希望这些差异对用户透明,因为用户不需要了解这么多。用户只需要一个类似Google PR的数字直接了当地告诉他文章价值就可以了。
所以我们引入了SR(Social Rank),范围0~10,标识在每篇文章的标题后面。一篇文章的SR能够精确表示它在其他各种社会化媒体的火热程度。
设置我们有N种数据源,分别是 {S1,S2,S3….Sn} ∈ S
如前文所述,数据源有4种类型,分别是{T1,T2,T3,T4}∈ T。
设类型权重 {WT1,WT2,WT3,WT4}∈W T
对于数据源Si ,
设数据源自身权重为SW(i), SW(i)由网站的Alexa排名、PV量、修正值决定。
T(i)表示它所属于的分类,WT(T(i) ) 表示Si的类型权重
在计算某篇文章的SR时,设A(i) 是该文章在Si数据源里的『分享行为』计数。
那么,
对于这篇文章而言,
SR = Logx ∑i=1..nA(i) ×WT(T(i) )× SW(i)
为什么是Logx 呢? 有两点原因,一是它可以使得早期的投票获得更大的权重,比如,当x=10时,前 10 票获得的权重,与 11 到 101 票所获得的权重是一样的;二是使信息的层级呈金字塔型分布,就像Google PR、地震里氏等级一样。
Logx 中x的取值非常重要,玩聚猫的取法是这样的:从已知的m篇预料信息中计算最大的推荐价值
MaxV= Max( Vj= ∑i=1..nA(i) ×WT(T(i) )× SW(i) | j=1..m )
由于SR的范围是0至10,我们令 x^10 =MaxV
从而计算出 x = 10√MaxV
如果MaxV为35000,则X应该设定为2.847,SR = Log2.847 ∑i=1..nA(i) ×WT(T(i) )× SW(i);推荐价值约200的文章SR为5,推荐价值约4500的文章SR为8,推荐价值大于35000的文章SR为10。
通过这样的公式,为每篇文章都计算出一个Rank值,用户就能直观又精确地了解到文章的价值了。
×注意:玩聚猫的SocialRank和《来,做一个社会化推荐引擎》里提到的排序依据SR Rank不同。玩聚猫的SR跟列表排序依据没关系,只跟内容本身的价值有关系;郑昀 只跟排序有关系。
我们正在以下领域进行奋斗:
1.强化用户权重系统,尤其是引入模糊计算和估值,强调名人效应。
2.通过实验数据,不断改进排名算法。
3.引入智能语义、自然语言,使玩聚猫在面对文本信息时,能够以人类而非机械的方式进行思考、归类、关联、过滤、总结。
4.引入机器学习(如Prediction),使玩聚猫能够记住每一个用户的口味,个性化地推荐文章。
如果你对社会化推荐感兴趣的话,不妨到玩聚猫看看(目前是测试版本,服务器在国外,可能不太稳定,请见谅)。我们热忱欢迎您的一切宝贵意见、建议和批评。
http://www.cnblogs.com/azure/archive/2011/11/30/Social_Recommendation.html