ID-Mapping在心动公司探索实践

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 文 / 蔡圣哲 王沛 戴健 范建文 王兵鹏
文 / 蔡圣哲 王沛 戴健 范建文 王兵鹏

1.背景介绍

心动公司创立于 2003 年,是一家全球游戏开发和发行商,拥有丰富的研发、发行和代理运营经验。截至 2022 年中,心动运营 38 款免费和付费游戏,在全世界拥有 5,000 万月活跃用户,主要分布在大中华地区、东南亚、北美和南美。2016 年,心动推出手机游戏社区和应用商店 TapTap,2022年中,TapTap 在全球拥有超过 5,000 万月活跃用户。


在研发侧,TapTap当前正在持续加强内容建设及版本迭代,提升用户规模与社区黏性。在此过程中,用户ID的精准映射是关键基础能力之一。在用户隐私数据保护的基础上,数据中台团队基于长时间的数据建模和业务经验为数据探索到算法迭代的整个研发周期提供数据能力和工程化能力的双输出。


在手机游戏领域,典型的情况是:同一个玩家在多个游戏发行平台上有多个游戏账号,在其他渠道也有该游戏的账号,这些账号分散在各个游戏或平台本身中,没有进行打通。基础数据建设不完善会带来各种问题。例如客户在做精准营销时不能精准刻画同一个用户,流量在跨渠道使用效率很低,需要idmapping技术助力基础数据建设,帮助客户做精准营销或个性化推荐等。


idmapping可以实现将分散在各处的账号进行映射,同时赋予这个自然人一个id(即oneID),作为这个自然人的唯一id。


2.相关方法

idmapping通常利用的资源是已有的两类信息表,


一类是用户属性信息,如userid、注册邮箱地址等;

另一类是用户行为信息,如用户登录游戏信息、用户在游戏中的交易信息、用户在游戏中的交流信息等等。这类信息中会记录用户userid和移动设备id等。


在一个典型的游戏社区平台中,一般提供两张数据表,一个是平台账号行为表game_platform_info,记录用户登录游戏平台的具体信息,如下表所示:

1.JPG

另一个是游戏账号行为表game_info,记录的是用户登录游戏账号的具体信息,如

2.JPG

我们需要将平台账号game_platform_info.user_id和game_info.user_id按“同一个人”的标准进行idmapping,同时一些设备id,如device_id,oaid,ip等也进行idmapping。


一般idmapping方案分两个步骤:


首先要确定核心账号ID,例如在淘系中通常是淘宝ID和支付宝ID,在这个游戏域是game_platform_info.user_id、game_info.user_id的聚合体,他会对应一个真实意义上的自然人uid;


然后将无线设备挂靠到核心账号上来,在这里就是device_id、android_id、googleid等挂靠到自然人uid上来。


一种idmapping方案是根据经验,将game_platform_info和game_info直接通过表join的方式,按指定列(如oaid、ip)关联起来,同时遍历所有没有指定列的设备id(device_id、android_id、googleid等),将能够匹配的设备id关联起来。

3.JPG

这种方式优势在于思路清晰,可解释性强,开发成本低。既然要把id进行关联,那把id完全相同的值关联就可以了。但这个方案也有很多缺点,第一,它是以完全匹配的方式,必须某个id完全相等才能认为是同一id,匹配较“硬”,泛化性不够第二,对异常数据处理能力较弱,无法进行多源判断。它是以表join的形式关联,即如果这两个表中各自存在一行中的某两个字段相同,那么这两个表的这一行的其他数据就关联到一起了,即使这两个字段可能是因为错误而匹配的,也只能继续错下去。第三,法利用正确的信息进行优化,如果我们已知一组正确的关系数据,比如知道一组game_platform_info.user_id、game_info.user_id的映射关系,我们无法在表join的框架下利用这些关系优化idmapping的结果。


另一种idmapping方案是基于机器学习模型来完成的。这种通常是在有一些标注数据的前提下,利用这些已有的映射关系,构建特征,判断给定的两个id是否属于同一个人。


