tag推荐系统的关键问题以及解决方案
from: http://www.hxxiaopei.com/?p=141
最近在做推荐产品,读了一些论文,客观的说,扯淡的居多,基本的思路也差不多,结合工作的情况,谈一下tag推荐的产品形态、主要问题以及如何推荐
产品形态以及主要问题
tag 的推荐系统,顾名思义,利用用户或者item的 tag信息进行推荐,涉及到两个产品形态:
1.tag-based recommend,基于tag信息推荐item给用户
2.tag recommend,给用户推荐tag
无论1,还是2,都面临一个问题,tag从哪里来?这个是tag推荐系统最为关键的事情。通常来讲,有4个:
1.专家标注,貌似jnni是这样做的
2.UGC,由用户产生,douban等很多都是这样搞得
3.系统产生,利用用户/item数据
4.人工和系统相结合
解决了tag产生的问题,构建tag体系后,我们只需要抽取相关的feature,就可以完成item推荐或者tag推荐。
tag产生
工程上分析一下如何生成tag:
1.专家标注
目前大多数公司不现实,尤其是startup时,不可能有这么大的投入。
在垂直领域,这个问题可以简化,成熟的相关网站抓取,比如3C类,可以去京东,中关村在线等,结构化数据,效果不错。
覆盖率可能不够,但是作为startup公司或者要求不高时,应该够用,如果做深,是一个无底洞,taobao N多人N年搞产品库,投入很大。
所以有朋友希望兼职做做产品库挖掘,尤其说类似淘宝那种,直接拒绝。
2.UGC
tag的获取不是问题,产生的tag有很大的随意性,问题在于如何处理这些tag,主要问题:
1.书写不规范,最重要的问题,比如 美女,大美女,recomend system recomendation system, RS 等等,需要做归一化
2.同义关系
目前UGC 产生标签,是最主要的形式,不过产品前期比较多,稳定后用户更多的会采用推荐的tag
3.系统产生
用系统产生tag,基于user或者item信息,最简单的方式,将用户访问item的title取出来,处理后生成tag给用户,比如用户浏览”美女范冰冰“,可以将”美女“”范冰冰“作为该item的tag。
这种方式在系统初始化时,非常有效,无UGC数据,如果给用户提供tag,提高用户体验以及规范用户行为
目前的工作主要是针对用户的浏览的web,提供该web的tag信息,供用户选择。问题是web的title包含的信息太好,尤其是非文本类web页面。主要处理的方式,对title分词后
1.过滤掉停用词,比如数字,的,一个 等,极端一点过滤掉所有的单字,但是会将其中的名词滤掉
2.只考虑名词,动名词,地名,人名等实体词,这些词对title的信息描述比较好,类似 购买,采购等动词没有意义,这些信息可以在分词是获取到词性信息
3.计算每个token的idf值,对于title来讲,token的 tf值一般都是1,所以只需要idf,出现在title的次数越多,idf越小,生僻token的idf值偏大
目前没有办法很好的计算token的全局或者在title中的分数,只能用idf来描述,大多数情况下还行,但是不够准确。
将用户访问过过的所有item title获取到,提取出来的tag可以作为用户的profile
4.人工和系统结合
这个依赖稍微多一些,1,通过专家或者其他方式获取一批种子数据,比如某些item的tag,然后通过item间的相似性或者其他方式将item关联起来,将tag扩散出去,同样可以生成item的tag列表,当然会有一个权重信息,将低权重滤掉即可。UR
产生种子后,搜索数据中在同query下,url的内容相似性也很大 ,可以获取query->clicked url list以及 clicked url->qurey list,目标是同时对query以及url产生tag,初始化 ,其中 表示通过改query点击url的次数除以通过query点击所有url的总次数。
同时 , 表示通过通过q访问u的次数除以通过所有qeury访问u的总次数,不停地迭代,最后将seed中的tag扩散出去,针对每个url/query,去概率最大的几个tag。
tag推荐
当有了tag数据后,就是利用tag完成那两个产品推荐,首先说明一下可能的feature
1.用户user 使用tag的次数
2.item被打上tag的次数
3,tag被多少个user使用过
4.tag被用在多少个item上面
5.p(tag|user)
6.p(item|tag)
7.p(tag|item)
8.p(user|tag)
利用这些数据以及常用的理论,进行推荐:
1.基于tag给用户推荐item
计算user对item的喜好程度,最直接的做法 用户使用tag越多,tag用户item的越多,那么用户可能越喜欢。
很容易想到万能的tf-idf,如果这个tag被其他用户用过的越少,说明这个tag也能代表user的兴趣,同样如果item被使用的其他的tag越少,tag越能刻画item,转化为:
也可以利用 概率模型直接算,p(u,i) = 。
在实际使用时,无法两类,基于用户还是基于item,比如item-based,用户最近访问的item,选取item最可能的属于的tag,p(tag|item)分值较大的,然后将这个tag热门的内容推荐出来,p(item|tag)比较大的item,准确率可能比较低,但是复杂度低。
2.tag推荐
两个思路,推荐用户常用的tag以及item上常用的tag,也就是 大的tag列表。
<推荐系统实践>做过对比试验,两个都提供,用户使用的概率最大,所以类似douban等都会将内容提供出来
一些思考:
tag是连接user 和item的手段,更清楚的表达的用户的意图,比较像topic model,在user-item中间引入一层具备 语义信息的概念。