目录
注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习使用
0. 相关文章链接
1. 什么是标签相似度计算
根据标签之间的相关关系进行聚类也是画像开发中经常遇到的一 类问题。如何结合业务背景对标签进行有效聚类,不同的公司或业务背景有不同的处理方式。这篇博文通过一个案例来介绍如何通过对用户身上的标签构建“同现矩阵”的方式对标签进行聚类。
2. 案例场景
同现矩阵是指标签和标签之间的关联程度,这种关联程度由用户 身上的标签所决定。这里的同现是指标签同时出现,即一个用户被打 上A标签的同时被打上B标签。如果有很多用户同时被打上A、B标签, 那么A、B标签之间可能潜在某种相关性(如下图所示)。
A类标签 | 打上标签人数(A类) | B类标签 | 打上标签人数(B类) | 同时打上AB标签人数 | A所签相关性 |
标签A1 | 20 | 标签B1 | 40 | 5 | 5/sqrt(20><40) |
标签A2 | 20 | 标签B2 | 40 | 5 | ... |
标签A3 | 30 | 标签B3 | 30 | 6 | ... |
标签A4 | 30 | 标签B4 | 30 | 6 | ... |
标签A5 | 40 | 标签B5 | 50 | 3 | ... |
标签A6 | 40 | 标签B6 | 40 | 8 | ... |
从上图中可以看到,当前有四个用户和四个标签,每个用户身 上都被打上了一些标签。但标签B和标签C在多个用户身上同时出现, 因此可以初步认为标签B和标签C存在一定程度上的相关性。举个人们 熟知的“啤酒和尿布”的例子,一家超市发现很多用户在消费中同时 购买了啤酒和尿布,于是将尿布和啤酒摆在一起出售,发现这两种商 品的销量双双增加了。该场景中这两种商品/标签同时出现在很多用户 的身上,那么我们可以初步认为这两种商品/标签存在一定程度上的相 关性。
在本案例中,用户在某医疗产品上的行为轨迹给其带来诸多标签, 按标签的类型可以划分为医生、医院、科室、疾病、药品等不同种 类。现在需要对疾病标签聚类到其对应的科室下面。
根据同现矩阵的方法,对4.5节创建的用户行为特征库中数据进行 深度挖掘,根据用户行为之间的相关性,对疾病标签进行聚类。
用户行为特征库表结构设计如下:
CREATE TABLE 'dw.cookiefeatureeventappend'(
cookie_id string COMMENT 'cookie_id',
tag_id string COMMENT '标签 id',
tag_name string COMMENT '标签名称',
tag_type_id string COMMENT '标签类型 按业务线来划分标签',
act_num string COMMENT '行为次数',
act_name string COMMENT '事件名称 如点赞/打赏/加购/点击/收藏/浏览等行为'
)
COMMENT '用户行为特征库'
PARTITIONED BY (data_date string COMMENT '数据日期')
;
3. 数据开发
首先从用户行为特征库中抽取某一时间段内被打上“疾病”类型 标签的用户明细数据,明细数据中包含了用户id、疾病标签等关系信息:
然后继续抽取同一时间段内被打上“科室”类型标签的用户明细数据:
然后计算“疾病”类标签下每个疾病标签对应的用户人数:
然后计算“科室”类标签下每个科室标签对应的用户人数:
最后计算同时被打上疾病类和科室类标签的用户人数的同现矩阵(如下图):
脚本逻辑如下:
用余弦相似度函数计算两两标签之间的相关性。余弦相似度函数 通过空间中两个向量夹角的余弦值来衡量两个个体差异的大小,余弦值越接近1,表明两个向量的相似性越大。在本场景中举一个简单例 子:某疾病标签被打在了10000个用户身上,某科室标签被打在了 20000个用户身上,有5000个用户的身上同时有该疾病标签和科室标 签,则该疾病和科室之间的相似度为5000/sqrt(10000X20000)。脚本逻辑如下:
筛选出与每个疾病标签相关性最大的科室标签,即将该疾病标签 归类到相关性最大的科室下面。通过row_number()方法筛选出权重 最大的科室标签置顶,逻辑执行如下:
最后可以看到,在小批量的测试数据中将疾病标签归类到对应科 室下面的效果还是比较准确的(如下图):
注:再次声明,此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习使用
注:其他相关文章链接由此进 -> 用户画像文章汇总