标签在我们日常生活中很常见,打标签作为一种重要的用户行为,蕴含了很多用户兴趣信息,因此深入研究和利用用户打标签的行为可以很好地指导我们改进个性化推荐系统的推荐质量。举个例子,下图是酷我音乐的标签,有了标签,用户可以快速找到自己感兴趣的歌,同时酷我也可以通过用户经常使用的标签,更精确的为用户推荐感兴趣的歌曲

原理

当拿到了用户标签行为数据,相信大家都可以想到一个最简单的个性化推荐算法,这里我们称为SimpleTagBased。其描述如下所示:
  1. 统计每个用户最常用标签
  2. 对于每个标签,统计被打过这个标签次数最多的物品
  3. 对于一个用户,找到他常用的标签,从而找到具有这些标签的热门物品进行推荐

  一个用户标签行为的数据集一般由一个三元组的集合表示,其中记录 (u,i,b) 表示用户 u 给物品 i  打上了标签 b 。当然,用户的真实标签行为数据远远比三元组表示的要复杂,比如用户打标签的时间、用户的属性数据、物品的属性数据等。所以用户 u 对物品 i 的兴趣公式如下:

案例分析

     假设我们拥有一组音乐数据,如下所示:

 def load_data(file_path):records = []f = open(file_path, "r", encoding="utf-8")for line in f:info = line.strip().split("\t")records.append(info)return records#   [['A', '一曲相思', '流行'], ['A', '生僻字', '流行'], ['A', '最后的莫西干人', '纯音乐'], ['A', '倩女幽魂', '经典'], ['B', '故乡的原风景', '纯音乐'], ['B', '生僻字', '流行'], ['B', '故乡的原风景', '纯音乐'], ['C', '倩女幽魂', '经典'], ['C', '海阔天空', '经典'], ['D', '海阔天空', '经典'], ['A', '突然好想你', '寂寞'], ['C', '走西口', '民歌'], ['D', '走西口', '民歌'], ['B', '重头再来', '励志'], ['D', '倩女幽魂', '经典'], ['C', '重头再来', '励志'], ['D', '最后的莫西干人', '纯音乐']]

数据处理
数据处理
统计出 user_tags  和 tag_items,其中 user_tags=   ,tag_items =

def InitStat(records):user_tags = dict()  # 用户打过标签的次数tag_items = dict()  # 音乐被打过标签的次数,代表歌曲流行度for user, item, tag in records:user_tags.setdefault(user, dict()) user_tags[user].setdefault(tag, 0)user_tags[user][tag] += 1tag_items.setdefault(tag, dict())tag_items[tag].setdefault(item, 0)tag_items[tag][item] += 1print("用户打过标签的次数: ", user_tags)print("音乐打过标签的次数: ", tag_items)    return user_tags, tag_items"""用户打过标签的次数:  {'A': {'流行': 2, '纯音乐': 1, '经典': 1, '寂寞': 1}, 'B': {'纯音乐': 2, '流行': 1, '励志': 1}, 'C': {'经典': 2, '民歌': 1, '励志': 1}, 'D': {'经典': 2, '民歌': 1, '纯音乐': 1}}音乐打过标签的次数:  {'流行': {'一曲相思': 1, '生僻字': 2}, '纯音乐': {'最后的莫西干人': 2, '故乡的原风景': 2}, '经典': {'倩女幽魂': 3, '海阔天空': 2}, '寂寞': {'突然好想你': 1}, '民歌': {'走西口': 2}, '励志': {'重头再来': 2}}"""

推荐

有了上面获得的数据统计,那么我们就可以根据用户对歌曲的兴趣来为用户推荐歌曲,兴趣度越大,越被优先推荐。

 def Recommend(user, K):recommend_items = dict()for tag, wut in user_tags[user].items():for item, wti in tag_items[tag].items():if item not in recommend_items:recommend_items[item] = wut * wti    # 计算用户对物品兴趣度else:recommend_items[item] += wut * wtirec = sorted(recommend_items.items(),key = lambda x:x[1],reverse = True)   # 将推荐歌曲按兴趣度排名print("用户对歌曲兴趣度: ", rec)music = []for i in range(K):music.append(rec[i][0])music = "/".join(music)print("为用户推荐歌曲: ", music)return music"""可以获得为用户推荐的歌单,这里需要去除用户已经感兴趣的歌用户对歌曲兴趣度: [('生僻字', 4), ('倩女幽魂', 3), ('一曲相思', 2), ('最后的莫西干人', 2), ('故乡的原风景', 2), ('海阔天空', 2), ('突然好想你', 1)]推荐歌曲:  生僻字/倩女幽魂
