由于开发了一个新闻推荐系统的模块,在推荐算法这一块涉及到了基于内容的推荐算法(Content-Based Recommendation),因而借此机会,基于本身看了网上各类资料后对该分类方法的理解,用尽可能清晰明了的语言,结合算法和本身开发推荐模块自己,记录下这些过程,供本身回顾,也供你们参考~html
1、基于内容的推荐算法 + TFIDFgit
2、在推荐系统中的具体实现技巧程序员
主流推荐算法大体可分为:github
基于内容(类似度)的推荐算法
基于用户/物品类似度的协同过滤数据库
热点新闻推荐(你看到的那些头条新闻)编程
基于模型的推荐(经过输入一些用户特征进入模型,产生推荐结果)json
混合推荐(以上十八般兵器一块儿耍!)服务器
(本文只详述基于内容的推荐,其它的推荐方法你们能够另行搜索。)函数
基于内容类似度的推荐:顾名思义,把与你喜欢看的新闻内容类似新闻推荐给你。基于内容的推荐算法的主要优点在于无冷启动问题,只要用户产生了初始的历史数据,就能够开始进行推荐的计算。并且随着用户的浏览记录数据的增长,这种推荐通常也会愈来愈准确。
这里有两个重要的关键点须要首先有个基本理解:
用户有历史的浏览记录,咱们能够从这些用户历史浏览的新闻中”提取”能表明新闻主要内容的关键词,看哪些关键词出现的最多。好比能够有”手机“,”电脑游戏“,”发布会“等等关键词。
或者,统计这些新闻所属的领域是哪些,好比国际政治、社会、民生、娱乐,找出用户看的新闻来源最多的几个领域。不过按这种方式判断用户兴趣容易太宽泛,哪怕是同一个领域下的新闻,可能也会差别很大。好比某用户可能喜欢A女星,而不喜欢B女星,而若是你只是认为该用户喜欢娱乐新闻,结果把B女星的新闻不停给用户推,那就确定很差。而上述的关键词就能够比较好地规避这个问题。
找到定义用户喜爱的方法——关键词,那么咱们天然而然就能够想到,能不能提取出两个新闻的关键词,而后对比看它们两的关键词是否是相同的呢?恩!思路正确,不过毕竟一个新闻能够有好几个关键词,要想所有同样,仍是比较困难的。因此咱们须要对两个新闻的关键词匹配程度作一个合理的量化。
那么这时就要说到TFIDF算法了。
给你们一个连接去看TFIDF算法的具体原理,而此处只是简单地解释:TFIDF算法能够可以返回给咱们一组属于某篇文本的”关键词-TFIDF值”的词数对,这些关键词最好地表明了这篇文本的核心内容,而这些关键词的相对于本篇文章的关键程度由它的TFIDF值量化。
好了,那咱们如今也有了提取关键词并量化关键程度的方法,那么咱们如今就能够来对比两篇文本的类似程度了。公式以下:
$$Similarity(A,B)= \Sigma_{i\in m}TFIDF_A*TFIDF_B$$
m是两篇文章重合关键词的集合。此即将两篇文本的共同关键词的TFIDF的积所有加在一块儿,得到最终表明两篇文本的类似度的值。
举例: 刚抓进系统的两个新闻,分别提取出关键词与TFIDF值以下: A新闻:“美女模特”:100,“女装”:80,“奔驰”:40 B新闻:“程序员”:100,“女装”:90,“编程”:30 两篇文章只有一个共同关键词“女装”,故类似度为:80*90=7200。
可是实际操做中,以上思路有一个问题了,用户之前看了辣么多新闻,每一个新闻有好些个关键词,咱们难道拿刚抓进系统的新闻跟它们一个个比对吗?
为了解决这个问题,咱们须要引入新的东西:喜爱关键词表。
其实很好理解:咱们为每一个用户在数据库里维持一个map,这个map里放的都是“用户喜爱的关键词-喜爱程度”这样的Key-Value对。而这个map最开始固然是空的,而从任意时刻开始,咱们能够开始跟踪某用户的浏览行为,每当该用户新浏览了一条新闻,咱们就把该新闻的“关键词-TFIDF值”“插入”到该用户的喜爱关键词表中。固然这个“插入”要考虑关键词表里已经预先有了某预插入的关键词的状况,那么在这个基础上,咱们能够将预插入的关键词的TFIDF值直接和词表里的值加起来。
固然,考虑到存储问题,咱们能够为用户的喜爱关键词表设定一个容量上限,好比最多1000个词,固然具体数值仍是须要在实际运行过程根据效果作调整。
最后一个问题。
咱们你们会不会想到,咱们的兴趣点多是会随时间改变的呢?好比这段时间苹果出了一款新产品,我关注一下,但一个月后,我可能就彻底不在乎这件事了,可是可能苹果相关的关键词还一直在个人关键词表里,那会不会致使我依然收到类似的我已经不关心的新闻的推荐呢?也就是如何处理这种兴趣迁移问题呢?
为了解决这个问题,咱们能够引入一个衰减机制,即让用户的关键词表中的每一个关键词喜爱程度都按必定周期保持衰减。考虑到不一样词的TFIDF值可能差别已经在不一样的数量级,咱们考虑用指数衰减的形式来相对进行公平的衰减。即引入一个$\lambda$系数,$1>\lambda>0$,咱们每隔一段时间,对全部用户的全部关键词喜爱程度进行*$\lambda$的衰减,那么就完成了模拟用户兴趣迁移的过程。
固然,一直衰减下去,也会使得一些原本就已经彻底不感兴趣的关键词可能衰减到了0.0000001了,还在衰减,还死皮赖脸地待在词表里占位置,那么天然而然,咱们能够设置一个阈值L,规定对每一个用户的每次衰减更新完成后,将词表里喜爱值小于L的关键词直接清除。
本身实现的推荐系统,包括了协同过滤、基于内容的推荐和基于热点新闻的推荐,放在Github上了,欢迎拍砖!
这里TFIDF值的提取我用的是ANSJ,有直接的TFIDF库函数,直接调用就行,都不用本身分词。
而在数据库里存储与读取用户的关键词表时,我用的是Json形式,相关的工具备fastjson和Jackson,你们选择本身喜欢的用均可以。
另外,推荐过程是用Quartz定时任务库定制在天天0点开始执行,包括像衰减机制,各个推荐算法生成各自的推荐结果,都是这个时候完成的。因此这个推荐并非实时的,固然作成实时的彻底也没问题,只要服务器性可以好。
这里只是提出本身的一个实现思路,思路的造成过程也是在看了许多推荐系统相关的学术文献并进行了本身的总结与改变,并不是权威的作法,欢迎各位提出修正意见。
据说几年前开始,ACM有一个每一年举办的推荐系统学术会议叫RecSys,有兴趣的小伙伴们也能够关注一下。
有问题欢迎私信我!