基于标签的推荐系统学习(1)

最近看一些推荐系统的东西。比较感兴趣的是基于标签的推荐系统。也就是通过用户的标签行为建立起用户和目标物品的联系,从而挖掘用户的兴趣或者是尽兴定向的推荐。

一个用户的标签行为一般由一个三元组组成<用户,物品,标签>(<u,i,b>)即用户u给物品i打上了b标签。

一个简单的基于标签的推荐系统可以通过如下步骤实现:

1.统计每个用户最常用标签;

2.对于每个标签,统计被打过这个标签次数最多的物品;

3.对于一个用户,找到他常用的标签,从而找到具有这些标签的热门物品进行推荐。

从而可以得到用户u对于物品i的兴趣公式:


假设用records来表示来存储标签数据的三元组,即records[i]=[user, item, tag]

user_tags存储用户u打过标签b的次数,即user_tags[u][b]=n;

tag_items存储物品i被打过标签b的次数,即tag_item[b][i]=n;

user_items存储用户所打过标签的物品,即user_items[u][i]=n;

#coding: UTF-8
import random
#统计各类数量
def addValueToMat(theMat,key,value,incr):
    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():
    data_file = open('xxx.dat')
    line = data_file.readline(); 
    while line:
        if random.random()>0.1:#将90%的数据作为训练集,剩下10%的数据作为测试集
            terms = line.split("\t");#训练集的数据结构是[user, item, tag]形式
            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].items():#用户打过的标签及次数
        for item_,wit in tag_items[tag_].items():#物品被打过的标签及被打过的次数
            if item_ not in tagged_item:#已经推荐过的不再推荐
                if item_ not in recommend_list:
                    recommend_list[item_]=wut*wit;#根据公式
                else:
                    recommend_list[item_]+=wut*wit;
    return recommend_list
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值