1. 概要
典型的推荐系统大多针对“用户--商品”这种模式下来展开研究的,然后现实中却有另外一种模式“用户--用户”或者“商品--商品”的现象,前者例如交友婚恋网,后者则有求职网之类的。对于交友婚恋网,除了男方对女方有好感外,女方也要对男方有心的情况下才能配成佳偶;求职网的模式和婚恋网又不同,对于求职者来说关注的是工作,而不是HR。无论是婚恋网还是求职网之类的,都区别于传统的推荐系统,即组成的双方都可能是比较活跃的主体,也可能都是不怎么活跃的受体。
2. 特点
双向选择的推荐系统,与传统的推荐系统相比,存在以下的特殊性质:
传统推荐系统 | 双向选择推荐系统 |
用户单向决定是否购买物品。 |
推荐结果成功,由双方共同决定。 |
用户通常不太情愿去提供一些“显式”的个人信息。 |
用户希望提供一些个人详细的信息。 |
用户是长期存在的,所以拥有一系列“隐式”的喜好。 | 用户可能会短时间离开该系统,或者一旦“对话”成功之后再也不会返回该系统,“冷启动”更加明显。 |
相同的推荐结果可以推荐给很多用户。 | 用户的能力是有限的,不可能推荐过多用户,同时也不应该被推荐给很多人。 |
用户是比较积极的,一般都是主动去发现物品。 | 用户有时候是积极的,有时候是懒惰的,前者会主动去选择一些推荐结果,后者则等待别的用户来“自动找上门”。 |
有些物品可能永远不会被推荐。 | 用户是被推荐的一部分,尤其对于那些“懒惰”的用户来说。 |
表中的第2条,拿婚恋网来说吧,用户往往能够提供关于他本身的年龄、性别、身高等等,同时提供对异性(或者同性)的需求特征。婚恋网也可以询问用户一些问题,来判定用户的兴趣是长期的还是短期的,或者让用户提供简短的个人描述和个人的照片。(对于个人描述的处理,可能会用到自然语言处理的一些东西,在这里不作探讨)。
表中第3条,用户一旦“对话”成功之后再也不会返回系统,也不是绝对的,可能用户需要寻找很多工作,或者想找更多的约会的对象。退一步讲,用户离开系统可能是因为用户并没有得到合适的推荐对象,因此对于推荐成功和推荐失败而离开的情况是区分不了的。
双向选择的推荐系统中同样可以收集一些“隐式”的信息,例如对于用户提供自己的个人信息之后,系统会推荐一些用户。用户可能会对某个或者某些感兴趣,并点击进去继续查看更加详细的信息,或者返回推荐列表;前者反映出用户感兴趣的对象,能够抽取出用户的兴趣,后者则反映出用户可能看到了一些不太感兴趣的信息,然后退回到了推荐列表。
表中第4条,由于是双向推荐,对于一些比较受欢迎的人,可能会推荐给很多人,就拿婚恋网来说,男性可能对于美女的看法不一,可是对于一个大美女来说,很多男性都还是会感兴趣的。如果把那么一个大美女推荐给很多用户,那么这个大美女可能会收到很多人的短信或者骚扰电话,这样降低了用户的体验,而且这位大美女也不会轻易回复或者答应别人的要求,同样降低了广大男性的用户体验。双向推荐必须是TOP-N的推荐,同时对“流行性”的要求更加苛刻。
表中第5条,在传统的推荐系统中,用户相对于物品是绝对的“活跃”,而在双向推荐中,哪些活跃,哪些“懒惰”并不是绝对的,用户可能在刚开始的比较活跃,也可能在收到对方问候的时候才表现活跃。一般来说,在中国,男性相对于女性比较积极活跃,在日本是相反的,由此可见这和国家的社会风气也有关系的。
3. 推荐算法
参考论文是以婚恋网来完成实验的,所以下面直接拿婚恋网作为潜在的描述对象。
- 用户个人详细信息
用户在获得推荐结果之前,必须要提供一些详细的个人信息,提供的信息越丰富推荐的结果越好。用户可能需要提供的个人信息,包括性别、年龄、位置信息、身材、教育程度、交际能力、婚姻状况等等,对于连续的属性,算法处理的时候要做离散化,例如年龄这个属性,可能会被切分为18~20岁,20~22岁等。下图为提供的一个例子:
- 用户喜好
拥有了用户的个人信息,怎么去确定用户的喜好?这里先不考虑冷启动的问题。
我们假设用户之间是可以通过短信或者邮箱进行交流,也就是说当用户对另外一个对象感兴趣的时候,他可以编辑短信或者发邮件的方式进行联系(之所以选择这两种方式,是因为对文字进行处理比打电话之类的语音要容易的多),对方收到信息之后,可以回复“非常喜欢这个短信,你可以给我发邮件吗?”,或者回复“对不起,我不认为我们是合适的”来拒绝。
通过上述的交流,可以统计出用户的喜好信息。对于一个特定的用户,发送的对象必定是他感兴趣的,所以统计发送信息的对象们能够得到该用户的喜好,另外在接收的信息中,如果该用户回复的不是拒绝的,那么也能反映出他的喜好,因此可以从发送对象和接收对象并肯定回答的人群做统计。下图是一个例子:
上图的这个用户对于身材的要求,只要不是太胖都还能接受,但是要求有比较高的交际能力,目前是单身,并且是大学学士或者研究生的要求比较严苛。
那么,在真正处理的时候,怎么去符号化上图中的这种分布?
定义Ux为用户的信息集合,Ux={va:a 属于A},va为某一个属性上的数值,例如年龄29岁,A为属性集合。Mx={m:m为发送或者接收并肯定的短信或者其他信息}。
定义用户x在某一个属性上的倾向喜好为Px,a={(v,n): 对属性a上的每一个可能离散值进行统计,n为发送信息或者接收的肯定信息中,属性a出现的个数}。那么Px={Px,a,a 属于A}。下图为统计的一个例子:
- 匹配算法
判定一个用户是否符合另一个用户的喜好,只要将该用户的信息核另外一个用户的喜好进行匹配即可。比较官方的算法如下图所示:
看起来都比较头大,我们还是拿个例子来说,使用上一小节中四个人的喜好信息,计算Bob符合Alice的喜好的程度,计算方式如下:
Compat.(PAlice,Bob)=1/No.Attr*∑(Bob's attr in Alice's Pref.)/(No. Alice's Mess)
=1/3*(9/(9+1)+6/(3+6+1)+5/(5+4+1))
=0.67
那么对于四个人来说,最终计算的匹配度如下表所示:
从表中可以看出,本身对于本身是不存在匹配度的,也就是说对于超级自恋或者出家的人是不考虑的,再说这部分人干嘛登陆婚恋网啊。用户之间的匹配度并不是对称的,例如Bob符合Amy的喜好的匹配度为0.72,而Amy对于Bob的喜好匹配则是0.45。如果一条都不满足的情况的下,计算的得分为0。
- 推荐列表
通过上一小节的计算方法,可以得到对于某一个用户喜好下的不同的匹配度得分,那么是否直接仿照传统的推荐系统,可以按照这种分数进行排序呢?很显然是可以的,那样可以得到符合用户口味的对象,但是这种方法,很容易出现“我本将心向明月,奈何明月照沟渠”的情况,不仅要考虑推荐用户的喜好,同时还要考虑对方对推荐用户的喜欢程度。
Bob符合Amy的喜好的匹配度为0.72,而Amy对于Bob的喜好匹配则是0.45,那么将两者的匹配度得分进行调和,得到调和平均数,那么推荐列表的生成则是这种调和平均数的大小排序的结果。具体的实现算法如下:
那么针对上面例子的调和结果如下:
从结果中可以看到存在N/A的结果,是因为有些匹配度为0,在进行调和的时候,分母为0,所以在进行改进的方法之一,那就是将0,换成0.00001,或者一个更小的非0数。
推荐列表的生成可以按照调和结果的大小进行排序,选取Top-N进行推荐。另外还可以结合其他的方面进行综合,例如用户登录网站的次数,考虑支付额外费用的用户给予高分,对被大家“忽视”的人进行特殊处理等等,也就是说最后的推荐结果可以通过上面的几个方面几个调和分数进行综合推荐。
- 冷启动用户
对于使用系统的“新用户”来说,还没有建立个人的喜好信息,那么是不能够利用上面的算法进行计算的。不过我们可以计算有哪些人对这个新用户可能感兴趣,那么把这部分推荐给新用户就可以了。
4.总结
- 算法的计算方式,类似于基于内容的推荐方法,通过将用户的属性进行分类,然后计算用户之间的匹配度,是一个新的方法。
- 用户关注的对方的属性信息的重要度可能不同,也就是说算法把所有的数据等同看待,这方面有待改进,准确来说,针对不同的用户动态调整不同的属性的权重,例如有的用户比较关注身材,那么身材属性的权重就大一些。
- 算法的实施依赖于双方喜好的建立,因此需要短信或者邮件的方式让双方能够交流,这在一方面会侵犯个人的隐私,当然解决方法是要求用户同意别人观看自己提供的详细信息。
- 算法适用于婚恋网,求职网等需要人与人打交道的双向选择的推荐系统。
- 算法实际上“分类”效果的体现,首先对用户的属性进行分类定义,然后比较在不同类别属性上相似的用户,对于连续属性的离散化效果的好坏没有合适的解释,也就是离散化的过程是自己根据经验进行离散化的,例如年龄属性。
- 用户的个人描述信息,照片等信息在算法中没有体验到。
- 双向选择成功之后,需要对双方进行标记,避免收到同类型的信息骚扰。另外一方面,如果一方持续对不同意的对象进行骚扰,也是不好的,因此系统还要考虑防止骚扰。
参考论文:Recon:A Reciprocal Recommender for Online Dating