您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 今日头条推荐系统解密
今日头条推荐系统解密首先声明本文是技术讨论贴,不是技术泄密贴。作者本人是另一个聚合阅读产品摘客的技术架构工程师,非今日头条员工。本文技术架构对于爬虫、大数据平台、推荐算法等理解不足之处,欢迎大家指正。推荐系统大的来说分为四类:基于人口统计学的推荐、基于内容的推荐、基于协同过滤的推荐和混合的推荐机制【1】。先简单介绍一下这几类的区别。基于人口统计学的推荐就是对用户按属性进行分类推荐,比如按年龄、性别、城市、消费能力等用户天然自带的属性分类,然后推荐不同商品。基于内容的推荐是按物品的天然属性进行分类推荐,比如按物品的功能、价格、产地、类型等物品自带的属性进行分类推荐。基于用户的协同过虑,找有相似购物列表的用户定义为相似用户。从相似用户购物列表中找目标用户没买的物品推荐。和基于人口统计学的推荐不同的事评价两个用户相似与否用的是用户的购物列表比较。基于物品的协同过虑,有相似用户的物品定义为相似物品。从相似物品中找目标用户没有购买的物品推荐。混合推荐就是融合几个推荐策略的结果到一个最终的推荐列表中。融合的方法包括加权、分级、调制和过滤。基于用户的协同过虑相当于把下图每行看成一个向量,寻找相信用户,推荐相似用户没有的物品;基于物品的协同过虑相当于把下图每列看成一个向量,寻找相似物品,然后推荐相似物品给空缺的用户。有了上面的铺垫,我们大概知道了推荐系统的常见算法。下面我们来分析对于今日头条这个用户过亿的APP,怎么有效的给用户推荐内容。推荐的第一步是获取内容,目前开源的爬虫包括Java的Nutch、WebMagic,Python的Scrapy等。Nutch完全构建在Hadoop分布式计算平台之上,可以部署在由成千上万计算机组成的大型集群上。Nutch在垂直搜索、档案互联网搜索等领域得到了广泛应用【2】。Scrapy使用了Twisted异步库来处理网络通讯,是一个优秀的Python网络爬虫。WebMagic的设计参考了Scrapy的架构,并整合了HttpClient、Jsoup等Java最成熟的工具,是一个优秀的轻量级Java爬虫,也是我们摘客目前在使用的爬虫。考虑的数据抓取量,我们有理由相信今日头条用的是Nutch框架。抓取到网页之后,需要将网页信息处理成文本,然后分词和去停止词。目前中文分词主要用两个工具:java的ANSJ和python的Jieba。两个都可以自定义指定分词库和停止词库,在Github上可以找到对应代码,在此就不赘述了。以摘客项目的经验来看ANSJ分词的效果更好一点。推荐系统的一大特点就是要对推荐物品做特征化处理,对新闻而言就是挑一些有代表性的特征词。比如传统内容网站会在编辑人员输入完文章时,必须要指定一些Tag。以今日头条的新闻抓取量,如果是人工加Tag,会是一项非常费时费力的工作。所以自动化Tagging应该是首选方案。这里提几个自动化Tagging的方案。一个简单的方案是准备一个Tag库,用Tag匹配标题和文章第一段话,如果匹配上打这个Tag。用TFIDF算出新闻最有代表性的词,和Tag库匹配,匹配上的Tag作为文章Tag。用分类的方式,将每个tag看成一类。用机器学习的方式对文章分类,对应的类名为文章Tag。TFIDF其实是一个简单高效的方式。根据信息论,一篇文章的TFIDF值越大,其包含的信息量越大。所以TFIDF值越大的词是越有可能代表这篇文章的。上面这么多准备工作完成后就可以进入正题:推荐。在用户不多的时候,协同过滤效果不会很好,基于内容的推荐是首选方案。假设用户对各个Tag的偏好矩阵(UT)是这样的:时尚汽车体育财经军事国际科技张三1.81.201.91.350.80李四002.51.20.71.30王五0.90.20001.61.9这个偏好矩阵可以通过用户画像得到。假设文章和Tag的矩阵(AT)是这样的:时尚汽车体育财经军事国际科技A100001.800A20.81.500000A3001.30000这时基于内容的推荐方案有两种:I.UA1=Max(UT1*AT1,UT2*AT2…)=kII.UA2=(UT1*AT1+UT2*AT2…)=k第一种方式是挑文章最有代表性的Tag推荐给用户。第二种是计算文章每个Tag权重之和对用户推荐,相当于UT和AT两个矩阵的点积。实际中我们更偏好第一种方案,因为文章只要在一个方面很突出,恰好用户喜欢这个类别,就可以推荐给用户了。而不是Tag很多的那些综合性的文章会胜出。对于今日头条用户量大,内容量大,协同过滤也是一个不错的选择。以基于用户的协同过滤为例,可以用Person相关系数或余弦相似度找出用户的一些相似用户。相似用户阅读较多的内容推荐给目标用户。上图中潜在因子模型是利用矩阵分解的方法来做推荐。矩阵分解算法的数学理论基础是矩阵的行列变换。在《线性代数》中,我们知道矩阵A进行行变换相当于A左乘一个矩阵,矩阵A进行列变换等价于矩阵A右乘一个矩阵,因此矩阵A可以表示为A=PEQ=PQ(E是标准阵)。矩阵分解目标就是把用户-物品评分矩阵分解成用户因子矩阵和项目因子矩阵乘的形式【3】。分解后用户物品矩阵的空缺值可以计算出来,可以按从大到小的顺序给用户推荐。协同过滤在实际中应用很广泛,特别是对于用户量大,商品量大且变动不大的情况。针对今日头条的新闻推荐系统,用协同过虑面临以下两个问题:可扩展性问题。随着用户和新闻数量的剧增,在有限的计算资源的条件下,传统的协同过滤算法面临着严重的可扩展性问题。当用户和物品数量达到千万甚至上亿时,传统的协同过滤技术在求解邻居或者建模的过程中,其时间复杂度和空间复杂度会非常大,需要较多的计算资源,这样的要求会使得此种算法不适用于实时推荐。实时性问题,新闻实时性强,针对新爆发的新闻协同过滤效果较差。协同过滤算法一般先线下(offline)训练,然后线上(online)的推荐,这样的流程对新闻推荐依然显得较为笨拙。好的推荐系统都不是用单一模型做推荐,而是将多个推荐模型的结果集融合为最终的推荐结果集。以KDDCup2011雅虎音乐推荐比赛【4】为例,前五名中提供论文的四个参赛队全部是实现了多个单一模型,然后组合成最终的结果集。下面是一些简单的模型融合方法【5】。加权型:最简单的融合方法就是根据经验值对不同算法赋给不同的权重,对各个算法产生的候选集按照给定的权重进行加权,然后再按照权重排序。分级型:优先采用效果好的算法,当产生的候选集大小不足以满足目标值时,再使用效果次好的算法,依此类推。调制型:不同的算法按照不同的比例产生一定量的候选集,然后叠加产生最终总的候选集。过滤型:当前的算法对前一级算法产生的候选集进行过滤,依此类推,候选集被逐级过滤,最终产生一个小而精的候选集合今日头条新闻推荐还有一个特点是当我们在最顶部下拉时,总会有新文章涌出。这一块的内容往往是一两分钟之内的新闻,我们认为这一块的推荐主要是基于内容的推荐。而对于往下翻页时推出的新闻,应该是内容推荐和多种协同过虑推荐方法融合的结果,一般来说后一种情况推出的新闻更符合我们的用户偏好。最后欢迎大家访问我们IT领域的今日头条:摘客网站。李海峰2015年12月22日【1】探索推荐引擎内部的秘密【2】开发基于Nutch的集群式搜索引擎【3】浅谈矩阵分解在推荐系统中的应用【4】推荐系统中协同过滤算法的研究及应用ZhenzhenMi【5】美团推荐算法实践
本文标题:今日头条推荐系统解密
链接地址:https://www.777doc.com/doc-2711078 .html