基于动态网络图挖掘的Github开源代码库推荐系统的制作方法

文档序号:14519261阅读:511来源:国知局
基于动态网络图挖掘的Github开源代码库推荐系统的制作方法

本发明利用从公开数据源采集的github开源代码库数据,构建以天为单位进行更新的动态网络图,并在此基础上设计数据挖掘算法与交互式界面,向用户提供综合且行之有效的个性化开源代码库推荐系统。确切地说,是涉及到网络信息采集(数据爬虫)、社交网络数据挖掘与推荐系统技术的数据科学技术领域。



背景技术:

在推荐系统领域中,随着诸如协同过滤、personalrank算法等推荐算法的普及,面向用户个人需求的个性化推荐系统已成为众多内容服务类产品中不可或缺的信息服务。当前,在电子商务、电影、图书、音乐、新闻等领域中,优秀的个性化推荐系统能够允许用户更有效地获得与期待相符的信息,进而提升对服务的满意程度。

当前,在包括上文所述的众多领域,推荐系统已获得广泛应用。但是在以github为代表的开源代码库领域,有效的个性化推荐系统仍然有待发展。在本发明的调研阶段,可以发现,诸如githubranking和githubexplore等现有推荐服务均采用非个性化推荐的模式;而在相关个性化推荐算法的研究中,所使用的数据又均为静态数据集,不具备实时性与市场化能力。综上所述,可以认为,在开源代码库这一领域,个性化推荐仍然处于萌芽期。

与此同时,当前推荐系统的支持技术,包括数据服务(githubarchive平台与github数据接口)、爬虫技术与推荐算法已基本趋于成熟。因此以成熟技术为基础,利用公开数据源构造开源代码库上的社交网络数据结构,并在此基础上进行有效的数据挖掘与分析,构造个性化推荐系统,一方面能够确保软件开发者在开发过程中能够更加有效地寻找所需要的开源代码库,另一方面也能够为处在学习期的相关人士提供有效的源码学习资源,起到加快学习与开发效率的积极意义。



技术实现要素:

本发明的目的在于克服现有技术中存在的不足,提供一种基于动态网络图挖掘的github开源代码库推荐系统,围绕github平台实现,旨在提供一种行之有效的实时开源代码库个性化推荐系统,以网站服务的形式,向开发者提供与时俱进、且与用户个人需求密切关联的代码库推荐服务。本发明采用的技术方案是:

一种基于动态网络图挖掘的github开源代码库推荐系统,包括:

任务调度模块、演示网站中的用户交互页面、推荐算法模块、日志管理模块、以及数据库;

任务调度模块负责控制推荐算法模块的推荐结果更新和至少部分数据爬虫的运行;

日志管理模块从多方获取数据信息,并向其他模块开放查询接口;

推荐算法模块则根据相关数据计算推荐列表;相关数据将根据不同需要存储在不同类型的数据库,包括文档式数据库、图数据库和内存数据库三种数据库。

进一步地,图数据库中主要实体包括用户、代码库、编程语言、排名四项,用户的行为包括:创建代码库、成为代码库的成员,贡献代码、提问、收藏、复制、关注其他用户;

以不同时间粒度为基准,代码库拥有多种形式的排名,以创建于属性标注排名产生时间;此外,开发者使用一种或多种编程语言编写代码库,语言名称以语言名称属性描述;对于用户,图数据库存储其编号、头像地址、邮箱、用户名与登录用户名;对于代码库,存储其编号、代码库名称、收藏人数、关注人数与复制代码库数量;

在文档式数据库和内存数据库中缓存推荐列表。

进一步地,

日志管理模块的主要目的是存储用户的行为日志以供推荐算法进行挖掘;这一目的是通过自动化的数据爬取和记录网站与用户的交互行为两种方式实现的;日志管理模块中实现了以下数据爬虫:

第一数据爬虫:基于wget远程数据请求指令与py2neo的githubarchive平台数据爬虫;该爬虫定时从githubarchive数据平台抓取存储的用户行为日志,将其转换为图数据库格式的数据条目,存储至图数据库中;

第二数据爬虫:基于scrapy的热门代码库定时信息更新程序;该程序使用github数据接口爬取数据,按照收藏人数排名对收藏人数高于设定值的代码库的信息在图数据库中进行更新,对不存在的代码库在图数据库中予以创建;

