深度丨从零搭建推荐体系:概述及标签体系搭建(上)
内容相对全而深入,希望有推荐体系搭建意愿的平台或者产品经理,能够给予一定的帮助就好。另,求工作。
0. 概述
随着信息技术的迅速发展和信息内容的日益增长,“信息过载”问题愈来愈严重,愈发带来很大的信息负担。推荐系统可以有效缓解此难题,从而得到推崇并加以广泛应用。
简单来说:推荐系统是通过挖掘用户与项目之间的二元关系,帮助用户从大量数据中发现其可能感兴趣的项目如网页、服务、商品、人等,并生成个性化推荐以满足个性化需求。目前市场上对于电子商务的推荐系统有亚马逊、阿里巴巴、豆瓣网、当当网等,信息检索的有谷歌、雅虎、百度等,以及在其它周边领域广泛运用如移动应用、电子旅游、互联网广告等。本文只阐述网页内容,特制新闻方面的项目体系搭建。
研究者认为根据施拉姆信息选择公式,人们对媒体的注意或选择的可能性(然率)与它能够提供的报偿(价值)程度成正比,与人们获得它的代价(费力)程度成反比。也就是说:人们愿意用最小的代价获取价值最大的新闻信息。由此,媒体要从认知接收方面,减轻受众的“费力”程度,提升信息或传媒的价值,树立品牌意识,形成规模效应;拥有与众不同的品味和特色,将自己在受众眼中的“可读”形象转变成“必读”形象,从而使用户对媒介产品形成强烈的信赖感和依赖感,在受众心中形成稳定的独特风格。
下图是一般情况下的推荐系统基本框架(图片取自网络):
从最初的数据收集,到最末端的展示阶段,中间还经过数据处理以及生成环节,处理大多数所指提取特征初处理,生成一般是指利用特征来选取相应算法进行匹配计算。数据的整个生命周期如下:
也就是从数据获取,一直到最后的加工输出,经历的整个环节,最终给我们提供相应的有效信息,采取相应的有效手段,才是数据价值的最终体现。
在正式开始前,对于数据收集的要求也是很高,如果数据不准确或有偏差,很可能之后做的都是徒劳无功,下表为目前常见的数据收集时常见的问题:
对于新闻内容的推荐系统,让人们最顺畅获取到人们想看到的内容,从而形成核心竞争力。推荐系统的常规推荐系统,一共分为两条线,第一条线是用户,第二条线是项目,计算两者间的相关近似值,从而完成推荐。计算近似值一定有所媒介,这个媒介就是标签(Tag)系统,所以在建设整个体系之前,最优先需要建设的就是标签系统,其次是用户体系,也就是用户模型,我们在感知用户唯一的途径就是通过用户操作,换言之既用户行为,所以相对用户行为微妙的变化,要求我们的用户体系是十分敏感的,而最后是项目体系,这里特指新闻内容。
下面将从产品层面尽量描述如何搭建推荐体系相关流程及细节,整体搭建思路流程如下:
整体相对比较复杂,下面将逐一阐述其中细节。
1. 标签体系
1.1 搭建流程
要做标签体系,我们要先确定的就是系统结构,常规来看一般都是讲标签随内容或用户建设(但是我觉得那样是不完整的,在之后获取不到更加有效有帮助的信息,这也就是为什么我认为一定要将标签体系一定要单独拎出来的原因)。
在确定系统结构之后,我们要进行相关的算法选择,并且大致选定学习的范围和地点,以供机器学习,至此整个标签体系的搭建流程就此完毕。随着不断的内容填充进来,要有相应的标签不断补充进来。这是一个长期的过程,并且也需要及时依据用户反馈修正算法,实时调整,并非一日之功。
1.2 二维化结构
常规网络的标签是随用户和内容添加的,但是会有局限性,也就是标签体系较难或无法透彻追查其它相关联内容。实际上标签体系的核心价值,体现在相应建立起信息和人、人与人之间的关联。所以我在思考:如何能够进行最深入的追查最深处的关联?有一个常规方案就是单独建立标签体系,将标签平铺于系统中,也就是二维化。通过机器学习,建立标签的基本联系网络,之后贴合于用户与内容中即可。无立体结构的上下层级展示,好处是可以避免了一维化的后果。换句话说如果有层级,那么不可避免的就会变成一级、二级。
简单来说:与某标签周遭相关联的一切标签均展示;那周遭的标签还会又有标签,再展示;也就变成无穷尽的立体结构化的标签网络,也就是价值基础。最终价值的输出还要结合其它的相关行为、操作、用户物理属性、内容载体以及效果评定等因素综合考量。
1.3 机器学习
常规机器训练流程是:先确定方法→训练集→特征选取→训练→分类器;分类:新样本→特征选取→分类→判决。
所以最开始我们就要确定机器学习的方法。方法有许多种,需要具体根据情况来具体确定。下面仅以产品角度罗列常见经典的机器学习方法、特点、利弊等。以供数据工程师进行选择、对比,辅助做出最优选择,以供参考。
方法当中,首先分为两个大类别:监督学习和非监督学习。监督学习又称为分类或者归纳学习。几乎适用于所有领域,包括内容处理。常见算法有决策树、贝叶斯模型、KNN、SVM等。
与这一方式相对的是非监督学习,在这种方式中,所有的类属性都是未知的,从零开始摸索,算法需要根据数据集的特征自动产生类属性。其中算法中用于进行学习的数据集叫做训练数据集:当使用学习算法用训练数据集学习得到一个模型以后,我们使用测试数据集来评测这个模型的精准度。常见的有聚类、特征矩阵。下表为常规推荐算法的分类,一共是三类:分类算法、关联规则和聚类,依据不同场景选择不同算法进行调整即可。表格后面列出最常用算法的利弊以及用人话描述的算法原理,以供产品同事参考。
朴素贝叶斯:
对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率;哪个最大,就认为此待分类项属于哪个类别。非常好理解,单纯的概率问题。
优点:算法十分稳定,并且对数据参数无要求;运用较为简单。
缺点:在属性个数比较多或者属性之间相关性较大时效率不理想,并且重前期数据格式,需要知道先验概率,存在一定错误率。但是结合聚类算法,可以一定程度解决属性个数问题。
使用场景:常见于垃圾邮件分类场景。
决策树:
哈利波特中的分院帽应用的是个非常典型的决策树模型:帽子往学生头上一扣,读取学生的显著特征,然后分到某个类别里。所以你看,哈利波特一开始表现出来的特征都是格兰芬多的特征,分院帽读取数据时候发现这个人有两类显著特征,于是犹豫不决,最后还是波特自己提出了要求,这就证明应用模型时的人工干预必不可少。
优点:决策树较为通俗易懂,并且对数据格式不敏感,较为聪明;易于通过静态测试测量模型可信度,善于短时间处理大量数据源,对属性数量兼容性好,有很好的扩展性。
缺点:对样本数量不一致的数据,结果有偏向,处理缺失数据时候会有困难,并且有过度拟合现象,容易忽略数据集中属性之间的相关性。
使用场景:可结合随机森林算法,减少相应过度拟合现象。常见于用户行为分析场景。
KNN:
说白了就是我们要寻找邻居,但是为什么要寻找邻居?如何选取邻居,选取多少邻居?怎么样去寻找我们想要的邻居,以及如何利用邻居来解决分类问题这是KNN算法需要解决的几大问题。
为什么我们要寻找邻居?古话说的好:人以类聚,物以群分。要想知道一个人怎么样,去看看他的朋友就知道了。我们如果要判断一个样本点的类别,去看看和它相似的样本点的类别就行了。
优点:该算法简单有效,重新训练代价较低,对于类域有较差或重叠较多的样本较为适合。同样适用于样本量较大的情况。
缺点:样本量较小时反而有误差。而且该算法是懒散学习方法,不主动,类别评分不规格且输出可解释性不高。当样本量不平衡时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数,并且计算量较大。可以采用权值的方法,和该样本距离小的邻居权值大,来改进问题,对于计算量较大,可以事先对已知样本点进行剪辑,去除对分类作用不大的样本来优化。
使用场景:常见于预测价格场景。
SVM:
说到这个算法之前,先得配一张图:
这图啥意思呢?不用管。但是这两种分法哪种更好呢?从直观上来说,显然右侧好。也就是分割的间隙越大越好,把两个类别的点分得越开越好。就像我们平时判断一个人是男还是女,就是很难出现分错的情况,这就是男、女两个类别之间的间隙非常的大导致的,让我们可以更准确的进行分类。从实践的角度来说,这样的效果非常好,错误率低。
优点:该算法适用于样本量较小的情况,可提高泛化性能,可解决高维度问题。并且对线性和非线性问题均可解决,可避免神经网络结构选择和局部极小点问题。
缺点:对缺失数据较敏感,对非线性问题没有通用解决方案,需要选择核函数来处理,算法使用并且极其复杂。
使用场景:常见于社交网站用户分类场景。
Ad boosting:
这个算法说实话我也解释不清,没真正运用过,凭自己查资料的理解试着说一下。这个算法核心的思想是整合多个弱分类器,成为一个强大的分类器。这时候,集合分类器出现了。用人话说就是三个臭皮匠赛过诸葛亮,好理解了吧?识别一组条件特征概念判断的正确率比随机猜测略好,但是还不够,这就是弱分类器;多个弱分类器的效果叠加起来,就变成一个强分类器,识别率就会很高了。
优点:该算法精度较高,可用任意方法构建子分类器;使用简单分类器时结果容易理解,且弱分类器构造极其简单,而且不用做特征筛选,不用担心过度拟合情况。
缺点:对离群值比较敏感。
使用场景:常见于人脸检测、目标识别场景。
K-means:
给你一万个人,分成四群,需要能够解释每一群人的突出特征,如果有两群人的特征很相似,那就要重新分群了;或者有一群人的特征不明显,那就要增加分群了。好处在于样本量大的时候,可以快速分群,但需要在分群后注意每个群体的可解释性。
优点:这个算法属于经典算法,简单快速,对处理大数据集可伸缩,高效。并且在簇密集度高、球状或团状时,且有明显于其他簇区别时,聚类效果好。
缺点:但是只有簇平均值被定义情况下才能使用,且对分类属性数据不适用,并且要求用户必须事先给出要生成的簇的数目。对初始值敏感,不适合发现非凸面形状的簇,或者大小差别很大的簇。对噪声和孤立数据敏感,少量该类数据能直接影响平均值。
使用场景:常见于CRM筛选目标客户场景。
神经网络:
这个算法不想解释啥,就想放张图,觉得不放可惜了。
以上摘要从产品角度来说只要大概心里有数即可,一般情况下从产品数据、应用场景等决定。
一般来看,冷启动期间应选择非监督学习,如聚类;等数据丰富之后,转换为监督学习,择优选择算法方可;但仍需具体问题具体分析。更多的还是配合技术、算法人员来选择和实现,详细算法和原理、公式等可以到后面附录1进行查看,给予参考。
1.4 学习地点
这里我建议从百科类产品进行机器学习,国内最大的百科就是百度百科了,在国际上自然还有维基百科。
查了一些相关方法,发现从百度百科利用机器学习标签,已经有相应的案例并且成本相对不是很大,具体的方法也放在后文中的附录2中。
文中探究的是微博标签相关的项目,与本文无关,但整体思路可借鉴。大致流程为先抓取页面下相关标签内容,要注意特殊情况,会有歧义页面;将标签抓取存储之后通过算法计算之间的关联性、权重分数,而后输出验证。整体的过程非常简单快捷,能在前期非常快速的补充相关数据,但是要注意数据量的问题,很可能导致无穷,所以收集哪些主要领域,收集多少,是需要我们最开始定义好的,及时踩刹车。
1.5 输出展示
这里的展示更多指的还是相应的后台页面,要满足几个条件:其中最基本的一定要满足可视化的要求,点击标签以后相应的关联标签可形成关联展示;可以选择展示两级或者三级,清晰直观的看到关联情况。更进一步的是点击后,每个标签里面的详细情况也会展示出来。比如说标签的历史类型情况、载体情况、分别的打开情况、受众用户群体,所以这也是需要依托于用户体系的相关标签结合之后的产出物。
结合基本数据维度比如昨日新增多少标签、文章类型走向是什么样的受众是什么样的走向,都是属于基础数据范畴,达到实时监控,定位报警的作用。
1.6 小结总结
本节总体来说阐述了搭建标签体系的整体流程和相关经典算法的展示与利弊分析,并且提供了标签学习机制的思路。下面,将进行用户模型的体系搭建,详见明日发布的中篇。
附录1 常见机器学习方法算法
附录2 提取百度百科标签建立关联性思路
百度百科介绍
构成百度百科的基础内容是词条。一个词条页面大致可以分为百科名片、词条正文、开放分类、相关词条、参考资料和扩展阅读这个几个部分,根据每个词条的具体情况,某些部分可以没有。
其中,百科名片是词条的概括性描述;词条正文是可以由多个段落组成的对词条的详细描述;开放分类提供词条的属性标签,最多有5个,通常这种标签具有一定的类别信息;相关词条是与当前词条联系比较紧密的相关条目,而一般这种联系必须是横向的,例如“乔峰”的相关词条可以是“段誉”、“阿朱”、“虚竹”等,但不可以是“天龙八部”。
尽管在百科的词条页面上,我们只能看到该词条的开放分类标签;但实际上在百科内部,有一个具有层次的三层分类体系。第一层具有十二个大类;每个大类下面又包含若干个中类,这就是第二层分类;每个中类下面又可细分为若干个小类。
生成方法
我们将百度百科三层分类体系第三层的小类别作为查询,在百度百科中将搜索得到该类别下的词条页面。但是通过这种方式,对于每一个小类别,我们最多只能获取760个相关的词条页面,而更多的实际上可以被划分为该类别的词条页面,我们获取不到。
我们搜索“技术_互联网_电子商务”类别下的页面,结果显示共有词条3469个,但是,我们遍历搜索结果页面,最多只能查看到760个词条页面。在该方法中,我们需要使用百度百科的三层分类体系例如“技术_互联网_编程”、“生活_娱乐_影视”作为用户的标签候选集合。因此,我们可利用的资源便是能够获取到的每个小类别下的最多760个词条页面。
我们通过分析用户发布的微博,将其最感兴趣的百科三层类别作为他的标签。方法的主要思想是:将用户发布的每一条微博映射到最相关的百科词条页面,获取其类别,通过一定的投票策略决策出用户的标签。
下面,具体介绍一下方法中涉及的关键步骤。
百科页面获取与处理
我们按照百度百科提供的开放分类浏览页面,爬取到所有第三层小类别的查询URL,形如http://baike.baidu.com/taglist?tag=****,该URL指向的就是该类别标签的搜索页面。我们通过解析该搜索页面,下载得到百科开放的760 个相关的词条页面。获取页面后,并且按照第三层小类别分类存储后,我们进行正文的提取。词条页面一共有两种,一种是歧义页面,即一个词条包含多种义项,下图所示:
一种是非歧义页面。我们需要分别对其做处理:对于歧义页面,将每一个义项单独作为一个页面提取出来。我们提取百科页面的标题、百科名片、正文、类别,进行分词等处理后,建立索引,待后续使用。
搜索与微博相关的词条页面
给定一条微博,我们需要找到与其相似或者说相关的百科页面,以获取其类别。我们将这个问题转换成为搜索问题。从微博中提炼出查询,从索引过的百科页面中搜索出最相关的。我们使用Indri 对词条页面建立索引。Indri 源自Lemur系统,是CMU和UMass 联合推出的一个用于语言模型和信息检索研究的系统。在这之上可以实现基于语言模型和传统的向量空间模型等的检索。Indri早已经受到了学术界的广泛欢迎。
我们将分别抽取微博中的名词、名词及形容词的组合构成带有权重的查询,其权重采用TFIDF 计算得到,构造的查询形如“#weight(0.45巨蟹座0.35性格0.20特点)”。用构建的查询,我们搜寻到与该查询最相关的词条页面,并获取其对应的类别。
用户标签生成
假定有m种具有三层分类的类别标签,我们将其作为用户的候选标签集合,表示为C={}。
给定某个用户u,抽取其发布的微博文本集合W={},文本数目为n。我们分别对其构造查询,得到查询集合Q={}。对每一个查询q,我们获取Top N个结果,作为该查询相关的词条页面。因为每个词条可能属于若干个类别,因此我们得到的与该查询(或者说其对应的微博)关联的类别可能不止N个。对关联的类别中的每一个类别c,我们计算其分数,如公式。其中, freq(c)指c在该次查询中出现的频数,而d是我们设置的一个常数,例如,我们将其设置为1,则c的分数就是在该次查询中出现的次数;若将d设置为该类别关联的词条页面出现在Top N结果中的具体位置,则说明c的分数受到搜索结果排序的影响,排序越靠前的,对分数的贡献越大。
整个查询过程停止后,我们将对候选标签集合中的每一个标签c计算一个排序分数,可以利用这个算法,其中n 就是指查询的次数。我们取排序前10 的作为为用户自动生成的标签。
上篇,完。
作者:MysTic(微信号mystic326531548),3年产品经理工作经验,需求、用研、数据有深入研究。寻坑,坐标北京。还在寻坑当中,都觉得我报价有点贵,可是我是真能干事儿啊,仁者见仁智者见智吧,坑找不到就继续写干货和搞研究就好了,也无妨,有老板看到,希望多多联系。