
上图是基于快看数据中台画像平台产品的理解和定位整理出来的产品架构。画像平台首先是服务于业务的,运营可以基于画像平台对单个用户或者人群包做画像的洞察,平台服务的业务应用层包含:(1)个性化推荐:它对画像的使用是非常重的,能够基于每个用户的画像去做千人千面的内容分发。(2)精细化运营:产品运营对用户做精细化营销的时候,会使用画像平台的人群圈选,依赖平台的人群洞察分析能力。(3)精准营销:商业化侧如精准营销,会依赖画像平台,针对内容或者产品特点,精准触达一定偏好的用户,提高营销效率。(4)获客推广:渠道获客推广对画像平台的应用也非常多,依赖也很重。画像平台产品服务层的功能一般包含如下这些:(1)人群圈选:指根据用户画像的标签或者特定的维度筛选出需要使用的人群包,然后对人群包中的用户做一些特定的操作。(2)人群计算:对多个人群包进行交、差、并等操作。(3)人群洞察:对特定的人群包基于用户的标签或者维度去分析其分布以及特点规律。(4)人群包管理:画像平台上能够清晰有效的管理创建出的人群包,进行体系化的管理和展示。(5)标签管理:画像平台最重要的信息就是用户的画像标签,需要对这些标签进行一个体系化的管理。(6)Look-alike:快看数据中台在建设画像平台的时候,这方面的诉求不多,公司的广告业务自己实现了 Look-alike 功能,因此这里不做详细说明。(7)功能 API 和画像查询 API:画像产品和业务的对接中,会收到业务侧对画像平台功能 API 和查询 API 等 API 接口的需求。有了 API,运营系统或营销系统能够便捷的接入画像平台的特定功能,使用画像平台的人群画像。建设画像平台,需要实现对数据生产、数仓建模以及标签数据体系的管理。我们基于数据仓库模型,对画像数据进行体系化的管理,主要有三部分:(1)数据域建模:首先基于数据仓库对多条业务线的数据进行分数据域的建模管理。主要是对公司数据进行数仓的分层,并在数仓的 DWD/DWS 偏底层的部分,对我们的业务数据域进行分域的管理,以保证不同业务线的数据能有清晰的管理存储以及位置查询。(2)标签计算和挖掘:有了基础数据之后,需要进行标签计算和挖掘,生产标签。(3)画像主题建模:生产的标签会存储在数仓的主题层。快看建设了专门的画像主题,画像主题对画像平台所有的标签体系以及用户标签相关的数据,进行了建模和管理。再下面就是数据采集层,包括埋点平台、业务日志、业务 DB 数据以及三方数据。把数据采集上来,进行数据侧的 ETL 清洗提取,转化成数据仓库模型里面的基础数据。一般来说,这是画像平台从业务侧到数据采集侧全链路的产品架构。
讨论完产品架构之后,继续探讨另外一个话题,公司内部什么样的组织适合搭建画像平台,以及它的定位是什么?根据我的理解总结了两方面画像平台的定位:(1)业务内自建平台。在很多公司,一些比较大的业务线,是有能力去建设自己的画像平台的,特点是画像平台建设是服务于本业务线的,在本业务线内去使用。一般要求业务线能够具备相对比较完善的数据平台能力,数据仓库建模能力以及一定的数据挖掘能力,这些是进行画像平台数据生产的基础。另外,业务内自建画像平台因为只服务于单条业务线,往往会和自己业务运营的营销系统或者 BI 报表或者数据监控平台等有相对比较重的耦合性。耦合性是指业务自建画像平台会在平台内部把运营能力(比如说配置能力或者分发能力),营销能力(比如 PUSH 或者说短信触达)以及精细化运营和精准营销的数据回收计算、指标展示、监控等功能都糅合到画像平台中。(2)中台型画像平台。快看有自己的数据中台,各个业务也没有足够人手建设业务内自建画像平台,所以快看的画像平台是由数据中台部门建设的。它服务于多条业务线,每条业务线都可以基于自己的业务场景和诉求去使用。一个特点是平台数据源是来自于多条业务线,所以数据源的标准性和一致性不好把控;另外因为业务和业务之间的差异很大,数据差异也非常大,不同领域数据模型的差异也非常大,所以数仓建模的复杂度是非常高的;再一个特点是中台画像平台,要求平台能力尽量和业务的运营系统,营销系统或者其他的报表平台能够做功能的解耦,因为如果中台画像平台和某一个或者几个业务的业务系统能力耦合过重,扩展性就会不好,平台产品能力过于定制化是非常不利于将来的功能拓展和迭代设计优化的。这是不同的公司在不同的阶段可能会面临的一个选择,大家可以根据自己公司实际的痛点问题选择合适的自建方式。
首先来介绍一下快看画像平台建设的背景,快看成立于 2014 年,是漫画垂类下用户体量最大的平台,目前总用户量近 3 亿,主要业务有漫画阅读、二次元社区以及商业化等。在业务需求方面:(1)快看的业务发展非常快,业务线的数量和业务线的规模都在快速扩张,目前中台支持了十多条业务线,公司还在不断的孵化新的业务线,公司的业务规模也是不断变化的。(2)从 2018 年、2019 年之后,移动互联网市场的用户量增长就非常缓慢了,再加上短视频行业的兴起,用户时间被短视频行业抢占了很多,移动互联网市场已经变成了一个存量用户竞争的红海市场。各个 ToC 的产品为了能够吸引用户、提升用户时长,各个业务对存量用户的精细化运营和精准营销的需求越来越多了。前面的分析中可以看出各个业务对数据的依赖,对精细化运营操作的诉求,快看各个业务也会面临这些问题和诉求。数据中台作为公司里面去统一承接各个业务,各种数据场景,各种数据类需求的部门,在长期的对接中,逐渐感受到大家对画像标签的依赖越来越重,因此从各个业务对画像平台的通用诉求中提炼出最常见的对于画像平台一些依赖的能力以及对标签的依赖的需求。快看中台从 2016 年初就开始建设,大数据平台的能力是比较完善的。对于数据采集、数据 ETL、数仓建模这些方面都是有自己的模型以及方法论建设的,而且开发能力也相对比较完善。
上图是快看画像平台的功能以及产品的界面,因为时间有限,分享的重点不在于我们每一个功能产品设计的逻辑,或者一个功能的具体实现,而是想着重的跟大家去介绍一下我们在建设中台型画像产品的时候,遇到的 4 个比较难的问题,或者说我们认为一些关键的点。我们的产品能力前面已经介绍过了,也都是比较通用的能力,因为我们做的是中台型的画像产品,建设目标就是为了满足业务对画像平台、画像标签的通用需求。我们平台的功能可以概括为:标签管理、人群圈选、人群上传、人群计算、人群洞察和人群包管理。接下来分享我们在快看建设中台型画像产品过程中遇到的 4 个比较有意思的问题。
第一个问题是弱登录类型 App 建立设备 ID 标识。弱登录类型的特点是用户不需要强制登录也能够使用这个平台的一些核心产品能力产品功能,像内容型和工具型的 APP,大概都会符合这个特点。为了用户能够快速使用我们的核心功能,提高用户转化,产生用户的激活留存,很少强制用户授权登录,所以允许用户不需要登录也可以使用 APP。但是,各个业务又希望能够对新用户以及拉活召回的用户快速的产生深度连接,让用户能够快速的产生兴趣和粘性,这就需要做精细化运营或者精准营销,而这些动作,都是要针对于非登陆用户,基于设备的 ID 做一个动作。所以设备的唯一性识别在画像的建设中极其重要。如果设备的唯一性识别的准确性不高,将会产生比较大的问题。而提高设备 ID 的识别度,有以下的难点:① Android/IOS 的 IMEI、IDFA、OAID 的获取受限以及频繁变更。Android 和 IOS 从系统层面对用户隐私的保护机制是越来越强。以 Android 来说,从 Android 10 之后是不允许获取用户 IMEI 的,现在的新系统都是获取不到的。以 IOS 来说,14.5 版本之后,获取 IDFA 都需要弹窗用户授权。在中国,华为、小米、OPPO、VIVO 等组成的广告联盟一起协作出了一个 OAID 作为广告标识。上面这些 ID 或者不能获取了,或者就是获取的时候需要用户授权,造成一定的损失;再或者像 IDFA 和 OAID 面临频繁变更的情况,用户是可以主动重置的,包括重置系统,刷机,重装 APP 等都可能造成 ID 的变更。这是是我们保证设备 ID 唯一性最大的困难。② ID Mapping 的变更。各个业务希望基于各自对 ID 的依赖去做 ID Mapping。以广告业务为例,广告业务目前去做广告投放或者广告回传效果监测的时候,对 IMEI 和 IDFA 的使用现在还是很重的。他们希望不管你内部使用哪种 ID,但是你需要能够基于 IMEI 或者 IDFA 和本部门完成广告投放方面的协作或者信息的打通回传。如果我们对设备 ID 的获取的覆盖率以及它的变更无法精准识别,那当进行外部协作,比如与广告业务的外部协作就会产生很大的折损,对效率造成影响。作为中台部门,我们在构建画像平台的时候,首先需要解决这个问题,如果不解决,刚才提到的难点在业务侧会产生很大的影响,我们的解决方案主要是两个方向:① 第一,快看能够维护每个设备各个 ID 的映射和变更关系,我们把这些 ID 尽可能都收集上来并且去维护它的映射和变更关系,并且基于收集信息去自建快看的 KKDID。生成快看自己的 ID 之后,我们对设备的唯一性就有了自己的识别体系,对它的质量也有了自己的保证。② 第二,在建设的过程中,可以借助行业内的第三方反作弊平台,利用它的唯一 ID 的识别能力,提升自建设备 ID 体系的准确性。我们在 Android/IOS 两个平台分别采取了很多判断逻辑去构建自建的 KKDID 体系,在构建自己的 ID 体系的过程中,需要做非常复杂的唯一性识别和判断。需要平台根据自己产品的特点以及收集的用户数据,制定适合自己业务的定制化判断逻辑。下面列出一些快看自建 KKDID 后在公司内部的效果,这里只列出重点,我们其实有完整的评估报告:① 第一,为安卓提升了约 2.2% 的 IMEI 填充率。比如我们有 3 亿设备,里面有一部分安卓,乘以安卓的比例,然后再乘以 2.2%,这部分设备原来是没有 IMEI 或者 IMEI 的识别是有问题无法精准匹配的,但是通过唯一 ID 识别,可以把这部分 IMEI 的填充率提升上来。如果有很多重复设备被识别成不同的设备会导致安卓的 IMEI 填充率降低,但是我们通过设备的唯一识别,可以提升其填充率。② 第二,对比第三方反作弊平台,我们的唯一设备识别率提升了 1.5%。我们行业内的第三方反作弊平台,他们在设备唯一识别上也是存在很多 bad case 的,我们在构建的过程中发现了这些问题,即使是行业内 Top1/Top2 的反作弊平台。③ 第三,我们在搭建了 KKDID 之后,还做了 KDDID 和 IMEI、IDFA、OAID 之间的两两映射,提升了各个业务在不同场景下使用对接上的准确性。这是我们解决的第一个问题,也是我们构建画像平台的一个基础。首先要能够精准的识别唯一的设备,然后才能去对这个设备进行画像。这里重点提了设备 ID,但不同的业务对设备 ID 的重要性依赖度是不一样。像很多商业化,用户只有登录后才能进行商业化的操作,如果对它做精准营销,只依赖用户登录后的登录 ID 就可以了,反而不那么关注设备层面的画像,所以需要根据不同的业务去思考这个问题。当然,KKDID 是一个通用能力,供大家参考。
接下来介绍第二个经验,中台型的画像平台对接的业务方非常多,会面临如何管理非常混乱的数据源的问题。为了解决这个问题,我们用了分层建模以及数据域和主题去分层管理的思路,特点是数仓有两个明确的业务数据域层和画像主题层两个明确的分层。底层的业务数据域,DWD/DWS 层负责清洗和管理各个业务数据域内的明细层数据。以付费域来说,用户或者会员的付费,我们会在付费数据域把付费相关用户的行为全部在付费域里面进行建模,然后建不同的宽表进行存储和管理。对用户域、流量域甚至其他域都是用同样思路去建设的,不承担直接的画像计算或者挖掘任务。在这之上我们建设了专门的画像主题,在数仓里面对应的是 DM/APP 层,承担着整个画像平台的画像标签体系的管理,以及标签数据的存储管理,以及宽表的建模。画像主题的数据源头是各个底层的业务数据域,需要哪一个,可以从管理好的业务数据域里面对相应的数据进行提取和应用。这样做的优点是业务域的数据条理比较清晰,画像主题的数据能够统一管理,实现标签体系和标签底层数据的统一管理。这是数据的存储和生产应用规范,能够在数据生产流程中形成这样一个标准,能够提升标签生产的效率。在数仓建设,比如一些数据产品建设的时候,如果面临这类问题,解决方案可以通用。第二个经验实现了对我们画像平台标签生产效率的支撑。
作为中台型画像平台,我们会自己生产标签,同时各个业务线也有基于中台或者基于自建的数据平台定制化标签生产的诉求。各个业务线生产的标签能否在画像平台中使用呢?我们的第三个经验就是能够支持多业务标签在画像平台里面做增量融合。如上图的左面部分所示,数仓里面有各个业务自己的数据域里面的数据,都做了数层分层管理和宽表建模的建设,业务开发同学或者产品同学基于建设好的数据,在业务内可以做一些开发和标签的生产。比如增长业务、基础业务或者广告商业化业务,用自己业务数据域的数据,生产一些复杂的定制化的标签。在这个过程中,中台侧可以定义标签生产和融合的规范:比如标签生产的命名、准确性、覆盖率以及标签取值(码值)需要符合哪些规范;然后标签内容的存储位置、存储形式、存储格式也有一定的规范。业务线标签生产完成后,中台会有对应的标签融合的任务,把业务生产的定制化标签,自动融合到画像主题。融合之后,还会触发标签的自动化管理,在标签的体系中,把业务侧生产的标签也融合进去,做统一的管理。这样做的优点是作为中台,我们把画像平台的标签生产能力开放给业务,能够提升标签的生产效率,也能够给业务方的开发侧或业务侧进行赋能。
第四个是偏产品功能上的一个创新。在画像平台的迭代中发现,用户除了对一些简单标签的使用之外,在业务的精细化运营、精准营销的过程中,对非常复杂的标签的使用是很频繁的,希望我们能够对很复杂的筛选条件做支持,分更多的维度对筛选的用户做不同维度的计算。经过这部分功能的提炼之后,我们发现可以通过面向特定业务的某一个用户的行为去做一些符合标签类型的支持。上图左面是我们画像平台后台截的一个比较有代表性的例子,这里的标签是近 90 天用户消费和充值明细,它是对用户近 90 天的行为做了维度的聚合,并且支持把筛选条件也糅合到标签里面。我们在画像后台使用这个标签的时候,就可以使用该标签下面特定的条件做筛选,甚至做一些复杂的筛选条件。比如近 90 天的用户,他的订单日期相对于当前时间是大于 30 天的,然后订单类型是充值类型,货币类型是人民币,对这个人群的标签,我们希望对它的金额维度做一个求和计算,得出求和后的结果,这是一个具体的例子。它的优点是提升了标签计算的灵活性,能够固化高复用的复杂标签,降低开发成本。对数据产品来说,需要对业务高频的标签使用场景有比较好的分析和洞察,才能够提炼出他对复合标签的真正诉求,从而把复合标签提炼出来。所以复合标签的生产需要,对产品侧的业务理解和分析洞察能力要求比较高,但它确实可以大大降低开发成本,提高标签的复用性,在业务侧看来这个能力是很方便的,可以对筛选条件和维度做很灵活的筛选和统计分析。
第一个案例是助力用户充值付费业务线的精准营销。精准营销应用画像平台之后,流程形成了一个营销的闭环。(1)首先用户可以基于画像后台去做人群包的筛选,对于不同的营销活动,基于复合标签或者特定标签筛选出人群包。(2)在运营后台,对人群包以及投放的特定活动做相应的操作配置,运营后台通过画像平台的功能 API 把相应的人群包或需要依赖的数据拉取到后台,基于我们营销后台的能力,对特定的人群包做特定的分发和营销活动的操作展示。(3)对营销活动的数据进行采集,生成 BI 报表。(4)运营人员可以根据 BI 报表中的指标数据观察每一个营销活动效果,根据效果的反馈,对自己的营销活动方案或者对人群包去做出相应的调整或优化。这个闭环,在付费会员侧营销活动中的使用目前已经例行化了,也是使用画像平台的一个非常重的业务。上图右侧是在画像平台截取的一个筛选条件的截图。
第二个案例是快看作为内容型的平台产品使用画像平台进行内容精准宣发的例子。精准宣发业务是指什么呢?比如有一个新的漫画作品,平台想给其作者一定的扶持,让它的受众用户能够快速触达,从而能够对这个作品产生兴趣开始阅读,给作者和作品积累一定的人气。这个操作过去经常出现的情况会对所有的用户做千人一面的分发,所有的用户看到的是同一个宣发的作品,这样的做法,造成很多非受众用户也会看到,分发效率有很大的可提升空间。使用这个画像平台,就一定程度上可以解决这个问题。宣发运营侧对内容精准宣发的流程是什么?(1)基于画像平台去圈选出特定内容偏好人群包。用户阅读打分类下的用户标签里面会有他的偏好,根据要宣发的漫画作品的品类和特点去匹配相应偏好特征的人群包,运营后台基于画像平台的功能 API 去获取人群包。(2)在运营后台的配置中,配上相应的人群包和资源位,对该人群包的人群做定向的宣发。(3)采集宣发的数据,将相应的指标可视化。(4)根据 BI 报表的反馈和分析,驱动内容运营策做出相应的调整和优化。我们画像平台的功能是比较通用的,在广告业务场景中以及渠道业务场景中,因为业务逻辑和流程的链路是非常长的,对画像平台的依赖会有很多偏定制化的需求。对于这样的场景,建议在他们的广告业务和渠道业务的数据平台中去建立画像模块,这个画像模块可以和自己业务的数据产品做很重的耦合,因为它就是服务于该业务的。画像模块可以把中台画像产品的基础能力甚至基础数据进行打通应用,这样可以极大提升画像建设速度,同时不需要关注画像是怎么生产,画像标签是如何管理的,画像的功能 API 是怎么样的,只需使用可依赖的接口,把更多的精力去投入到自己业务侧数据产品的流程和逻辑中。
经验总结有如下几点:(1)中台型画像,要重点关注业务侧的通用诉求,做一些通用能力的提炼。(2)大数据平台、数仓建模和数据挖掘的基础能力是画像平台的基本保障。这些能力是必备的,毕竟一旦涉及到画像的话,数据量会比较大,用户体量也比较大,对计算能力、数据采集、ETL 和建模能力的要求是很高的。使用的越重,这一侧整个全链路的要求也会越高。(3)画像平台的核心能力是人群圈选、计算、洞察、复杂标签支持、标签融合体系等。未来展望有以下三点:(1)加强标签的系统性管理,自动创建的效率更高一些,目前有一些人工操作和干预。(2)更完善的服务化能力建设。服务化是刚才提到的画像平台的功能 API 和查询 API,服务的稳定性保障以及响应及时性都有一些优化空间。(3)实时画像与离线画像融合。目前实时画像的应用场景比离线画像要少很多,但未来实时画像的应用会越来越多,因为现在大家已经不太满足于 T+1 小时这样的数据产出效率了,更希望在分钟以内的延迟生产实时画像。后面我们会加强实时能力,并与离线画像进行一些融合。我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解