第三数据爬虫:基于scrapy的用户信息爬取程序;该程序在用户许可的权限内,抓取用户的基本信息以及用户所收藏的代码库和所关注的其他用户,以此建立用户的个人喜好档案,为推荐算法提供便利;

第四数据爬虫:基于scrapy的代码库信息爬取程序,该程序抓取所有收藏了指定代码库的用户列表并保存至图数据库中;

第五数据爬虫:基于scrapy的代码库信息爬取程序,程序抓取指定代码库的详细信息并据此更新图数据库;

第一数据爬虫和第二数据爬虫根据任务调度模块所设计的规则执行,而第三、四、五数据爬虫则是通过用户的交互式行为触发的。

更进一步地,触发第三、四、五数据爬虫的规则如下:

1)当用户使用github账户登录时,系统将在获得用户授权后,调用第三数据爬虫获取来自github的用户的个人喜好档案;

2)当用户访问代码库详情时,系统将调用第四数据爬虫和第五数据爬虫更新代码库信息。

更进一步地,日志管理模块使用github提供的数据推送服务,在系统获得用户的数据推送授权后,github将向系统实时推送用户在github上执行的各项行为,系统将在接受到推送后,通过日志管理模块将相应数据存储至图数据库中。

进一步地,任务调度模块主要用于控制推荐算法模块的推荐结果更新和部分数据爬虫的运行;具体的更新规则如下:

深夜预设的第一时刻——设置所有代码库为过期状态;

深夜预设的第一时刻——更新代码库排名信息;

深夜预设的第一时刻之后数分钟的一个时刻——利用第二数据爬虫更新图数据库;

每小时——利用第一数据爬虫更新图数据库。

更进一步地,任务调度模块中包括一负载均衡策略,在该负载均衡策略中,存在管理者与执行者;管理者负责调度与负载均衡,执行者负责执行接口的调用;具体的实现分为三个不同的方面:

1)初始化:在系统启动时,系统将首先利用oauth应用服务与部分内置帐号,设立一组基本执行者,并将这些基本执行者加入到一个由管理者管理的执行者列表中;

2)登录:当用户登录时,系统将使用oauth授权接口所提供的后续服务,获得相关的使用令牌,根据这一使用令牌新建一个执行者实例,并将这一执行者实例加入到由管理者管理的执行者列表里;

3)查询:当用户执行查询时,系统首先向管理者索要执行者实例,管理者在维护执行者列表时会通过github频次接口获得所有执行者的剩余访问次数,并向系统提供当前剩余访问次数最多的执行者,从而实现负载均衡。

更进一步地,负载均衡策略功能仅允许登录后的github用户通过与自身账号对应的执行者来使用,并且每2秒内仅允许发起一次搜索请求。

进一步地,推荐算法模块中,

包括离线设置的personalrank算法:

对github用户针对代码库所执行的各项行为记录进行量化;将收藏、提问、复制、贡献代码与合作这些行为定义成五个不同级别,分别赋予相应的分数;然后建立行为与事件之间的对应关系;

利用上述分数计算personalrank算法中的跳转概率矩阵,最终计算得出的代码库对于每个用户的评分结果缓存在文档式数据库中;对评分结果进行排序,选取评分最高的一个或一组形成推荐列表,作为最终的推荐结果向用户进行推荐;

包括基于社交网络的关联推荐算法:将开发者对代码库产生兴趣的两种行为模式转换为推荐算法,转换为以下两种模式:

1)收藏了当前代码库的用户也关注了其他哪些关联的代码库;

2)所关心的用户关注了哪些代码库;

即以这两种模式构造了语义等价的两个推荐算法;在算法的实现上倚仗图数据库所提供的子图匹配查询,以图模式进行查询并进行相关聚集、评分与排序;评分为所有与关联代码库有关的关注行为的评分总和;对评分结果进行排序,选取评分最高的一个或一组形成推荐列表,作为最终的推荐结果向用户进行推荐;

包括基于排名的推荐算法;基于排名的推荐算法分为两部分,

第一部分是时段排名,在行为评分基础上,对代码库在一定时段内的所有行为进行加和并按从大到小顺序排序;此部分的排名是离线的;

第二部分是综合排名,使用了代码库收藏数目作为排序基准,此部分的排名是在线的;

在排序基础上形成推荐列表;

最后进行组合算法:对推荐算法进行组合,用高覆盖率的推荐算法接续低覆盖率的推荐算法,确保推荐列表不会发生中断。

