个性化推荐系统及在已有系统上的应用

2019-06-11 09:07徐立李超
宁波职业技术学院学报 2019年1期
关键词:用户行为推荐系统

徐立 李超

摘  要: 针对信息过载而中小企业又无力为其用户提供推荐服务的现状,提出了一种个性化的推荐系统,为中小企业已有系统的用户提供推荐服务。该推荐系统采用基于用户行为和基于好友推荐的推荐方法,可以有效的发掘用户显性和隐性需求,为其提供个性化的推荐服务;数据来源于原有系统的数据库及操作日志,运算模块采用map-reduce的方式运算,保障了系统的运算速度和可扩展性。最后以某平台为例,简要介绍了个性化推荐系统和已有系统对接的实施方案。

关键词: 推荐系统; 推荐功能; 用户行为; 好友推荐

中图分类号: TP 399          文献标志码: A          文章编号: 1671-2153(2019)01-0093-05

0  引 言

作为解决当前“信息过载”现象的一种有效途径,推荐系统吸引了越来越多的专家、学者及企业的研究和关注,其研究的热点在于各种各样的推荐算法、优劣比较等[1];大型互联网企业也纷纷上线自己的推荐系统(如电商中淘宝、京东、亚马逊[2];视频中优酷、土豆;社交网络中人人网;新闻中今日头条等)。这些推荐系统极大的方便了用户,能够发掘用户的潜在需求,将合适的、个性化的内容或商品推荐给不同的用户;企业因推荐了合适的内容或商品,用户粘合度和订单转换率大大提高,企业、用户双方受益。

然而,对于一般中小型企业,由于技术和资金实力限制,既不能将专家研究出的优秀推荐算法付出实施,又不能像大型企业一样上线自己的推荐系统,错失了享受推荐系统红利的机会。本文提出了一种个性化的推荐系统以及将其应用到某些已有系统的实施方案,借助該系统,一般中小企业的已有系统可以为用户提供个性化的推荐服务。

1  推荐系统的总体设计

推荐系统的定位是:为中小企业已有系统的用户个性化的推荐该系统下的资源(被推荐对象的种类繁多,如:页面、新闻、知识条目、商品、视频等,为了描述的方便,以下统称为资源),其原理是从已有系统中提取数据,经过数据清洗后,按相关推荐算法运算,最终将得到的“用户-资源”的推荐结果进行存储,以某种规则和形式推荐给用户,由于对推荐服务的实时性要求不高,大型企业的推荐系统也是采用离线计算的方式,才使得该设计在实时性方面能够达到同型系统的一般要求,其总体结构如图1所示。

要对已有系统增加推荐功能,首先要提取已有系统中的数据,这些数据包括:用户和资源的基本信息、用户推荐的资源信息(这是在系统中增加的小功能),这类数据属于从已有系统的数据库中提取的结构化数据;原有系统访问日志(一般系统都会有这种日志,一般形式为某用户通过某一个链接操作了某一资源),这些数据属于非结构化数据。

图1中,数据清洗模块主要对提取的数据进行运算前的处理,处理重点在于日志文件,不同的系统提供的日志形式不完全一样,需要对接原有系统时稍作改动,在开发时要遵循面向接口编程的规则,对接时推荐系统的代码可以不受影响;也可事先分别对几种常见的开源系统的日志进行编程,对接时通过配置文件选择某一种处理方式,避免硬编码。

算法计算模块是推荐系统的核心,由于系统中已有大量真实数据,算法的运算复杂度又较高,因此对运算资源的要求较高,单结点运算显然是无法满足性能需求的,因此需要将运算任务分配到不同结点,运算结束后将结果回收。

结果存储模块将运算得到的结果持久化,存储结果比较简单:用户—资源。一般单台服务器即可满足存储需求,数据量大时,可考虑数据库横向拆分,拆分时要保证同一用户的所有推荐结果在一台服务器上。

结果推送模块主要负责将存储起来的推荐结果按照某个规则(推送多少条、过滤掉已采纳资源等)和某种形式推送到原有系统。

2  推荐算法的设计

常见的推荐方法有:基于内容的推荐、协同过滤推荐和基于关联规则的推荐,这些方法各有优缺点,适用场景不同[3]。资源的多样性决定了采用的推荐方法不能单一,通过分析用户和资源的特征、推荐系统的应用场景(应用于已有系统,已存在大量用户行为数据,不存在冷启动的问题),主要采用的推荐方法有:基于用户行为的推荐和基于好友的推荐两种。

