您的位置:首页 > 其它

实战智能推荐系统(12)-- 标签推荐系统

2018-03-30 17:41 295 查看

标签推荐系统

标签推荐系统指的是利用用户对物品打标签的行为作出推荐。数据组织形式可用最简单的三元组表示(用户,物品,标签)。对于每个物品 i ,item_tags[i] 存储了物品 i 的标签向量,其中 item_tags[i][b] 表示用户对物品 i 打标签 b 的次数。那么物品 i 和物品 j 的余弦相似度可以通过如下的程序计算:def CosineSim(item_tags, i, j):
    ret = 0
    for b,wib in item_tags[i].items():
        if b in item_tags[j].keys():
            ret += wib * item_tags[j][b]
    ni = 0
    nj = 0
    for b ,w in item_tags[i].items():
        ni += w * w
    for b, w in item_tags[j].items():
        nj += w * w
    if ret == 0:
        return 0
    return ret / math.sqrt(ni * nj)
得到物品相似度后,我们可以用如下公式计算推荐结果的多样性def Diversity(item_tags, recommend_items):
    ret = 0
    n = 0
    for i in recommend_items.keys():
        for j in recommend_items.keys():
            if i == j :continue
            ret += ConsineSim(item_tags, i ,j)
            n += 1
    return 1 - ret / (n * 1.0)

基于标签数据的推荐算法

针对标签数据,最简单的计算用户 u 对物品 i 的兴趣公式如下:



b代表标签,u代表用户,i 代表物品,

 表示用户u 打过标签 b 的次数,

表示标签b 被在物品 i 上被标记的次数。
用 records 存储标签数据的三元组,其中 records[i] = [user,item,tag]
用 user_tags 存储

,其中 user_tags[u][b] = 


用 tag_items 存储

,其中 tag_items[b][i] = 


如下程序可以从 records 中统计出 user_tags 和 tag_items:def InitStat(records):
    user_tags = dict()
    tag_items = dict()
    user_items = dict()
    for user, item, tag in records.items():
        addValueToMat(user_tags, user, tag, 1)
        addValueToMat(tag_items, tag, item, 1)
        addValueToMat(user_items, user, item, 1)
统计出 user_tags 和 tag_items  后,我们可以利用上面的公式进行推荐,python实现如下:def Recommend(user):
    recommend_items = dict()
    tagged_items = user_items[user] #已经被标记过的物品
    for b, nub in user_tags[user].items():
        for i, nbi in tag_items[b].items():
            if i in tagged_items:
                continue
            if i not in recommend_items:
                recommend_items[i] = nub * nbi
            else:
                recommend_items[i] += nub * nbi
    return recommend_items

推荐算法公式改进

以下是初始算法公式:



b代表标签,u代表用户,i 代表物品,

 表示用户u 打过标签 b 的次数,

表示标签b 被在物品 i 上被标记的次数。

这个公式倾向于给热门标签对应的物品很大的权重,因此会造成推荐热门标签的物品给用户,从而降低推荐结果的新颖性。对热门标签增加惩罚后,改进公式如下:



其中 

 记录了标签 b 被多少个不同的用户使用过。这个算法记为 TagBasedTFIDF。
再经过进一步的优化,再加上对热门物品的惩罚项后,改进公式如下:



其中 

 记录了物品 i 被多少个不同的用户标记过,其他项含义不变。这个算法记为 TagBasedTFIDF++。

标签的清理 & 给用户推荐标签

经过前面的讨论可以看到,标签的质量对标签推荐系统有至关重要的影响。但并是不所有的标签都有效,比如用户对一个物品打了一个表示情绪的标签“无聊”,那我们不可能向用户推荐具有“无聊”这个标签的物品。需要清除无效的标签,以免降低推荐系统算法的效果。一般来说有如下的标签清理方法:
1.去除词频很高的停止词
2.去除因词根不同造成的同义词

3.去除因分隔符或大小写造成的同义词
如果上述标签清理的方法还不能满足标签的高度有效性的话,也可以给用户推荐标签。既可以方便用户输入标签,又可以提高标签质量。如下图所示就是一种给用户推荐标签的系统:



如图,一般推荐的标签由两部分组成,一部分是用户自己常用的标签,一部分是物品的热门标签。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  标签推荐系统