更进一步地,personalrank算法中设有一分表策略,在该分表策略中,缓存推荐结果的集合有两个,分别进行不同的标记,此外有一标记集合用于存储当前所使用的缓存推荐结果的集合的标记;更新与查询的流程如下:

a)更新:

1.读取标记集合,获知当前系统正在使用哪个集合作为推荐结果的缓存;

2.选中另一非使用的集合;

3.将更新后的推荐结果缓存到另一集合中;

4.更新标记集合中的标记为选中集合对应的标记;

b)查询:

1.读取标记集合,获知当前系统应从哪个集合中读取推荐列表;

2.选中该集合;

3.进行相关查询。

进一步地,用户交互页面包括:

首页,设有上下导航栏;在首页页面左下部设有基于社交网络的关联推荐算法所产生的社交关系推荐列表;页面上部呈现当日的代码库热度排名的前三位;页面右下部呈现由personalrank算法所产生的主要个性化推荐列表;

排名页面,页面上设有设定靠前名次的排名列表;排名列表条目包含名称、收藏人数与排名,页面上还设有每日排名、每周排名、每月排名与全局排名的链接;

全局排名页面,页面上部设有根据编程语言热度进行排名的单词云,点击单词云中的编程语言标签,点击后页面下部的排名将自动根据被选中编程语言进行筛选;

代码库详情页面,页面最上方显示代码库的名称,其左侧设置一可点击按钮,空心状态表明当前代码库未被当前用户收藏,实心状态反之;下方页面左侧用于显示代码库的说明文档;下方页面右侧分三部分,第一部分是代码库的基本信息,第二部分是相关统计信息,第三部分为关联代码库推荐;

搜索页面,设有供用户键入相关搜索语句的搜索框;在页面下方设有与高级搜索有关的输入内容,包括代码库的所有者、是否是经复制创建的代码库、排序原则与顺序、使用的编程语言。

本发明的优点在于:一方面能够确保软件开发者在开发过程中能够更加有效地寻找所需要的开源代码库,另一方面也能够为处在学习期的相关人士提供有效的源码学习资源,起到加快学习与开发效率的积极意义。

附图说明

图1为本发明的系统模块组织架构图。

图2为本发明的数据库概念模型示意图。

图3为本发明的数据爬虫所依赖的负载均衡解决方案示意图。

图4为本发明的数据更新策略中的分表缓存策略示意图。

图5为本发明的cypher数据查询语言使用范例示意图。

图6为本发明的用户交互界面的首页示意图。

图7为本发明的用户交互界面的排名页面示意图。

图8为本发明的用户交互界面的全局排名页面示意图。

图9为本发明的用户交互界面的代码库详情页面示意图。

图10为本发明的用户交互界面的搜索页面示意图。

具体实施方式

下面结合具体附图和实施例对本发明作进一步说明。

本发明提出一种基于动态网络图挖掘的github开源代码库推荐系统,以下简称系统。

系统利用github数据接口与githubarchive数据平台作为数据源进行数据采集,在图数据库neo4j中建立社交网络数据图谱,并在此基础上,一方面利用数据爬虫与github数据推送服务(githubwebhook)实时更新网络数据;另一方面设计有关推荐算法与用户交互界面,向用户提供推荐服务。

该系统的架构如图1所示;系统在最顶层共分为任务调度模块与演示网站两部分;

任务调度模块负责控制推荐算法模块的推荐结果更新和至少部分数据爬虫的运行;

演示网站包括浏览器端的用户交互页面与服务器端的基于django(python语言下的网站服务框架)的网页服务系统两部分;前者为推荐系统的主要服务模块,后者主要用于行为日志的采集,以向推荐系统提供充足的数据支撑;

更底层地,系统又包括推荐算法模块与日志管理模块两部分;日志管理模块从多方(包括经由数据爬虫取得的第三方数据与用户经过交互界面留下的行为数据)获取信息,并向其他模块开放查询接口;推荐算法模块则根据相关数据计算推荐列表;相关数据将根据不同需要存储在不同类型的数据库,包括mongodb文档式数据库、neo4j图数据库和redis内存数据库三种数据库。

为更为详细地说明本发明的实现细节,以下部分将对系统的具体实施方式进行介绍,主要内容包括数据库设计、日志管理模块设计、任务调度模块设计、推荐算法模块设计与用户交互界面设计五部分。交互式逻辑在服务器端的实现本身不属于专利所关注的内容,故在此不做赘述。