2.1  基于用户行为的推荐

用户在使用系统时,无论是有目标的使用还是无意识的随意浏览,其行为数据都有很大价值,这些有价值的数据会被系统的操作日志记录,这部分数据相对互联网的整个用户行为数据库体量要小的多,价值要大的多。

2.1.1  用户行为

用户访问和使用系统时,其行为可分为以下几种:创建资源;编辑资源;浏览资源;发起提问;回答问题;采纳答案;浏览答案。经分析论证,为每种行为赋权重,行为权重表如表1所示。

2.1.2  实现技术及算法

资源类的操作可根据行为权重直接映射到资源,问答由于是用户发起和回答的,内容无固定格式且没有关键词,利用Lucene开源全文检索工具的中文分词器对提问和被采纳答案的内容进行切分后加上行为权重映射到资源。

某用户对资源的兴趣值记为I,其公式为

式中:BW为表1中的行为权重值;D为该行为的持续时间,即在页面上的停留时间。计时有两种方式:可以借助Ajax技术来实现,当用户在页面上做点击鼠标、滑动光标或敲击键盘等操作时,会触发ajax程序向服务器端发送信号,从最早接收到信号到最后一次发送信号之间的时间差可认为是停留时间;如果操作日志较为详细,也可以通过获取同一用户相邻两条操作记录,计算其时间差的方式计算停留时间。

某用户的兴趣集中度记为IR,其公式为

式中:Imax为某用户的最大资源兴趣值;IK为该用户对资源k的兴趣值。IR值越大,则表明用户的兴趣点越集中,其目标性越强,反之亦然。当IR≥50%说明其兴趣集中度较高,最大兴趣值占据用户兴趣总值半数以上,该用户对该资源兴趣浓厚,只推荐与该资源相似度最高的前N条资源,选取前N(N可灵活配置)条进行推荐。当IR<50%时,说明该用户目标性不强,可能只是随便了解些知识,此时取最感兴趣的前M(M可灵活配置)资源下首位相似资源推荐。

2.2  基于好友的推荐

这里的好友与社交网络中的好友不同:社交网络中的好友来源很广,有可能是生活中的朋友,生意上的伙伴,其兴趣点有可能截然不同;该“好友”对用户是不可见的,它是通过用户相似度计算获得的,其计算公式与基于用户的协调过滤算法中的计算公式相同。然而,该方法与后者不同:后者强调用户A和B相似度高,则推荐给A的资源,也可推荐给B;该方法强调,A主动推荐的资源,可以推荐给B,这样可以纠正算法计算时的偏差和失真,发挥用户的主观能动性,尽可能大的利用互联网万千用户的智力资源,其推荐结果将更准确、效果更好。

3  系统的部分实现

由2中的算法描述可以看到:基于用户行为的推荐方法首先要从每个用户的行为找到其在某段时间内关注最多的数个资源,然后从众多资源中找出每个资源最相关的数个资源进行推荐;基于好友的推荐也是要找到每个用户的“好友”,也就是关注点最相关的用户,运算量是巨大的,单凭一个主机是无法满足性能需求的。为了提升推荐系统的运算性能必须采用map?蛳reduce的方式将计算任务分配给多个运算节点,运算结束后将结果汇总。Hadoop提供了一个很好的并行化分布式计算框架,其两大核心组件[4]:HDFS用于分布式存储文件;MapReduce用户并行化运算。

在實现map?蛳reduce计算之前,先看一下获取推荐给用户资源列表和用户“好友”列表的流程,如图2所示。

图2中,对应主要代码段如下:

/*推荐给用户的资源列表*/

public List itemRecommend(long userID, int howMany, IDRescorer rescorer, boolean includeKnownItems) throws TasteException {

PreferenceArray preFromUser = getDataModel().getPreferencesFromUser(userID);

if (preFromUser.length() == 0) {return Collections.emptyList();}

FastIDSet possItems = getAllOtherItems(userID, preFromUser, includeKnownItems);

TopItems.Estimator estimator = new Estimator(userID, preFromUser);

if(concentrating>50%) {

List topItems = TopItems.getTopItems(howMany, possItems.iterator().next(), rescorer,estimator);}else {List topItems = TopItems.getTopItems(howMany, possItems.iterator(), rescorer,estimator);}

return topItems;}

