博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
推荐系统实践第四章: 利用用户标签
阅读量:7282 次
发布时间:2019-06-30

本文共 2578 字,大约阅读时间需要 8 分钟。

基本上可以通过3种方式联系用户兴趣和物品:

  • 用户喜欢过的物品(item-cf)
  • 用户的好友或者有相似兴趣的好友喜欢过的物品(user-cf)
  • 用户具有哪些feature, 哪些物品保护

之前用了user-cf,item-cf, 现在考虑使用标签进行推荐。

标签是一种无层次化结构的、用来描述信息的关键词。

给物品打标签:

  • 专家、作者
  • 用户

标签系统中存在的问题:

  • 如何基于标签推荐
  • 如何给用户推荐标签

基于标签的推荐系统示例:

利用Delicious数据集:(待链接)

     格式:userID     bookmarkID     tagID     timestamp

方法如书上介绍:

代码如下:

# -*- coding: UTF-8 -*-'''Created on 2014��9��15��@author: joeyqzhou'''import randomdef addValueToMat(theMat,key,value,incr):    #theMat是字典格式    #它的value也是字典格式    if key not in theMat: #如果key没出先在theMat中        theMat[key]=dict();        theMat[key][value]=incr;#    else:        if value not in theMat[key]:            theMat[key][value]=incr;        else:            theMat[key][value]+=incr;user_tags = dict();tag_items = dict();user_items = dict();user_items_test = dict();def InitStat():    #init:     data_file = open('E:\\RecomDataSet\\Decilious\\bookTag\\user_taggedbookmarks-timestamps.dat')    line = data_file.readline(); ##去掉第一行    line = data_file.readline();     while line:        if random.random()>0.1:##添加xunlianji            terms = line.split("\t");            user=terms[0];            item=terms[1];            tag=terms[2];            addValueToMat(user_tags,user,tag,1)            addValueToMat(tag_items,tag,item,1)            addValueToMat(user_items,user,item,1)            line = data_file.readline();        else:               addValueToMat(user_items_test,user,item,1)    data_file.close();   def Recommend(usr):    recommend_list = dict();    tagged_item = user_items[usr];    for tag_,wut in user_tags[usr]:        for item_,wit in tag_items[tag_]:            if item_ not in tagged_item:                if item_ not in recommend_list:                    recommend_list[item_]=wut*wit;                else:                    recommend_list[item_]+=wut*wit;InitStat();#Recommend(8);recom_len=0;#推荐的总长度hit=0;#预测准确的个数test_len=0;#测试集长度for user in user_items_test:#计算测试集的长度,来计算召回率    test_len+=user_items_test[user].__len__();for user in user_items:    for item in user_items[user]: #item被用户打过的标签至少打过一次        if user_items[user][item]>0:#如果打过三次以上就推荐            recom_len+=1;            if item in user_items_test:                hit+=1;print "precision="+str(hit*1.0/recom_len);print "recall="+str(hit*1.0/test_len);###利用内置sorted函数排序#print sorted(user_items['8'].items(),key=lambda dic:dic[1],reverse=True)

把数据集分为10%测试,90%训练,个人程序跑的结果如下:

准确率:1.8%

召回率:5.6%

  • 上面简单的方法可能会造成容易推荐热门,可以利用TF-IDF来优化
  • 对于新用户或者新item,标签比较稀疏,那么可以进行标签扩展。方法有:
    • topic model
    • 利用数据统计标签相似度

标签清理

    • 不是所有标签都反应用户的兴趣(比如“不好笑)
    • 有利于给推荐解释
    • 方法:去掉停止词,合并同义词或者分隔符造成的同义词。

转载于:https://www.cnblogs.com/Dzhouqi/p/3978885.html

你可能感兴趣的文章
Docker安装(yum方式 centos7)
查看>>
运算符
查看>>
一个简单的转换字母大小写的方法
查看>>
hibernate中evict()和clear()的区别
查看>>
学习web components
查看>>
PHP 将秒数转换成时分秒
查看>>
node.js 模块加载原理
查看>>
一个自定义线程池的小Demo
查看>>
Report_SRW工具的基本用法(概念)
查看>>
dedecms设置文章分页后,标题会带有序号的解决方法
查看>>
MySQL复制
查看>>
模式识别之相似度计量---余弦计算相似度度量关于两句话的相似度
查看>>
Django之ORM相关操作
查看>>
SVN 安装后报不是内部或外部命令
查看>>
win10 + cuda(v9.0) 安装TensorFlow-gpu版
查看>>
上课笔记
查看>>
工具类(为控件设置圆角) - iOS
查看>>
自定义android的tab样式
查看>>
查询 哪张表 有某字段
查看>>
leetcode700
查看>>