(一)数据库设计;

根据对github平台的调研,最终系统的数据库概念模型设计如图2中实体-关系图(e-r图)所示。其中所有字段类型与含义均遵照github数据接口规范定义。由于使用了图数据库neo4j,因此无须将上述概念模型转化为关系表,而直接以数据实体(entity)对应图节点(vertex)且关系(relation)对应边(edge)的方式进行数据库设计。

图2中图数据库neo4j的主要实体包括用户(user)、代码库(repository)、编程语言(language)、排名(rank)四项,其中用户可以创建代码库(own)、成为代码库的成员(member),可以向代码库贡献代码(contribute)、提问(issue),也可以收藏(star)、复制(fork)代码库;用户还可以关注其他用户(follow),这些都是用户的行为。

以不同时间粒度为基准,代码库拥有(have)多种形式(type)的排名,以创建于(created_at)属性标注排名产生时间;此外,开发者使用(use)一种或多种编程语言编写代码库,语言名称以语言名称(name)属性描述;对于用户,图数据库存储其编号(user_id)、头像地址(avatar_url)、邮箱(email)、用户名(name)与登录用户名(login);对于代码库,存储其编号(repository_id)、名称(name)、收藏人数(stargazer_count)、关注人数(watch_count)与复制代码库数量(fork_count);

除上述内容外,系统还会在mongodb文档式数据库和redis内存数据库中缓存推荐列表,具体缓存和使用策略将会在后文中进行说明。

(二)日志管理模块设计;

日志管理模块的主要目的是存储用户的行为日志以供推荐算法进行挖掘;这一目的是通过自动化的数据爬取和记录网站与用户的交互行为两种方式实现的。

对于数据爬取功能,系统通过python语言实现了相关的数据爬虫,不同数据爬虫各司其职,互不影响,所实现的数据爬虫包括:

第一数据爬虫:基于wget远程数据请求指令与py2neo(python语言环境下的neo4j数据库管理组件)的githubarchive平台数据爬虫;该爬虫定时从githubarchive数据平台抓取以json数据格式存储的用户行为日志,将其转换为neo4j数据条目,存储至图数据库中;

第二数据爬虫:基于scrapy(python语言环境下的经典爬虫框架)的热门代码库定时信息更新程序;该程序使用github数据接口爬取数据,按照收藏人数排名对收藏人数高于设定值(比如90)的代码库的信息在图数据库中进行更新,对不存在的代码库在图数据库中予以创建;

第三数据爬虫:基于scrapy的用户信息爬取程序;该程序在用户许可的权限内,抓取用户的基本信息以及用户所收藏的代码库和所关注的其他用户,以此建立用户的个人喜好档案,为推荐算法提供便利;

第四数据爬虫:基于scrapy的代码库信息爬取程序,该程序抓取所有收藏了指定代码库的用户列表并保存至图数据库中;

第五数据爬虫:基于scrapy的代码库信息爬取程序,程序抓取指定代码库的详细信息并据此更新图数据库;

在上述数据爬虫中,第一数据爬虫和第二数据爬虫根据任务调度模块所设计的规则执行,并在获取数据后对数据进行整理,最终存储至neo4j图数据库中。而第三、四、五数据爬虫则是通过用户的交互式行为触发的,具体规则如下:

1)当用户使用github账户登录时,系统将在获得用户授权后,调用第三数据爬虫获取来自github的用户的个人喜好档案;

2)当用户访问代码库详情时,系统将调用第四数据爬虫和第五数据爬虫更新代码库信息。这是一种lazyupdate的思想,一旦有一个用户访问了这个代码库,更新后的信息将会惠及所有用户。

除此之外,日志管理模块还通过编写中间件(middleware)的形式插入至网站的服务器端业务逻辑中,中间件所记录的用户行为包括用户对代码库的访问记录(关注次数)、收藏行为等。为确保能够快速访问这些数据,行为日志的一部分将被缓存在redis内存数据库中。

此外,由于githubarchive数据平台的日志记录较github主站存在一定延迟,故为确保本系统的实时性,使用了github提供的数据推送服务(webhook),系统在获得用户的数据推送授权后,github将向系统实时推送用户在github上执行的各项行为,系统将在接受到推送后,日志管理模块将相应数据存储至neo4j图数据库中。

(三)任务调度模块设计;