/*获取用户的“好友”*/

public long[] getUserNeighbors(long userID) throws TasteException {DataModel dataModel = getDataModel();

UserSimilarity userSimImpl = getUserSimilarity();

TopItems.Estimator estimator = new Estimator(userSimImpl, userID, minSimilarity);

LongPrimitiveIterator userIDs = SamplingLongPrimitiveIterator.

maybeWrapIterator(dataModel.getUserIDs(),getSamplingRate());

return TopItems.getTopUsers(n, userIDs, null, estimator);}

MapReduce是用来解决海量数据的计算问题提出的一种多节点并行化运算方式,在Hadoop框架下用户只需实现map()和reduce()方法即可完成并行化运算,具体到资源推荐,定义类ItemRecommend,public class ItemRecommend extends Configured implements Tool,该类集成了org.apache.hadoop.conf包下的Configured,实现了Tool接口。在该类里定义Item Recommend Mapper和Item Recommend Reducer两个静态内部类,在main方法中,通过job.set Mapper Class(Item Recommend Mapper.class)和job.set Reducer Class(Item Recommend Reducer.class)运行。

4  推荐系统的应用举例

推荐系统可以应用于中小企业的已有系统,为其用户提供个性化推荐功能,以茶文化知识平台为例,简单介绍其应用。

茶文化推广平台是一个集知识管理、问答、交友的茶文化综合平台,包括茶知识、茶问答、茶友空间和后台管理等功能,其功能模块如图3所示。

推荐的资源为茶文化相关的知识条目,该平台是基于一些常见开源系统(hdwiki,UCenter等)的二次开发搭建的,主要功能均由开源系统提供。因此,无论从日志的完整性和规范性,还是代码的规范性来讲,都为其开发推荐功能提供了方便。

鉴于推荐系统中基于好友的推荐算法中,需要使用用户推荐的数据,对系统进行开发增加用户推荐功能,该功能简单,数据库中新增用户-资源对照表uc_ recommender,用戶推荐后数据库里新增一条记录即可,相应的取消推荐功能类似。

获取数据时:一部分数据来自于数据库,如wiki_doc(条目基本信息表)、uc_members(用户基本信息表)、uc_asks(提问表)和uc_anwsers(答案表)以及uc_recommender(用户推荐条目表)等,这部分数据数据结构型数据,基本不需要处理;另一部分来自于原系统中的操作日志,操作日志中记录了用户通过某个类操作了某个资源,这里只关注表1中列举的操作,需要过滤掉的数据较多,逐条判断,把符合条件的记录抽取用户id,资源id和操作类名等信息,实现起来较简单。至此,已完成了推荐系统与现有系统之间的无缝对接。

5  结束语

通过研究推荐系统,提出了一种个性化推荐系统和基于用户行为和基于好友推荐的方法相结合的推荐方法:推荐算法运算时采用map-reduce的方式,运算能力较强;运算量大时可以任意新增运算节点,可扩展性良好;该系统的实施技术难度不大、成本较低、可以方便的应用到中小企业现有系统中,为其用户提供个性化的推荐服务。本文以茶文化知识平台为例,实施了该推荐系统。

参考文献:

[1] 冷亚军,陆青,梁昌勇. 协同过滤推荐技术综述[J]. 模式识别与人工智能,2014,27(8):720-734.

[2] 洪亮,任秋圜,梁树贤. 国内电子商务网站推荐系统信息服务质量比较研究——以淘宝、京东、亚马逊为例[J]. 图书情报工作,2016,60(23):97-110.

[3] 黄立威,江碧涛,吕守业,等. 基于深度学习的推荐系统研究综述[J/OL]. 计算机学报,2018:1-29.

[4] 董新华,李瑞轩,周湾湾,等. Hadoop系统性能优化与功能增强综述[J]. 计算机研究与发展,2013,50(S2):1-15.

猜你喜欢
用户行为推荐系统
数据挖掘在选课推荐中的研究
电力高校图书馆转型智库服务的研究
基于用户偏好的信任网络随机游走推荐模型
社会化媒体用户使用动机与行为探析
基于个性化的协同过滤图书推荐算法研究
个性化推荐系统关键算法探讨
浅谈Mahout在个性化推荐系统中的应用
移动互联网环境下用户行为社交化变迁的探析
关于协同过滤推荐算法的研究文献综述
基于云计算技术的大数据用户行为引擎设计