游戏中存在一些标注数据:game_platform_info.user_id、game_info.user_id的映射关系。我们可以建立一个分类模型,特征可以选取和user_id关联的列(device_id,oaid,IP等)。当我们给定一个game_platform_info.user_id,利用这个分类模型对game_info.user_id进行打分,高于一定阈值则认为这两个user_id是属于同一id。


基于机器学习的方法的优势是健壮性强,不要求列能强关联,即使两个数据没有强关联信息,只需要构造的样本特征不全为空就能计算出一个合理的值。而且计算的过程中不用一次性做全表扫描,只需要一定量的训练样本就行,需要的计算资源少。同时,我们可以通过设置不同的阈值来调控准确率。


这类方法也有一些缺点:一是可解释性弱,从直观上来看很难判断没有关联关系的game_platform_info.user_id与game_info.user_id为什么是属于一个id,因为都把要判断的数据映射成相关的特征了,是一组由浮点数构成的特征向量,对比两个id的特征向量本身并不能看出异同。二是这类方法必须要有正确的结果作为标注数据,但往往在项目一开始可能并没有正确的结果集合。三是这类方法每次必须指定两列作为基础数据,将其他关联数据作为其特征数据构造特征向量。对于有较多id列的情况下,需要做两两组合进行模型训练预测,开发效率低,实用价值低。


3.我们的方案

无论是基于表join的方法、还是基于机器学习的方法都存在一些问题。我们提出了一种基于机器学习的图模型方案来处理idmapping问题。


我们先看基于图模型的方案如何处理idmapping的。


首先,我们将所有的id值都看成一个顶点,例如game_platform_info的某个device_id(0b887f9e1e915e355),然后将这些点构成一个图网络。同一行的id类数据每个列两两存在一个边。图中的最大连通子图里的元素可以看成一组idmapping的结果。


如下图所示,通过构造图网络,得到[game_plaform_info.user_id1,game_plaform_info.user_id2,game_plaform_info.device_id,game_plaform_info.android_id,game_plaform_info.oaid,game_plaform_info.IP,game_info.user_id1,game_info.user_id2,game_info.imei,game_info.idfa,game_info.google_id]这些ID会互相关联。


同时,我们考虑边在这些图中出现的次数和出现的时间戳来计算边的权重。边出现的次数越多,证明两个点关联的越紧密,权重越高;出现的时间越晚,说明是最近的行为,置信度越高,权重越大。

4.JPG

这个图模型相比传统join表,它不用考虑join的列信息,开发成本较低;同时,考虑了多账号之间存在的传递关系,可以发现一些只靠join发现不了的边关系;而且它考虑了权重,我们可以通过设置合理的权重阈值来得到不同准确率/召回率的结果。


但这个基于图模型的方案没有考虑到节点类型本身的因素。比如IP这个特征它的置信度本身是存在一定问题的。很多用户可能会共用一个IP地址,例如在网吧、在宿舍,大家可能会共用一个IP。而且有些IP是和手机的基站相关的,并不能真实反映用户ID信息。


所以我们需要考虑节点类型的权重。然后把节点类型的权重加入到边的权重中来,从而再设置阈值,将置信度较低的边过滤掉。

5.JPG

如上图所示,我们通过构建连通子图后,可以得到game_plaform_info.user_id1,game_plaform_info.user_id2,game_info.user_id1,game_info.user_id2这四个节点会关联到一个id上,但因为IP的权重较低,删除了被IP关联的边。也即是在连通子图中去掉game_info.user_id1这个点。


此时,我们引入机器学习分类模型来学习节点类型权重。


具体流程如下:

6.JPG

首先,我们先利用已有的用户行为表构建图模型,且得到连通子图;

第二,我们利用游戏中存在一些标注数据:game_platform_info.user_id、game_info.user_id的映射关系来设置边的权重信息。我们可以建立一个分类模型,特征可以选取和user_id关联的顶点类型(device_id,oaid,IP等)以及时间戳。特征值是user_id和其他顶点的边的出现次数、距离现在的时间长度归一化的结果。下图是样本示例:

7.PNG

这样我们可以计算出每个节点的权重。

第三,把这些节点权重代入到图模型中校正每个边的权重。

第四,通过调节边权重的阈值来剪枝,在准确率和召回率中达到平衡。


4.效果

我们利用这个方法,在一年的数据(十亿量级数据)上做了实验,构造了一个连通子图用于idmapping,准确率为97.8%。平均每个game_info.user_id有1.09个game_platform_info.user_id,表join的方法是1.01个。每个oneID下有21.8个基础id。表join的方法是5.1个。


同时,我们提供的解决方案还可以根据业务数据不同,人工运营不同顶点类型的权重,比如当我觉得IP这个因素不应该考虑进来,可以将IP类型的权重置0,这样和IP相关的边就不作为构图的边了。


我们还可以根据应用场景的不同,人工运营边的阈值,以满足场景对不同准确率、召回数量的需要。例如,在同人模型中,我们可以提高边的阈值以保障高准确率要求。在用户画像扩展中,我们可以降低边的阈值以提高召回数量。


5.ID-mapping服务

阿里云在PolarDB上推出了ID-mapping的能力,可以通过PolarDB for AI使用ID-mapping的解决方案。用户只需要按要求提供原始的数据表,执行几条SQL命令后即可得到ID-mapping的结果。PolarDB for AI是基于PolarDB的一站式数据库原生机器学习组件,通过扩展SQL支持多种数据智能能力;提供机器学习模型创建,训练,预测及部署等全生命周期的操作及管理服务,提供用户增长,智能搜索,智能推荐,问答机器人等开箱即用的解决方案。


6.未来展望

idmapping是本质是将稀疏的信息通过实体之间的关系汇集起来,是id类数据加工的最重要的基础工作之一。idmapping在企业中常常是用户画像构建的最底层、也是最重要的环节。


我们提供了一些idmapping构建在游戏域的一些思路,idmapping工作可以在基础数据入库后进行,加工后形成新的基础数据。


实际上,游戏域也有很多业务逻辑需要处理,比如底层设备账号如何在数据采集阶段的统一,设备其他属性信息(设备型号、屏幕分辨率、系统版本等)如何加入idmapping体系中进行校验逻辑。由于篇幅有限,就不深入展开了。欢迎大家在评论中留言讨论。


7.附:idmapping其他应用场景

7.1 用户行为增强

idmapping技术可以对数据加工后,可以为上层业务(个性化搜索、精准推荐)提供更优质的数据支撑,提高上层业务的效果。例如利用idmapping技术可以把同属于一个自然人的不同应用id上的用户行为合并,增强数据。比如在电商业务中,可以将本地购物行为数据和电商网站上的行为数据合并,补全用户购物链路,分析用户喜好。

7.2 黑灰产团伙发现

在电商营销域中,常常会遇到“羊毛党”“刷单党”等,他们会拥有多个设备、多个用户id,参与赚取电商佣金、抢优惠券、刷好评等电商活动,极大破坏电商的健康生态,给商户和平台带来极大困扰。通过idmapping技术,可以将不同id关联起来,通过一些运营经验,可以发现账号异常情况,例如会得到同一设备下有超多活跃userid、或者同一userid在一段时间内拥有超多的设备id等。再通过关联好的账号之间一些互动行为来发现更大的团伙。

7.3 用户画像扩展

通过对用户的基础数据或者行为分析,可以得到一些用户画像,比如某人属于男性、某人对某品牌、商品类目有偏好等等。由于用户行为存在的马太效应,有些用户可能在某些域的行为缺失,加上用户基础数据本身的不完善,导致用户画像并不能完全覆盖所有用户。通过idmapping的技术,挖掘id之间的关系,从另一个角度来补充用户画像的信息,完成对用户画像的扩展。例如某id对某商品类目有偏好,他可能属于一个家庭中的一员,和它相关的id可能是另一个家庭成员,他也会对该类目也有偏好。