任务调度模块主要用于控制推荐算法模块的推荐结果更新和部分数据爬虫的运行;具体的更新规则如下:

00:00:00a.m.——设置所有代码库为过期状态;

00:00:00a.m.——更新代码库排名信息;

00:05:00a.m.——利用第二数据爬虫更新图数据库;

每小时——利用第一数据爬虫更新图数据库;

在这一调度过程中有三个核心难点需要解决。其一在于用户数据的更新是不完全的,对于冷门代码库,上述调度流程无法保证数据的时效。前一小节中的第三、四、五数据爬虫即用于解决这一问题,故在此不再赘述。

第二个问题在于由于资源有限,githubminer无法保存所有github代码库信息与相关的用户日志(由于存在严重的长尾效应,这也并无很大必要)。为了确保在仅保存部分数据的条件下系统对github数据的高度覆盖,本系统采用一种动态增长的方式。这种动态增长同样体现在第三、四、五数据爬虫的设计。当用户首次使用系统时,系统调用第三数据爬虫为其构造相关记录;同理,对于一些冷门代码库,用户可以通过搜索服务首先进行搜索,在用户查看代码库详情时,系统一方面将调用第五数据爬虫将代码库数据存储至本地,另一方面还会调用第四数据爬虫抓取代码库的收藏用户信息。

最后一个问题在于如何在受数据接口访问频次限制的环境下尽可能提升系统的每小时并发量。针对这一问题,在研究过github的oauth授权接口后,设计了一种基于众包思想的负载均衡策略,具体方案如图3所示。

在这一方案中,存在管理者(master)与执行者(worker)两个关键的部分;管理者负责调度与负载均衡,执行者负责执行接口的调用;具体的实现分为三个不同的方面:

1)初始化(initialization):在系统启动时,系统将首先利用oauth应用服务与部分内置帐号,设立一组基本执行者(相关信息存储在配置文件中),并将这些基本执行者加入到一个由管理者管理的执行者列表中;

2)登录(login):当用户登录时,系统将使用oauth授权接口所提供的后续服务,获得相关的使用令牌,根据这一使用令牌新建一个执行者实例,并将这一执行者实例加入到由管理者管理的执行者列表里;

3)查询(query):当用户执行查询时,系统首先向管理者索要执行者实例,管理者在维护执行者列表时会通过github频次接口获得所有执行者的剩余访问次数,并向系统提供当前剩余次数最多的执行者,从而实现负载均衡。

在上述策略中,由于每个经过授权的执行者均能够获得5000次/小时的查询请求,而事实上每个用户每个小时完全无法用尽这些请求,因此这种供远大于求的现状将使得这一机制能够大幅开阔系统的并发量。

只有一个接口属于例外,即搜索接口,这一接口30次/分的限制看来太过苛刻,使用上述策略效果也不会十分明显,因此我们约定这一功能仅允许登录后的github用户通过与自身账号对应的执行者来使用,并且每2秒内仅允许发起一次搜索请求。

(四)推荐算法模块设计;

在推荐算法模块中,选用了如下几种推荐算法,并根据需要对它们进行组合使用;

首先实现了personalrank算法;由于用户的行为没有显式评分,因此需要对前文所述的github用户针对代码库所执行的各项行为记录进行量化;根据需求分析中所陈述的量化参考标准,将收藏(star)、提问(issue)、复制(fork)、贡献代码(contribute)与合作(collaborate)这些行为定义成五个不同级别,分别赋予1~5的分数,对应关系为star(1),issue(2),fork(3),contribute(4),collaborate(5);事实上,github的用户行为日志,即事件(event)数据与上述行为并非完全一一映射;对此,参考github事件数据接口文档对事件类别进行了分析,最终在行为与事件之间建立对应关系如下:

行为:事件

收藏(star):watchevent(关注事件)

提问(issue):issueevent(提问事件)、issuecommentevent(提问的回复事件)

复制(fork):forkevent(复制事件)

贡献代码(contribute):pushevent(提交事件)、pullrequestevent(合并代码库事件)

合作(collaborate):memberevent(成为成员事件)

更为具体地,算法中利用上述分数计算personalrank算法中的跳转概率矩阵,并为了减少内存占用,通过python环境下的scipy科学计算组件提供的稀疏矩阵存储相关相似度与评分信息,最终计算得出的代码库对于每个用户的评分结果将缓存在mongodb文档式数据库中,以便用户访问;对评分结果进行排序,选取评分最高的一个或一组形成推荐列表,作为最终的推荐结果向用户进行推荐;

