Reculike : 开源论文推荐系统
今天这篇博文主要总结一下reculike的系统架构。两周前我们宣布发布了reculike的alpha版。本着分享的原则,今天在这儿介绍一下我们的各个模块的设计方法。
我们这个项目一开始叫paperlens,这是因为我们想学习业界的前辈movielens,开发一个源代码和数据都开源的系统。关于数据的开源,我想当用户数达到一定程度后,每个月会dump一次我们所有的数据库(密码等隐私信息除外),放到网络上供大家下载。至于为什么后来改成reculike,第一个原因是paperlens的域名已经被注册了,第二个是学习另一个著名的论文网站citeulike。
做reculike的动机来自于我们准备写一本推荐系统的书,我们不希望这本书中的讨论都是偏离实际的夸夸其谈,所以准备做出一个实际系统作为本书的例子。所以,reculike将是我们接下来要出版的一本有关推荐系统的书中的主要例子。
上面这张图是reculike的整个架构,整个reculike由下面几个部分组成
1. Importer 数据导入模块
该模块从DBLP,CiteSeer,CiteULike等著名的论文数据集导入论文的内容数据到内容数据库。这些内容数据包括了论文的作者,会议期刊名,发表年代,摘要,用户的tag(从citeulike),论文的下载地址(从citeseer),论文的引用关系(从citeseer)。最终论文数据库中有170万篇论文,其中30万篇有下载链接,100万左右的作者。
2. 搜索引擎
搜索引擎是论文推荐系统中不可或缺的一个部分。一方面,搜索论文是很多用户的需求。reculike用了sphinx作为我们的搜索引擎。在最终论文排名方面,除了查询词和论文的匹配度外,我们主要强调了3点。第一是论文本身的引用数,引用数高的论文排在前面。第二点是论文所属的会议的平均引用数,对于一些NB会议/期刊的新论文,这一点是主要的考虑。第三是论文的发表年代,如果论文是近几年发表的,会有比较高的权重。
3. 推荐系统
一个成熟的推荐系统包含了2个主要模块
- 用户反馈界面
- 推荐算法
对于用户反馈方式,我们设计了两种主要的用户反馈:
- Bookmark : bookmark是表示用户对这篇论文有兴趣,希望记录下来,后面详细阅读
- Recommend : recommend表示用户对这篇文章很熟悉,向大家推荐这篇文章,并且愿意解答用户关于这篇文章的问题
因此,在一般情况下,普通用户可以bookmark论文,而专家用户可以推荐论文。用户像推荐论文的专家提出问题。
此外,系统还使用了其他用户行为,比如用户google了论文,或者用户点击了论文的链接,另外还有用户的搜索记录。
对于推荐算法,我们主要使用了基于物品的邻域算法。该算法给用户推荐和他以前喜欢的论文相似的论文。因此,计算论文的相似度是该算法的核心。注意到我们的开发环境只有1.7G的内存,而我们一共有170万篇论文,因此计算170万篇论文的相似度还是一个挺艰巨的任务。由于目前我们没有太多的用户行为数据,因此我们使用了论文的内容数据,包括作者和标题。
这里在计算和一篇论文标题相似的论文时,我们直接调用了sphinx搜索引擎来搜索这篇文章的标题。这样做效果不是特别的好,但在开发人员和资源有限的情况下也是一种不错的选择,毕竟让系统work起来是第一位的。
此外,可以看到我们的推荐结果也都是有解释的。这些解释大都是基于你过去的行为给出的。
4. Site/API
我们的前端界面用PHP写成,Site通过调用API的XML返回结果来生成页面。而API负责从数据库或者后台程序中得到数据,拼成XML提供给Site,所以Site不会直接调用数据库。这样做的好处是,这一套API我们会在将来公开,这样别人也可以通过调用API生成自己的界面
———————————————————–
好了,上面介绍了整个系统的大概框架。最后说一下系统的开发人员。系统的主要开发人员是一群学生。其中的主要代表是北大的两个学生:guojin和wangxing。谢谢他们的努力开发,才使reculike尽早的上线。
关于RecULike的更详细的介绍,我将在这周末去42区做一个报告。晚些时候会给出PPT,欢迎大家拍砖。