7.4 营销圈人

在广告域会根据用户的兴趣、设备类型等定点投放广告。例如在某游戏平台上存在有多款游戏,同一个人会拥有不同游戏的账号,也可能在多个设备上都有登录。通过idmapping技术,将同一个人的不同游戏账号、不同设备信息进行互通,这样针对性地对一个人的广告曝光可以跨设备、跨游戏,让用户在玩不同游戏、或者在不同设备登录后都能看到该广告,比仅仅利用用户偏好在单一游戏上投放的效果要更好。


蔡圣哲 心动公司大数据架构

“心动网络数据量大而且丰富,但如何更有效地从数据中挖掘价值,更好地服务用户,一直是我们数据中台努力的方向。基于PolarDB上ID-mapping的能力,实现taptap的idmapping构建,帮助我们大幅度提升了数据处理的准确率,达到近98%的准确率,简化了开发的成本。”


 / End /  

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
存储 算法 C++
【C++从0到王者】第三十一站:map与set(上)
【C++从0到王者】第三十一站:map与set
33 0
|
7月前
|
数据安全/隐私保护
全球免费编程教育网站:Code.org
你还在为小朋友的编程教育而发愁吗? 你还在为小朋友放假无聊而头疼吗? 他来了他来了,全球免费编程教育网站来了。 2013年成立的Code.org是一个非营利组织。 它致力于为年轻女子、学生从来自少数民族提供机会。 其愿景是:每所学校的每位学生都有机会学习计算机科学,就像学习生物、化学和代数。 提供了最广泛讲授的中小学计算机科学课程,也会每年组织编程一小时活动。 这已吸引了全世界约 10% 的学生来参与。 Code.org 得到了亚马逊、脸书、谷歌、印孚瑟斯基金会、微软等更多慷慨捐助者的支持。
668 0
|
存储 Java 测试技术
【通用行业开发部】阿里开源TransmittableThreadLocal使用经验记录
本文章主要记录我在一次业务优化中,使用线程池带来的子父线程值传递问题,及使用TransmittableThreadLocal来解决该问题的经验,并对TransmittableThreadLocal原理做些梳理。
|
5月前
|
存储 编译器 C++
【C++从0到王者】第三十一站:map与set(下)
【C++从0到王者】第三十一站:map与set
32 0
|
8月前
|
SQL 数据采集 NoSQL
One ID中的核心技术ID-Mapping究竟是怎么实现的?by彭文华
One ID中的核心技术ID-Mapping究竟是怎么实现的?by彭文华
|
6月前
|
Android开发
AppsFlyer 研究(十一)配置 Google Ads MCC 获取 LINK ID
AppsFlyer 研究(十一)配置 Google Ads MCC 获取 LINK ID
|
7月前
|
存储 运维 安全
|
8月前
|
SQL 开发框架 Java
2021-08-04大连东软实训第十一天---ssm框架,改造之前的项目,sql语句的学习,sql注入
2021-08-04大连东软实训第十一天---ssm框架,改造之前的项目,sql语句的学习,sql注入
55 0
|
10月前
|
存储 算法 数据库
细数各大唯一id生成算法
一、序言几乎所有的业务系统,都有生成一个唯一id的需求,例如: 1.订单号2.活动id3.消息id这个记录标识往往就是数据库中的唯一主键,也可以作为唯一索引。这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: (1)拉取最新的一页的聊天记录:select * by message_id/ order by gmt_create/ limit 100 (2)拉取最近的一百条流水:selec
284 0
细数各大唯一id生成算法
|
存储 运维 分布式计算
Doris 毕业成为 Apache 顶级项目,独家专访百度 PALO 团队
Doris 毕业成为 Apache 顶级项目,独家专访百度 PALO 团队
622 0
Doris 毕业成为 Apache 顶级项目,独家专访百度 PALO 团队