"""

优化计算公式:

 def InitStat_update(records):user_tags = dict()  # 用户打过标签的次数tag_items = dict()  # 音乐被打过标签的次数,代表歌曲流行度tag_user = dict()   # 标签被用户标记次数for user, item, tag in records:user_tags.setdefault(user, dict())user_tags[user].setdefault(tag, 0)user_tags[user][tag] += 1tag_items.setdefault(tag, dict())tag_items[tag].setdefault(item, 0)tag_items[tag][item] += 1tag_user.setdefault(tag, dict())tag_user[tag].setdefault(user, 0)tag_user[tag][user] += 1print("用户打过标签的次数: ", user_tags)print("音乐打过标签的次数: ", tag_items)print("标签被用户使用次数: ", tag_user)return user_tags, tag_items, tag_user
"""用户打过标签的次数:  {'A': {'流行': 2, '纯音乐': 1, '经典': 1, '寂寞': 1}, 'B': {'纯音乐': 2, '流行': 1, '励志': 1}, 'C': {'经典': 2, '民歌': 1, '励志': 1}, 'D': {'经典': 2, '民歌': 1, '纯音乐': 1}}音乐打过标签的次数:  {'流行': {'一曲相思': 1, '生僻字': 2}, '纯音乐': {'最后的莫西干人': 2, '故乡的原风景': 2}, '经典': {'倩女幽魂': 3, '海阔天空': 2}, '寂寞': {'突然好想你': 1}, '民歌': {'走西口': 2}, '励志': {'重头再来': 2}}标签被用户使用次数:  {'流行': {'A': 2, 'B': 1}, '纯音乐': {'A': 1, 'B': 2, 'D': 1}, '经典': {'A': 1, 'C': 2, 'D': 2}, '寂寞': {'A': 1}, '民歌': {'C': 1, 'D': 1}, '励志': {'B': 1, 'C': 1}}
"""

同时推荐的算法,修正为 TagBasedTFIDF

 def Recommend_update(user, K):recommend_items = dict()for tag, wut in user_tags[user].items():for item, wti in tag_items[tag].items():if item not in recommend_items:recommend_items[item] = wut * wti/log(1+len(tag_user[tag]))     # 计算用户对物品兴趣度else:recommend_items[item] += wut * wti/log(1+len(tag_user[tag])) rec = sorted(recommend_items.items(),key = lambda x:x[1],reverse = True)   # 将推荐歌曲按兴趣度排名print("用户对歌曲兴趣度", rec)music = []for i in range(K):music.append(rec[i][0])music = "/".join(music)print("为用户推荐歌曲: ", music)return music"""用户对歌曲兴趣度: [('生僻字', 3.6409569065073493), ('倩女幽魂', 2.1640425613334453), ('一曲相思', 1.8204784532536746), ('最后的莫西干人', 1.4426950408889634), ('故乡的原风景', 1.4426950408889634), ('海阔天空', 1.4426950408889634), ('突然好想你', 1.4426950408889634)]推荐歌曲:  生僻字/倩女幽魂