考虑到算法的效率问题,将该personalrank算法设计为离线算法,每天凌晨完成重新计算后,当日中推荐结果不会进行更新,由此产生的无法动态响应用户新行为的问题由后续在线算法弥补,这样做的好处在于推荐算法本身不会与用户日志模块产生耦合,彼此均能够独立运作。此外,更新过程需要有数分钟的耗时,在这一时间中,若采用覆盖更新的方式,推荐算法在这段时间内将处于不可使用状态。为了消除这一影响,设计了一种分表策略,如图4所示;在该分表策略中,缓存推荐结果的集合(collection,即mongodb中的数据表)有两个,分别以0/1标记,此外有一标记(flag)集合用于存储当前所使用的缓存推荐结果的集合的标记;基于此设计,更新与查询的流程如下:

a)更新:

1.读取标记集合,获知当前系统正在使用哪个集合作为推荐结果的缓存;

2.选中另一非使用的集合;

3.将更新后的推荐结果缓存到另一集合中;

4.更新标记集合中的标记为选中集合对应的标记;

b)查询:

1.读取标记集合,获知当前系统应从哪个集合中读取推荐列表;

2.选中该集合;

3.进行相关查询。

更新策略最终能够保证数据的交替存储,不会产生过多的数据冗余;由于每次更新直到步骤4之前都不会对当前正在使用的数据产生任何影响,而步骤4中的数据更新仅需要数毫秒即可完成,因此分表策略能够有效地将空白期完整消除。

第二,实现了基于社交网络的关联推荐算法;从相关文献与采访中获知,开发者对代码库产生兴趣的行为模式有以下两种:

1)开发者的兴趣较为集中,会以特定代码库为基准,关注与之有关联的其他代码库;

2)开发者会对自己所关注的一些用户所关注的代码库产生兴趣;

将这两种开发者对代码库产生兴趣的行为模式转换为推荐算法,可以转换为以下两种模式:

1)收藏了当前代码库的用户也关注了其他哪些关联的代码库;

2)所关心的用户关注了哪些代码库;

即以这两种模式构造了语义等价的两个推荐算法;在算法的实现上倚仗neo4j图数据库所提供的子图匹配查询,以图模式:(r:repository)<-[]-(u:user)-[]->(r:repository)进行查询并进行相关聚集、评分与排序;其中圆括号与方括号分别对应前文数据库设计一节中提到的实体(entity)和关系(relation),以冒号后接实体/关系名称作为类别约束(由于需获得所有类型的关系以统计评分,故图模式中未对关系类别进行约束);

评分为所有与关联代码库有关的关注行为的评分总和(评分与personalrank算法采用相同标准)。最终查询将会以cypher数据查询语言的实例呈现,其中一例如图5所示。对评分结果进行排序,选取评分最高的一个或一组形成推荐列表,作为最终的推荐结果向用户进行推荐;

第三,实现了基于排名的推荐算法;基于排名的推荐算法分为两部分,第一部分是时段排名(日/周/月排名),这一部分的排名基准同样是在前文所述的行为评分基础上,对代码库在一定时段内的所有行为进行加和并按从大到小顺序排序;这一部分的排名是离线的,每天凌晨计算一次,此后新加入的数据在下一次计算之前不会被纳入考虑。第二部分是综合排名,这一部分由于用户行为数目较多,因此使用了代码库收藏数目作为排序基准,故是一在线算法;综合排名部分还按照代码库的语言进行了聚合,并计算出了相关语言的热度排名;用户还可以根据语言对代码库排名进行筛选。

最后,实现了基于内容的推荐算法,并以一随机猜测的推荐算法作为最坏情况的收尾推荐。这两部分的算法相对简陋,故不做赘述。

在推荐过程中系统需要解决冷启动问题,其中一部分解决方案已在前文有所介绍,为了确保完整性,故在这里重新做归纳整理。所使用的冷启动应对策略有如下几点:

1)从github抓取相关子图信息:参考前文中对第三数据爬虫与第四数据爬虫的介绍;

2)组合算法:对推荐算法进行组合,用高覆盖率的推荐算法接续低覆盖率的推荐算法,确保推荐列表不会发生中断;

3)允许用户标注:为用户开放收藏、取消收藏(unstar)接口,允许用户对推荐结果予以反馈;

