# recommender **Repository Path**: pengyouyou/recommender ## Basic Information - **Project Name**: recommender - **Description**: 以文章的标签和置信度评分,基于用户的行为数据,借鉴TF-IDF算法构建用户的兴趣标签向量,量化用户对于文章的评分,根据评分结果对用户做个性化推荐。推荐系统使用Zerorpc为后端提供远程过程调用服务。 - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2021-05-07 - **Last Updated**: 2024-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Recommender系统介绍 以活动或资讯(以下统称文章)的标签和置信度评分,基于用户的行为数据,借鉴`TF-IDF`算法构建用户的兴趣标签向量,量化用户对于文章的评分,根据评分结果对用户做个性化推荐。推荐系统使用`Zerorpc`为后端提供远程过程调用服务。 ### 文章标签标注 通过百度NLP文本标签服务对文章的标题和内容进行深度分析,输出能够反映文章关键信息的主题、话题、实体等多维度标签以及对应的置信度,置信度score取值范围[0,1]。为一篇文章标注的标签可以是多个。 ### 用户行为记录 建立用户行为表,统计资讯和主页活动的用户行为,目前只用记录浏览行为 ```sql CREATE TABLE If Not Exists user_behavior( id INT UNSIGNED AUTO_INCREMENT, uid INT NOT NULL COMMENT '用户ID', aid INT NOT NULL COMMENT '活动或资讯ID', atype TINYINT(1) NOT NULL DEFAULT 0 COMMENT '类型[0:活动,1:资讯...]', operate TINYINT(1) NOT NULL DEFAULT 0 COMMENT '操作[0:浏览,1:点赞,2:评论,3:转发,4:收藏...]', opttime INT NOT NULL COMMENT '操作时间', PRIMARY KEY(id) )charset=utf8; ``` ### 用户兴趣标签向量 #### 1.用户对标签的喜好程度 用户u对文章a的评分`rate(u,a)`可以通过用户的浏览行为表达,仅浏览评分为1,收藏评分为2;文章a与标签t的相关度`rel(a,t)`为文章标签的置信度。 用户u对标签t的喜好程度`fav(u,t)`则可以由`rate(u,a)`和`rel(a,t)`得到: $$fav(u,t)=\frac{{\displaystyle\sum_{i\in A}}rate(u,i)\times rel(i,t)}{n(u,t)}$$ > 其中`n(u,t)`代表用户u浏览过包含标签t的文章总数 #### 2.用户对标签的依赖程度 在基于标签的推荐中存在“马太效应”,即热门标签由于被展示的次数较多而变得越来越热门,而冷门标签也会越来越冷门。大多数用户标注的标签都集中在一个很小的集合内,而大量长尾标签则较少有用户使用。事实上,较冷门的标签才能更好地体现用户的个性和特点。 为了抑制这种现象,更好地体现用户的个性化,这里借鉴`TF-IDF`算法,使用逆向文件频率IDF(Inverse Document Frequency)来对热门标签进行数值惩罚。 使用词频TF(Term Frequency)来计算每个标签的权重,用该权重来表达用户对标签的依赖程度。用户u的兴趣标签t对应的TF值的计算公式为: $$TF(u,t)=\frac{\displaystyle n(u,t)}{{\displaystyle\sum_{i\in T}}n(u,i)}$$ 用户u的兴趣标签t对应的IDF值的计算公式为: $$IDF(u,t)=lg\frac{\displaystyle\sum_{u_i\in U}\sum_{t_j\in T}n(u_i,t_j)}{1+{\displaystyle\sum_{u_i\in U}}n(u_i,t)}$$ > 分子表示所有用户对所有标签t的标记计数和 分母表示所有用户对标签t的标记计数和 IDF(u,t)表示t的热门程度,即标签t被用户u使用的频率 对于一个标签而言,如果使用过它的用户数量很少,但某一个用户经常使用它,说明这个用户与这个标签的关系更紧密。 #### 3.用户对标签的兴趣度 综合上述,用户u对标签t的兴趣度`pre(u,t)`可以表达为$pre(u,t) = fav(u,t) \times TF(u,t) \times IDF(u,t)$,那么用户的兴趣标签向量就可以表示为一系列的兴趣度的稠密数组。 ### 用户个性化推荐 利用用户的兴趣标签向量,结合衰减机制,计算得出与用户兴趣匹配度最高的N篇文章结果,再结合最热门(按点击量降序)的文章列表,分页推荐给用户。目前每页的10条结果中,随机2-5条根据兴趣计算的结果,匹配度越高的文章优先推荐给用户的概率越大。 ### 启动推荐服务 ```bash source activate conda activate tensorflow python server.py ``` ### 后端接入 1. 安装`Zerorpc`,`Zerorpc`是一个基于`ZeroMQ`和`MessagePack`开发的远程过程调用协议(RPC)实现 ```javascript npm install zerorpc ``` 2. 监听本地端口,通过`invoke`调用`recommend`方法获取推荐结果 ```javascript var zerorpc = require("zerorpc"); var client = new zerorpc.Client(); client.connect("tcp://127.0.0.1:5555"); client.invoke("recommend", { uid: 13, page: 1, size: 10, atype: 1 }, function (error, res, more) { if (error) { console.error(error); } else { console.log("res:", res); } if (!more) { console.log("Done."); } }); ``` > 参数说明: uid: 用户id,未登录可不传 page: 第几页,默认1 size: 每页推荐条数,默认10 atype: [0:活动,1:资讯...],默认0 ### 任务列表 - [x] 基于内容标签的推荐 - [ ] 衰减机制 - [x] 逆向文件频率(IDF)惩罚热门标签 - [ ] 用户浏览行为按周期衰减 - [x] 资讯按发布时间衰减评分 - [ ] 推荐过的内容不再推荐 - [x] 冷启动问题 - [x] 结合收藏行为推荐 - [ ] 结合搜索关键字推荐 ### END ****