Mr.赵的专栏

正在路上的程序员...

个性化阅读中的推荐系统(一)

最近要为一个资讯类的项目加入个性化推荐的逻辑,以给用户展示更加符合其阅读偏好的文章,提高点击率。之前研究过相关理论,这次在工程中应用上,也属于一边摸索一边实践的过程。

概述

推荐系统中常用的推荐算法有:
- 基于内容的推荐content-based
- 协同过滤collaborative filtering
- 基于模型的推荐,隐语义模型(LFM, latent factor model)推荐,机器学习的模型等

不同的推荐算法有着不同的效果、优点、缺点,适合不同的场景,这个系列的文章用于记录这几种算法的实现过程。

基于内容的推荐

基于内容的推荐算法主要思想是为用户推荐与过去喜欢的item类似的item,比如一个用户看过绝地求生98K好用吗的的文章,那么就可以给他推荐绝地求生98k怎么好用的文章。
基于内容的推荐可以分为以下三步:

  1. 建立文章的特征向量,用来描述这篇文章的关键信息,这里可以使用TF-IDF模型建立一个特征矩阵来描述文章的特征
  2. 建立用户模型,用来描述用户具有哪些偏好,可以通过计算用户浏览过的文章的TF-IDF矩阵的均值作为用户模型
  3. 在推荐过程中,根据用户模型检索类似的文章,可以通过检索Top N个与用户模型特征向量相似的文章向量,作为用户的推荐

但是在这个流程中有一个问题,第3步在工程实现中,如果文章的数量很大,需要计算每篇文章与用户模型的相似度,时间和空间复杂度会很高,所以这里进行了简化,取用户当前浏览的文章作为用户模型,这样可以通过离线计算的方式,提前计算出每篇文章的相似结果。

准备阶段

无论是在构建TF-IDF矩阵还是为文章打标签的过程中,分词都是一个重要的阶段,而目前的数据中大部分是游戏相关的文章,多数主流的分词工具都是基于人民日报语料进行训练得到的词典,所以第一步需要对词典进行完善。也就是从这些语料中提取王者荣耀、绝地求生、阴阳师、天美工作室这样的领域化的词语。

这里参考了互联网时代的社会语言学:基于SNS的文本数据挖掘这个博客中提出的方法,后面会单独写一篇文章讲解这个思路和实现方式

将发现出的领域词汇增加到分词工具词典中,这里使用了清华大学的分词工具thulac,使得分词过程中可以提取出这些词语。

对500万字的语料进行分析,提取了16000个词,包括了贪玩蓝月、红莲斗篷、反伤刺甲等词

基于内容推荐

第一步:将文章向量化
语言都是由词和句组成的,利用出现在文章中的词表示该篇文章,每个词的权重使用信息检索中的TF-IDF来计算,利用这种方法,就将一篇文章用一个向量来表示。可以很方便的使用scikit-learn提供的函数计算。

第二步:计算文章相似度
现在已经将每一篇文章用一个向量表示,那么下一步就是要找到与某一篇文章相似的文章,也就是与一个向量相似的向量。计算向量相似度的方法有很多,像欧几里得公式、余弦相似度公式、杰卡德公式等。这里使用了余弦相似度进行计算,这个计算方法也比较好理解,空间上的两个向量其夹角越小即越相似,也就是余弦值越接近1越相似。
这里写图片描述
scikit-learn同样提供了方便的函数进行计算,可以参考这篇文章,通过计算所有文章向量之间的相似度,得到了一篇文章与哪些文章相似,将其存在redis等存储中。

第三步:推荐给用户
当用户点击一篇文章时,读取存储中与该篇文章相似度前K的文章,推荐给用户。

效果观察

在实现了第一版后,发现存在两个问题:
一是当文章比较多时,需要两两计算余弦相似度,计算量比较大
二是当文章不够多时,推荐算法召回的文章数量过少

解决方案:由于资讯类文章具有一部分时效性,所以每次只计算3天或者一周内的相似文章,做一个折中。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011897301/article/details/79137918
个人分类: 推荐系统
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

个性化阅读中的推荐系统(一)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