来,做一个社会化推荐引擎
什么是社会化推荐(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看看。
I will wait for you on the other side.