现状及总结
目前的推荐系统感觉已经到了一个瓶颈期。之前的推荐规则相对来说,还是比较粗放式的方式。如果想把推荐系统,再推上一个台阶,则需要更精细的数据挖掘(包括对音乐本身的数据挖掘和用户行为的数据挖掘)。
1、 目前我们对用户行为的数据使用得太少。之前的推荐主要依赖的用户数据是用户的收藏行为。在音乐的产品中,收藏行为看作一种重要的行为是没问题的。但是如果只考虑收藏的话,是不对的,会存在很多问题。
首先是用户的冷启动的问题,因为每个用户在刚来我们虾米网之后,用户的行为数据是零。现在的做法是前端用强制的方式放用户去收藏了几个艺人或者歌曲,这只能是治标不治本的做法,甚至有点流氓,因为用户有权不收藏任何东西。如果要解决冷启动问题,最好的方式就是对用户注册的基础信息挖掘,根据基础数据来进行冷启动(如性别,年龄,我个人认为这两就足够了,真没必要去花过多的时间进行其他维度的挖掘)。
其次是用户的收藏数据往往不能反应用户最近的听歌偏好,因为很多用户即使平时听到很好听的歌,他也不一定就会去收藏这首歌。所以我觉得很有必要把最近的试听数据当作用户的另外一个重要行为。因为最近的试听以及某些艺人或者歌曲的试听量,还是很能反应用户最近的音乐喜好的。
然后,用户的收藏行为其实很多时候,并不是反应用户有多么的喜欢这首歌。特别是那种用户收藏了几千首歌以上的,这时候用户他自己都不知道自己收藏了些什么歌曲,如果这个时候还用收藏数据来推荐歌曲或者艺人,就明显不合适的。所以我觉得对于那些收藏了成千上万的歌曲和艺人的用户,用收藏这个行为来判断他的音乐喜好,已经是错误的了。即使用收藏数据,也只能调到一个较低的权重来用它。
最后,作为普通用户中的一员,其实我也很少会去收藏一些艺人或者歌曲的,大部分的普通用户就是来听听歌,消遣一下,根本就没想过什么收藏。
2、 产品的形态问题。目前几个重要的产品就是歌单、电台,单曲,艺人和精选集专辑推荐。单曲、艺人和专辑作为基础数据,这个目前总体看来还不错。精选集的话,目前推出的地方还是太少,只有移动的摇一摇用到了精选集推荐。虾米猜电台的话,我个人的感觉是暴露了太多细节,比如那个根据你收藏了什么推荐了什么这个,我感觉这个东西是不应该展示出来了,不应该让用户知道推荐的歌的来源,他只需要管喜欢或者不喜欢。其实某种程度上来说,推荐的过程带有神秘性更好,不应该把太多的细节暴露给用户。
3、 对推荐的效果缺乏判断。之前的推荐的东西更多的是出去我们自己开发人员的一种想法,觉得这个可能更好,或者另外的更好。缺乏一些客观的统计数据来反映效果的好坏。所以新boss现在想最先加强这一块,我是非常赞同的。
对未来的一些看法
未来推荐这边还有很多的事情要做,包括更多的用户数据行为挖掘、更全面的推荐效果检测、更多的歌曲数据挖据(如风格、情感等等) 以及精选的降噪处理。
个人有一些想
1、 把虾米猜产品的推荐理由去掉,保持产品的简洁性和一定程度的神秘性
2、 如果第一点可行的话,那么对收藏行为的反应,没必要很实时。如果把理由去掉的话,即使反应不是实时的,那么用户也感知不出来的;反而是这个理由存在的话,会要求数据的实时性比较高。另外就是如果把试听的数据也用进来的话,这个理由显示的文案就要增多。而且既然对收藏作为一个重要的用户行为来推荐歌曲需要实时的,那么当试听也作为一个重要的用户行为来推荐歌曲时,是不是也需要实时的试听数据呢?这也是一个问题。
3、 我觉得对推荐的歌曲,倒是可以进行另外的形态的一些变化,比如歌单或者电台里面,正在播放一首推荐的歌曲时,有可能这首歌有很多版本,我们可以把一些比较好的版本拿出来。如果现在听的是翻唱的,则提示用户你想听听原唱吗?如果现在听的是原唱,可以提醒他你想听听其他人的翻唱么?
4、 对推荐的数据进行效果监测。这个目前已经作为最优先级的事情来做了。这个不仅仅是用来知道我们推荐出去的效果如何,还能把一些推荐出去效果比较差的数据反馈回来,用来影响单曲或者艺人的基础相关性。比如根据A这首歌推荐到了B这首歌,但是如果A推B这种方式出去了1000首歌,只有几首被听了或者根本没人听。那说明A和B的相关性,还是有问题的。
5、 基础数据的相关性,必须要让上层应用能够识别。比如A和B歌曲具有相关性,那么当上层应用在用这个相关性数据时,要能知道他们相关的依据或者桥梁是什么,是风格?是年代?是地域还是其他什么的?
对于推荐结构的一些看法
对于推荐系统,我是一直在想,通过数据同步的方式,能够把推荐系统所用的数据和网站用的数据分开来。推荐系统内部自己维护一份数据库,至于这个数据库是什么这个都是可以自己定义的,mysql、hbase、tair、redis或者是这些的组合都可以。为了防止数据同步时有错误,可以过一段时间(比如一周)进行一次全量的mysql到推荐内部数据库的同步,平时采用增量同步。
从mysql到TT4这一步,是由阿里内部现场的产品完成的。
数据同步模块式需要我们自己做的,这个模块主要是两个功能:1、消费TT上面的数据,并同步到推荐内部数据库;2、如果推荐系统有实时性需求的话,在这个模块里面可以发送http请求。