一、背景
我們經(jīng)常在逛購(gòu)物網(wǎng)站或者刷抖音、聽網(wǎng)易云音樂的時(shí)候,會(huì)有猜你喜歡或者為你推薦這樣一個(gè)功能,而這依賴的就是用戶畫像的偏好類標(biāo)簽:比如說(shuō)明星偏好(喜歡某個(gè)明星或者歌手的作品)、類型偏好(比如說(shuō):喜歡美妝類、喜歡美食類)
二、偏好標(biāo)簽加工的核心邏輯
(資料圖片)
偏好類標(biāo)簽一般都是以用戶的行為日志進(jìn)行加工。
比如說(shuō):視頻類軟件(觀影日志、評(píng)論日志、點(diǎn)贊日志、收藏日志)——內(nèi)容偏好、類型偏好、明星偏好,電商類(訂單日志、瀏覽日志、收藏日志、加購(gòu)物日志)——商品偏好、價(jià)格偏好、品牌偏好
下面我們以視頻類軟件為例來(lái)詳細(xì)講解下偏好類標(biāo)簽的加工邏輯
1.偏好類事實(shí)型:主要是根據(jù)用戶觀影數(shù)據(jù)來(lái)計(jì)算用戶在某個(gè)內(nèi)容或者類型下的觀影總時(shí)長(zhǎng)和最后一次觀影時(shí)間
上面是一張播放行為表,涵蓋了基本的播放行為數(shù)據(jù),和一張為tag維表(一個(gè)電視劇或者電影會(huì)打上非常多的標(biāo)簽,表中只是羅列了3個(gè))
根據(jù)上述兩張表可以生成如下用戶觀影tag表,能看到一個(gè)電視劇或者電影能很明顯的
根據(jù)上述表進(jìn)行計(jì)算得到每個(gè)用戶在每個(gè)標(biāo)簽下的觀影總時(shí)長(zhǎng),該標(biāo)簽下最后一次觀影時(shí)間
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
這樣每個(gè)用戶的內(nèi)容偏好標(biāo)簽即可計(jì)算完成
注:當(dāng)我們想看用戶最近半年的觀影偏好時(shí),就用用戶最近半年的觀影數(shù)據(jù)來(lái)進(jìn)行計(jì)算即可,這樣就能動(dòng)態(tài)產(chǎn)出用戶觀影偏好
細(xì)心的讀者發(fā)現(xiàn)打在某個(gè)tag上有觀影總時(shí)長(zhǎng)和最后一次觀影時(shí)間,觀影總時(shí)長(zhǎng)能看出這個(gè)用戶對(duì)于這種tag的內(nèi)容非常感興趣,而最后一次觀影時(shí)間說(shuō)明最近用戶在觀看這部分內(nèi)容。
相當(dāng)于總時(shí)長(zhǎng)代表的是一個(gè)長(zhǎng)期興趣,而最后一次觀影代表的是用戶的一個(gè)短期興趣。比如說(shuō):用戶男性經(jīng)常觀看古裝或者美女,但是最近有一個(gè)畢竟火的熱點(diǎn)視頻,該用戶也在觀看,但這種只能代表用戶最近一段時(shí)間的興趣偏好,當(dāng)過(guò)了這段時(shí)間就應(yīng)該選用長(zhǎng)期興趣標(biāo)簽了。
2.偏好類權(quán)重型:主要是根據(jù)用戶觀影數(shù)據(jù)來(lái)計(jì)算用戶在某個(gè)內(nèi)容或者類型下的觀影權(quán)重,比如說(shuō)權(quán)重越高說(shuō)明用戶對(duì)于某個(gè)內(nèi)容更感興
用戶觀影權(quán)重表
INSERT OVERWRITE TABLE dws_user_play_weight_info PARTITION(dt="${current_date}")select userid, id, sum(feature_value) as feature_valuefrom (selectuserid, --用戶idid, --電視劇或者電影idexp(-1 * cast(datediff("${current_date}", dt) / 7 as int) * 7 / (28 * 3 / 2.0))* 1.0 / ( 1.0 + exp(-0.01 * ( playtime - 400 ))) as weightfrom dwd_user_play_infowhere dt between "${current_date-28}" and "${current_date}" ---28天一個(gè)周期union all-- 4周之前select userid, id,exp(-1 * 28 / (28 * 3 / 2.0))* weight as weight --衰減from dws_user_play_weight_infowhere dt="${current_date-29}")T2group by userid, idhaving sum(weight) > 0.001distribute by userid;
注:權(quán)重公式系數(shù)非常有講究,主要看是關(guān)注最后一次觀影時(shí)間還是更加關(guān)注播放時(shí)長(zhǎng),如果更關(guān)注時(shí)長(zhǎng)則時(shí)長(zhǎng)權(quán)重更大,如果更加關(guān)注最后一次觀音時(shí)間則此處系數(shù)應(yīng)該更大。
歸一化:直接按照視頻id打上標(biāo)簽然后相加權(quán)重值明顯會(huì)超過(guò)1,因此需要?dú)w一化處理
select userid, tag, weightfrom (select userid, id, weight, row_number() over(partition by userid order by weight desc) as rnfrom (selectuserid,id,2 / ( 1 + exp(-0.5 * (sum(s1) + sum(s2)) )) - 1 as weightfrom (-- 2. 近期觀影selectA.account_id,B.tag,0 as s1,A.weight * B.weight as s2,1 as s3from (select id, tag, weight ---weight都為1,后續(xù)可給標(biāo)簽加上權(quán)重代表該標(biāo)簽重要性較強(qiáng)from dim_content_tag_info ---內(nèi)容標(biāo)簽打平之后的表)Binner join (select * from dws_user_play_weight_info ---用戶觀影權(quán)重表where dt="${current_date}") Aon B.id =A.id)T1group by userid, tag)T2)T3where rn <= 50 and weight > 0.01;
三、總結(jié)
至此即完成了偏好類標(biāo)簽的處理和加工,應(yīng)用的話,可以在廣告、推薦等多個(gè)場(chǎng)景進(jìn)行應(yīng)用。比如說(shuō):某個(gè)用戶經(jīng)常看搞笑視頻可以給它推薦搞笑的玩具或者視頻等等
關(guān)鍵詞: