关联推荐功能实现
关联推荐介绍
关联推荐 包括 基于行为的推荐(user-based,相对来说困难些) 和 基于内容的推荐(item-based,相对来说简单些)。
行为推荐可以基于日志数据,比如订单数据、访问日志等。比如你在当当网上查看一本书时,当当会推荐“买过此书的用户还买过什么书”。
内容推荐比较简单些,只需梳理内容之间的关联性即可得到基础数据,之后做推荐。比如你在当当网上查看一本书时,当当会推荐“你可能对以下所列书籍也感兴趣”。或者书籍组合推荐之类的。
具体案例即实现:
基础表:
具体案例及实现
案例描述:
基础表中有用户(user_group_map)访问应用的日志(user_hitrate_log)信息,基于这写基础表数据,实现为用户推荐关联应用的功能(即基于行为的推荐)。
基础表:
-------------------------三个月 访问过此应用的同组用户
CREATE TABLE CRMTEST.log_ref_user
(
resourceid varchar(32) NOT NULL,
url varchar(120) ,
group_id VARCHAR(32) NOT NULL,
USERID VARCHAR(32) NOT NULL,
group_userid VARCHAR(32) NOT NULL
)
DATA CAPTURE NONE
IN TBS_DEV1;
comment on CRMTEST.log_ref_user
(
resourceid is '资源id',
url is '资源url',
group_id is '用户组id',
USERID is '用户id',
group_userid is '同组用户id'
);
-----------------三个月 访问过此应用的同组用户 三个月内 还访问的应用排名
CREATE TABLE CRMTEST.log_ref_resource
(
group_id VARCHAR(32) NOT NULL,
resourceid varchar(32) ,
url varchar(120) ,
ref_resourceid VARCHAR(32) NOT NULL,
ref_resourcename VARCHAR(32) ,
ref_resourceurl VARCHAR(120) ,
ref_visitcount integer ,
ref_rank integer ,
ref_resourcetype integer
)
DATA CAPTURE NONE
IN TBS_DEV1;
comment on CRMTEST.log_ref_resource
(
group_id is '用户组id',
resourceid is '资源id',
url is '资源url',
ref_resourceid is '关联应用id',
ref_resourcename is '关联应用名称',
ref_resourceurl is '关联应用url',
ref_visitcount is '关联应用访问次数',
ref_rank is '关联应用排名',
ref_resourcetype is '关联应用的资源类型'
);
关联推荐算法/口径:
关联推荐算法/口径:
-------------------------三个月 访问过此应用的同组用户
insert into log_ref_user
(resourceid, url, group_id, userid, group_userid)
select s1.uniqueid, url, s1.group_id, s1.userid, s2.userid
from (select uniqueid, group_id, t1.userid
from user_hitrate_log t1
left join user_group_map t2 on t1.userid = t2.userid
where hittime >= '2011-01-01 00:00:00'
and hittime <= '2011-04-01 00:00:00'
group by uniqueid, group_id, t1.userid
order by uniqueid, group_id) s1
left join (select uniqueid, group_id, t1.userid
from user_hitrate_log t1
left join user_group_map t2 on t1.userid = t2.userid
where hittime >= '2011-01-01 00:00:00'
and hittime <= '2011-04-01 00:00:00'
group by uniqueid, group_id, t1.userid
order by uniqueid, group_id) s2 on s1.uniqueid =
s2.uniqueid
and s1.group_id =
s2.group_id
left join sys_menu_item s3 on s1.uniqueid = char(s3.menuitemid)
where s1.userid != s2.userid
order by s1.uniqueid, s1.group_id
-----------------三个月 访问过此应用的同组用户 三个月内 还访问的应用排名
insert into log_ref_resource
(group_id,
resourceid,
url,
ref_resourceid,
ref_resourcename,
ref_resourceurl,
ref_resourcetype,
ref_visitcount)
select group_id,
t1.resourceid,
t1.url,
uniqueid,
menuitemtitle,
t3.url,
resource_type,
count(*) num
from log_ref_user t1
left join user_hitrate_log t2 on t1.group_userid = t2.userid
left join sys_menu_item t3 on t2.uniqueid = char(t3.menuitemid)
where hittime >= '2011-01-01 00:00:00'
and hittime <= '2011-04-01 00:00:00'
and t1.resourceid != uniqueid
group by group_id,
t1.resourceid,
t1.url,
uniqueid,
menuitemtitle,
t3.url,
resource_type
order by group_id, t1.resourceid, num desc
三个月 访问过此应用的同组用户 这个口径 可能有点难理解(其实就是一个自关联的笛卡尔积),回头补充些示例数据吧。。。
这个案例只是关联推荐的一个简单实现,没有考虑 最低支持度/置信度、及性能(剪枝)之类的问题。