"""

python 完整代码:

#!/usr/bin/env python
# coding: utf-8from math import log
from collections import defaultdictdef load_data(file_path):records = []f = open(file_path, "r", encoding="utf-8")for line in f:info = line.strip().split("\t")records.append(info)f.close()return recordsdef InitStat(records):user_tags = dict()  # 用户打过标签的次数tag_items = dict()  # 音乐被打过标签的次数,代表歌曲流行度for user, item, tag in records:user_tags.setdefault(user, dict())user_tags[user].setdefault(tag, 0)user_tags[user][tag] += 1tag_items.setdefault(tag, dict())tag_items[tag].setdefault(item, 0)tag_items[tag][item] += 1return user_tags, tag_itemsdef InitStat_update(records):user_tags = dict()  # 用户打过标签的次数tag_items = dict()  # 音乐被打过标签的次数,代表歌曲流行度tag_user = dict()  # 标签被用户标记次数for user, item, tag in records:user_tags.setdefault(user, dict())user_tags[user].setdefault(tag, 0)user_tags[user][tag] += 1tag_items.setdefault(tag, dict())tag_items[tag].setdefault(item, 0)tag_items[tag][item] += 1tag_user.setdefault(tag, dict())tag_user[tag].setdefault(user, 0)tag_user[tag][user] += 1return user_tags, tag_items, tag_userdef InitStat_update_2(records):user_tags = dict()  # 用户打过标签的次数tag_items = dict()  # 音乐被打过标签的次数,代表歌曲流行度tag_user = dict()  # 标签被用户标记次数item_user = dict()  # 音乐被不同用户标记次数for user, item, tag in records:user_tags.setdefault(user, dict())user_tags[user].setdefault(tag, 0)user_tags[user][tag] += 1tag_items.setdefault(tag, dict())tag_items[tag].setdefault(item, 0)tag_items[tag][item] += 1tag_user.setdefault(tag, dict())tag_user[tag].setdefault(user, 0)tag_user[tag][user] += 1item_user.setdefault(item, dict())item_user[item].setdefault(user, 0)item_user[item][user] += 1return user_tags, tag_items, tag_user, item_userdef Recommend(user, K):recommend_items = dict()for tag, wut in user_tags[user].items():for item, wti in tag_items[tag].items():if item not in recommend_items:recommend_items[item] = wut * wti  # 计算用户对物品兴趣度else:recommend_items[item] += wut * wtirec = sorted(recommend_items.items(), key=lambda x: x[1], reverse=True)  # 将推荐歌曲按兴趣度排名print(">>", rec)music = []for i in range(K):music.append(rec[i][0])music = "/".join(music)return musicdef Recommend_update(user, K):recommend_items = dict()for tag, wut in user_tags[user].items():for item, wti in tag_items[tag].items():if item not in recommend_items:recommend_items[item] = wut * wti / log(1 + len(tag_user[tag]))  # 计算用户对物品兴趣度else:recommend_items[item] += wut * wti / log(1 + len(tag_user[tag]))rec = sorted(recommend_items.items(), key=lambda x: x[1], reverse=True)  # 将推荐歌曲按兴趣度排名print(">>>>>>", rec)music = []for i in range(K):music.append(rec[i][0])music = "/".join(music)return musicdef Recommend_update_2(user, K):recommend_items = dict()for tag, wut in user_tags[user].items():for item, wti in tag_items[tag].items():if item not in recommend_items:recommend_items[item] = (wut / log(1 + len(tag_user[tag]))) * (wti / log(1 + len(item_user[item])))  # 计算用户对物品兴趣度else:recommend_items[item] += (wut / log(1 + len(tag_user[tag]))) * (wti / log(1 + len(item_user[item])))rec = sorted(recommend_items.items(), key=lambda x: x[1], reverse=True)  # 将推荐歌曲按兴趣度排名print(">>>>>>", rec)music = []for i in range(K):music.append(rec[i][0])music = "/".join(music)return musicif __name__ == '__main__':file_path = u"./data/标签的推荐数据.txt"records = load_data(file_path)# print(records)# user_tags, tag_items = InitStat(records)# user_tags, tag_items, tag_user = InitStat_update(records)user_tags, tag_items, tag_user, item_user = InitStat_update_2(records)print("用户打过标签的次数: ", user_tags)print("音乐打过标签的次数: ", tag_items)print("标签被用户使用次数: ", tag_user)print("音乐被用户标记次数: ", item_user)# rec = Recommend("A", 2)# rec = Recommend_update("A", 2)rec = Recommend_update_2("A", 2)print("推荐歌曲: ", rec)

推荐系统 - 基于标签的推荐算法相关推荐

  1. 推荐系统-基于内容的推荐算法(Content-Based)

    基于内容的推荐算法(Content-Based) 简介 基于内容的推荐方法是非常直接的,它以物品的内容描述信息为依据来做出的推荐,本质上是基于对物品和用户自身的特征或属性的直接分析和计算. 例如,假设 ...

  2. 推荐系统之基于标签的推荐算法

    文章目录 1.联系用户和物品的途径 2.标签系统的典型代表 3.基于标签的推荐系统 3.1 试验设置 3.2 最简单的推荐算法 思路: 定义: 1.联系用户和物品的途径 第一种方式利用用户喜欢过的物品 ...

  3. 推荐系统--基于图的推荐算法

    基于图的模型(graph−basedmodel )是推荐系统中的重要内容.在研究基于图的模型之前,首先需要将用户行为数据表示成图的形式.这里我们将用户行为数据用二分图表示,例如用户数据是由一系列的二元 ...

  4. 基于特征的推荐算法【转】

    http://in.sdo.com/?p=2779 推荐算法准确度度量公式: 其中,R(u)表示对用户推荐的N个物品,T(u)表示用户u在测试集上喜欢的物品集合. 集合相似度度量公式(N维向量的距离度 ...

  5. 基于内容的推荐算法(Content-Based)

    基于内容的推荐算法(Content-Based) 简介 基于内容的推荐方法是非常直接的,它以物品的内容描述信息为依据来做出的推荐,本质上是基于对物品和用户自身的特征或属性的直接分析和计算. 内容推荐算 ...

  6. 笔记:基于标签的推荐系统、基于图的推荐算法、PersonalRank

    笔记:基于标签的推荐系统.基于图的推荐算法.PersonalRank 发表于11个月前(2015-05-26 19:15)   阅读(44) | 评论(0) 2人收藏此文章, 我要收藏 赞0 原文:h ...

  7. 推荐系统实战(5)——基于内容的推荐算法(CB)

    1 基础CB推荐算法 基础CB推荐算法利用物品的基本信息和用户偏好内容的相似性进行物品推荐.通过分析用户已经浏览过的物品内容,生成用户的偏好内容,然后推荐与用户感兴趣的物品内容相似度高的其他物品. 比 ...

  8. 推荐系统6——基于标签的推荐方法

    在之前我也看了很多人写的推荐系统的博客,理论的.算法的都有,多是个人的理解和感悟,虽然很深刻,但是对于自己而言还是不成系统,于是我参考大牛项亮编著的<推荐系统实践>将该领域知识系统整理一遍 ...

  9. 《网络电视节目推荐系统----基于用户协同过滤与基于内容的推荐算法的后融合》

    文章目录 一.什么是推荐系统 二.产生原因 由上我们可以得知,推荐系统产生的两大原因 三.应用场景 四.推荐系统的评测方法 1. 推荐系统的三大实验方法 a. 离线实验: b. 用户调查 c. 在线实 ...

最新文章

  1. 关于 微软必应词典客户端(pc) 的案例分析
  2. 【SpringBoot专题】监控健康状况
  3. lvm 扩展根目录_Linux下lvm在线扩容步骤
  4. Thrift第三课 编写脚本
  5. 12v电流表的正确接法_滑动变阻器的分压与限流接法
  6. Linux安装日文语言包,以及,TeraTerm显示乱码问题 的 解决
  7. MySQL 代码开发注意事项----开发高性能的sql
  8. 企业常用的站内收索、QQ群、在线客服
  9. IDEA集成SVN插件及SVN使用 - 超详细
  10. vmware 中安装chrome os操作系统
  11. 07.JavaScript弹窗——alert、prompt、confirm
  12. C# (1)点击菜单跳出新窗体,(2)在主窗体中切换子窗体(pannel控件的使用)
  13. 计算机维修工文明操作,初级计算机维修工操作题.doc
  14. 线性代数系列(十一)--正交矩阵和正交化
  15. linux编译动态库未定义,GCC链接库的一个坑:动态库存在却提示未定义动态库的函数...
  16. d-link路由器虚拟服务器,两台D-Link路由器之间如何桥接上网
  17. AndroidStudio的下载、安装、第一个工程运行
  18. vue 路由重定向_使用Vue和Vue路由器进行高级路由:重定向和Nav Guard
  19. 大数据时代的伦理道德
  20. 媒体报道|香港科大(广州)创校校长倪明选:“接下来的30年,我们希望再创造一个新的历史”...

热门文章

  1. HTML中常用标签的英文全称
  2. Android Base64解码失败问题
  3. Word邮件合并功能详解:合并后生成多个word文档,删除空白页
  4. 2022漂亮有质感的SummerAdmin后台模板+Layui内核
  5. redis cluster 集群 HA 原理和实操(史上最全、面试必备)
  6. 小程序报错 TypeError: Cannot read property getPreloadAdUnitIds ?
  7. [强网杯 2019]随便注 1
  8. hdmi怎么支持2k分辨率_简单选择题!花3K买虚荣,还是2K买个踏实
  9. fm24c16c语言程序,单片机读写24C01~24C16程序
  10. 精通WordPress设计与开发:第3章 本地开发WordPress