简单的内容相似推荐实现
内容相似推荐
为了增加用户粘性、提升用户留存,在文章资讯阅读中可以加入相关推荐,最简单的就是内容相似推荐。
比如,看完了一篇《如何搭建创业公司技术架构》之后,在相似推荐中看到《如何简单高效搭建持续集成系统》的文章,很自然的就会吸引读者深入了解一下,于是就点进去看一看,那么对于系统网站来说,就会降低跳出率,增加用户的留存,是一个很好的用户体验。
实现内容相似推荐的方案比较简单,大体上包含以下步骤:
获取内容的关键数据
比如文章的标题、关键字、分类、甚至全文本;一般内容数据都存储在数据库。对于文章而言,全文本内容太散,一般不会作为关键数据。而视频类的内容,因为标题和简介文字太少,最好有详细的文本描述作为关键数据。
分解内容形成特征统计
对于文本内容,可以使用结巴分词或者可以直接使用分词云接口,比如:百度的NLP云分词服务。
得到分词之后,分词结果中往往包含很多“的”、“也”等无意义的词语,我们一般会通过TF/IDF的方法计算每个词语的权重,将一个文档的所有词语的TF/IDF权重倒序排列,取TOPN个作为关键词。
TF就是计算一篇文章中每个词语出现的次数、IDF就是这个词语在所有文章中出现的次数,TF除以IDF就是权重值;
将关键词映射成数字向量
为了计算内容之间的相似度,要计算相似度那就需要把内容映射成向量,第一步就是先把每个词语映射成向量,映射的方式有几种:
- 使用one hot方法映射成向量
- 自己训练word2vec密度向量;
- 使用业界的训练好的word2vec向量
一般情况下,自己的数据集比较小,效果会比业界的word2vec效果差一些。
推荐腾讯开源的全网200维度的word2vec向量
计算内容粒度的数字向量
得到关键词的向量之后,通过加权平均的方式可以计算整个文档的向量;权重可以使用每个词语的频率次数归一化,或者直接平均即可;
计算文档的相似度;
使用余弦相似度算法就能够计算文档向量之间的相似度,计算完之后每个文章的相似度数值的排序就是内容相似程度。
快速相似度检索;
将内容文档ID作为redis的key,相近内容ID列表作为value。
相似内容可以取距离最近的N条数据作为缓存。
当用户访问一个页面的时候,后端直接从缓存redis中根据提取相似ID列表;
总结
以上就是离线计算相似推荐的步骤,其实还可以用在线的方式进行,把这个问题按照搜索的架构实现即可,新来一个文档就分词、计算关键词列表存储,然后每次访问的时候根据关键词列表查询相同关键词列表的文档也可以实现。
当相似内容推荐上线后,就能够不断积累一些用户点击、查看文档的行为数据,基于行为数据就能训练协同过滤的模型,实现内容不相似但是行为相似的协同过滤推荐。