一、背景
我们经常在逛购物网站或者刷抖音、听网易云音乐的时候,会有猜你喜欢或者为你推荐这样一个功能,而这依赖的就是用户画像的偏好类标签:比如说明星偏好(喜欢某个明星或者歌手的作品)、类型偏好(比如说:喜欢美妆类、喜欢美食类)
二、偏好标签加工的核心逻辑
偏好类标签一般都是以用户的行为日志进行加工。
比如说:视频类软件(观影日志、评论日志、点赞日志、收藏日志)——内容偏好、类型偏好、明星偏好,电商类(订单日志、浏览日志、收藏日志、加购物日志)——商品偏好、价格偏好、品牌偏好
下面我们以视频类软件为例来详细讲解下偏好类标签的加工逻辑
1.偏好类事实型:主要是根据用户观影数据来计算用户在某个内容或者类型下的观影总时长和最后一次观影时间
上面是一张播放行为表,涵盖了基本的播放行为数据,和一张为tag维表(一个电视剧或者电影会打上非常多的标签,表中只是罗列了3个)
根据上述两张表可以生成如下用户观影tag表,能看到一个电视剧或者电影能很明显的
根据上述表进行计算得到每个用户在每个标签下的观影总时长,该标签下最后一次观影时间
select userid,content_tag,sum(play_time) as total_time,max(last_play_time) as last_play_time from dws_user_play_info_tag group by userid,content_tag
这样每个用户的内容偏好标签即可计算完成
注:当我们想看用户最近半年的观影偏好时,就用用户最近半年的观影数据来进行计算即可,这样就能动态产出用户观影偏好
细心的读者发现打在某个tag上有观影总时长和最后一次观影时间,观影总时长能看出这个用户对于这种tag的内容非常感兴趣,而最后一次观影时间说明最近用户在观看这部分内容。
相当于总时长代表的是一个长期兴趣,而最后一次观影代表的是用户的一个短期兴趣。比如说:用户男性经常观看古装或者美女,但是最近有一个毕竟火的热点视频,该用户也在观看,但这种只能代表用户最近一段时间的兴趣偏好,当过了这段时间就应该选用长期兴趣标签了。
2.偏好类权重型:主要是根据用户观影数据来计算用户在某个内容或者类型下的观影权重,比如说权重越高说明用户对于某个内容更感兴
用户观影权重表
INSERT OVERWRITE TABLE dws_user_play_weight_info PARTITION(dt='${current_date}') select userid, id, sum(feature_value) as feature_value from ( select userid, --用户id id, --电视剧或者电影id exp(-1 * cast(datediff('${current_date}', dt) / 7 as int) * 7 / (28 * 3 / 2.0)) * 1.0 / ( 1.0 + exp(-0.01 * ( playtime - 400 ))) as weight from dwd_user_play_info where dt between '${current_date-28}' and '${current_date}' ---28天一个周期 union all -- 4周之前 select userid, id, exp(-1 * 28 / (28 * 3 / 2.0))* weight as weight --衰减 from dws_user_play_weight_info where dt='${current_date-29}' )T2 group by userid, id having sum(weight) > 0.001 distribute by userid;
注:权重公式系数非常有讲究,主要看是关注最后一次观影时间还是更加关注播放时长,如果更关注时长则时长权重更大,如果更加关注最后一次观音时间则此处系数应该更大。
归一化:直接按照视频id打上标签然后相加权重值明显会超过1,因此需要归一化处理
select userid, tag, weight from ( select userid, id, weight, row_number() over(partition by userid order by weight desc) as rn from ( select userid, id, 2 / ( 1 + exp(-0.5 * (sum(s1) + sum(s2)) )) - 1 as weight from ( -- 2. 近期观影 select A.account_id, B.tag, 0 as s1, A.weight * B.weight as s2, 1 as s3 from ( select id, tag, weight ---weight都为1,后续可给标签加上权重代表该标签重要性较强 from dim_content_tag_info ---内容标签打平之后的表 )B inner join (select * from dws_user_play_weight_info ---用户观影权重表 where dt='${current_date}') A on B.id =A.id )T1 group by userid, tag )T2 )T3 where rn <= 50 and weight > 0.01;
三、总结
至此即完成了偏好类标签的处理和加工,应用的话,可以在广告、推荐等多个场景进行应用。比如说:某个用户经常看搞笑视频可以给它推荐搞笑的玩具或者视频等等