根据维基百科的定义,标签是一种无层次化结构的、用来描述信息的关键词,它可以用来描述物品的语义。
根据给物品打标签的人的不同,标签应用一般分为两种:
一种是让作者或者专家给物品打标签;
另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用户生成的内容)的标签应用。
标签系统的不同作用:表达,组织,学习,发现,决策
Delicious的标签分类:物品是什么,物品的种类,谁拥有物品,用户的观点,相关的标签,用户的任务
得到物品之间的相似度以后,可以通过以下公式计算推荐列表的多样性:
代码如下:
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 += CosineSim(item_tags, i, j)
n += 1
return ret/(n*1.0)
至于推荐系统的新颖性,我们简单地使用推荐结果的平均热门程度(AveragePopularity)度量。对于物品i,定义它的流行度item_pop(i)为给这个物品打过标签的用户数。而对推荐系统,我们定义它的平均热门度如下:
一个简单的标签算法:
①统计每个用户最常用的标签;
②对于每个标签,统计被打过这个标签次数最多的物品;
③对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户
兴趣公式如下:
B(u)是用户u打过标签的集合,B(i)是物品i被打过的标签集合,n(u,b)是用户u打过标签b的次数,n(b,i)是物品i被打过标签b的次数
算法的改进
1.TF-IDF
前面的公式造成推荐热门物品给用户的情况,降低了结果的新颖性。我们可以借鉴TF-IDF的思想,对这一公式改进:
同理,我们可以借鉴TF-IDF的思想对热门物品进行惩罚:
试验结果表面,适当惩罚热门标签和物品,在增进推荐结果的同时并不会降低推荐结果的离线精度
2.数据的稀疏性
可以使用标签集合进行扩展。如果认为不同标签具有某种相似度,那么当两个标签同时出现在很多物品的标签集合中时,我们就可以认为这两个标签具有较大的相似度。对于标签b,另N(b)为有标签b的物品的集合,n(b,j)为物品i打上标签b的用户数,我们可以通过如下余弦相似度公式计算标签b和标签b'的相似度:
3.标签清理
①去除词频很高的停止词;
②去除因词根不同造成的同义词;
③去除因分隔符造成的同义词
基于图的推荐算法
上图是一个简单的SimpleTagGraph例子,可以使用第二章提到的PersonalRank算法。用户对物品的兴趣公式如下:
基于标签的推荐解释
Jesse VIg设计了4种标签解释的展示界面:
①RelSort:对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了用户对标签的兴趣和标签与物品的相关度,但标签按照和物品的相关度排序;
②PrefSort:对推荐物品做解释时使用的是用户以前使用过切物品上有的标签,给出了用户对标签的兴趣和标签与物品的相关度,但标签按照用户的兴趣程度排序;
③RelOnly:对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了标签于物品的相关度,且标签按照和物品的相关度排序;
④PrefOnly:对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了用户对标签的兴趣程度,且标签按照用户的兴趣程度排序
然后,作者调查了用户对不同类型标签的看法,作者将标签分为主观类(比如对电影的看法)和客观类(比如对电影内容的描述)
结果调查问卷的统计,作者得出以下结论:
①用户对标签的兴趣对帮助用户理解为什么给他们推荐某个物品更有帮助;
②用户对标签的兴趣和物品标签相关度对于帮助用户判定自己是否喜欢被推荐物品具有同样的作用;
③物品标签相关度对于帮助用户判定被推荐物品是否符合他当前的兴趣更有帮助;
④客观事实类标签相比主观感受类标签对用户更有作用
给用户推荐标签
一般认为,给用户推荐标签有以下好处:
①方便用户输入标签
②提高标签质量
有4种方法给哦用户推荐和物品i相关的标签:
0:给用户推荐系统里热门的标签;
①:给用户推荐此物品上最热门的标签;
②:给用户推荐自己经常用的标签;
③:前两种的融合
试验证明,最后一种方法在合适的参数下效果最好
基于图的标签推荐算法
在根据用户打标签的行为生成图之后,我们可以利用PersonalRank算法进行排名。我们可以重新定义顶点的启动概率,如下所示:
也就是说,只有用户u对物品i对应的顶点有非0的启动概率。参数α可以通过离线试验选择