4)缓存用户浏览记录:将用户的浏览记录缓存下来,作为一部分用户临时行为日志;

5)基于排名的推荐算法:将最热门的代码库推荐给用户,理论上漫无目的的用户对这些代码库最容易产生兴趣。

推荐算法均以开放接口(api)的形式对外开放。虽然当前这一部分仍存在一定耦合,但是这种形式的数据接口能够保证在推荐算法发生变化的同时,系统的使用不受任何影响。这不仅有助于系统解耦,还便于独立的推荐算法研究。

(五)用户交互页面设计;

系统的用户交互页面设计依赖于python语言的django网站服务框架,为确保内容清晰,本部分将结合具体运行时的网页截图进行说明;

首先是首页(如图6所示),作为系统的入口页面,希望这一页面能够尽可能贴合用户在github上的使用体验,因此将上下导航栏设计成与github几乎完全一致的风格。此外,将社交关系推荐列表(基于社交网络的关联推荐算法所产生的)置于页面的左下部,这一部分占据页面的三分之一大小,其位置与github上类似功能位置相近,刷新方式为点击最下方的“更多按钮”,此时系统将加载一组新数据并追加在列表末尾。

页面上部呈现当日的代码库热度排名的前三位,以此作为基于排名的推荐算法的一个缩略结果。前三名采用金银铜的方式呈现以显得更加鲜明,同时提供代码库的名称、简要说明与相关统计信息(star数目与fork数目),用户可以通过点击区块进入代码库详情页面,也可以点击右上角的“更多”(more)按钮查看更多排名信息。

页面右下部呈现主要个性化推荐列表(personalrank算法所产生的)。列表中条目内容包括标题、简要描述、语言标签(点击可以搜索与语言相关的代码库)与推荐原因。右上角的浅灰色循环按钮用于刷新推荐列表。可以注意到系统完全使用英文,考虑到github用户理论上应拥有足够的英文水平(因为代码库的说明文件绝大多数都是英文的),因此并未进行多语言页面的设计。

紧接着是排名页面,不同时间粒度对应的排名页面如图7所示。排名页面上部的内容与首页上部完全相同,下方呈现前一百名的排名列表;排名列表条目包含名称、收藏人数与排名,其中对于前三名,使用不同颜色的背景色予以突出;在页面右上角有daily(每日排名)、weekly(每周排名)、monthly(每月排名)与overall(全局排名)的链接,点击链接可以查看不同层面上的排名结果;

全局排名页面与上述有所不同,如图8所示。页面上部从排名前三的代码库改换为一根据编程语言热度进行排名的单词云,用户可以点击单词云中的编程语言标签,点击后页面下部的排名将自动根据被选中编程语言进行筛选。

代码库详情页面如图9所示。页面最上方显示代码库的名称,其左侧五角星标记为一可点击按钮,空心状态表明当前代码库未被当前用户收藏(star),实心状态反之。下方页面左侧用于显示代码库的说明文档,该文档经由github代码库说明文件接口(readmeapi)直接从github系统中获取以超文本标记语言(html)形式保存的说明信息,并与github风格进行了适配。下方页面右侧分三部分,第一部分是代码库的基本信息,包括所有者、代码库的github地址,协议以及所使用的语言;第二部分是相关统计信息,包括代码库的收藏人数、关注人数、复制代码库数目与公开的提问数目;第三部分为关联代码库推荐,其使用方法与首页右下的猜你喜欢完全相同,其主要区别仅在于出发的起点。可以看到这里与“react”相关联的“html5-boilerplate”与“bootstrap”都是前端常用技术框架或工具,这说明本发明的推荐算法是有一定成效的。

最后是搜索页面。空白搜索页面如图10所示。在页面的搜索框中用户可以键入相关搜索语句,这一搜索语句的语法与github官方的搜索语法完全相同。在页面下方设计了与高级搜索有关的输入内容,包括代码库的所有者、是否是经复制创建的代码库、排序原则与顺序、使用的编程语言四种,其中待选编程语言列表按照语言热度进行排序,为照顾冷门语言,也允许用户手动输入。

本发明涉及的主要术语:

mongodb是一个文档式数据库。

neo4j是一个高性能的nosql图数据库。

redis是一个内存数据库。

oauth是一个关于授权(authorization)的开放网络标准。

最后所应说明的是,以上具体实施方式仅用以说明本发明的技术方案而非限制,尽管参照实例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1