地图POI类别标签体系建设实践
导读
POI是“Point of interest”的缩写,中文可以翻译为“兴趣点”。在地图上,一个POI可以是一栋房子、一个商铺、一个公交站、一个湖泊、一条道路等。在地图搜索场景,POI是检索对象,等同于网页搜索中的网页。在地图客户端上,用户选中一个POI,会有一个悬浮的气球指向这个POI。
如上图左边,这家商场内的屈臣氏是一个POI;而所谓类别标签,就是在类别维度对POI属性的一种概括,比如,屈臣氏的类别标签化妆品,而屈臣氏所坐落的凯德mall,类别标签是商场;右侧则是商场query搜索召回的一系列POI,都具有和query相匹配的类别属性。
上图也展示了类别标签的两种主要使用场景:为用户提供丰富信息和支持决策,一方面在前端为用户显示更丰富的信息,另一方面支持搜索的类别搜索需求,主要是在地图场景query和POI双方都具有丰富的多义表达,通过传统的文本匹配引擎或者简单的同义词泛化是难以达到目的的,因此挖掘标签作为召回和排序依据。
我们的类目体系建设主要依据以下几点:
用户实际的query表达,主要为了支持用户的搜索需求;
真实世界的客观类目分布,以及pm对该分布的认知;
不同标签间的从属、并列关系。
最终每个大类将构建一个多层的多叉树体系,比如购物类别的划分:
类别标签建设的难点
我们的目标是打标,就是将POI映射到上面类目树体系的各个节点上,很显然这是一个分类问题,但又不是一个单纯的分类问题:
多标签问题:屈臣氏打上化妆品的标签,是一个一对一的映射;而部分POI,可能同时具有多个标签,比如汤泉良子,可以洗浴、按摩、足疗;xx家具店,打上家具店标签同时,必须打上其父节点家居建材标签。整体上,这是一个多标签问题,而不是多分类问题;
文本相关问题:大多数的POI具有比较直观的文本标题,比如小牛电动车、海尔专卖店、东英茗茶、熙妍精衣、新生贵族,通过名称文本分析,可以预测出比较正确的结果。另一方面,又不是纯文本问题,比如苹果专卖,仅从文本无法确认是一个手机店,还是一个水果店;还有一些表达,比如老五批发,低频表达或者不含类别信息,则需要引入其他特征来进行解决;
综合性问题:算法可能解决主要问题,但现实世界的复杂,通过单纯的算法是难以完全覆盖的,比如酒吧中夜店和清吧的区分,三甲医院、汽车4S店的打标,低频品牌的识别等,通过受限的样本和特征无法尽数解决,但又无法置之不理。
此外,应用方对于标签的准召和产出速率也有较高的要求:打标准确率低,则可能导致用户搜索时召回错误POI;覆盖率低,则可能导致用户期待的结果被漏掉;而待建设的大分类有20+,同时每个大分类有数十个子标签,大小标签总量上千。则必须使用高速高效、准召均有保障的方法进行打标,才能有效落地收益。
综上,我们要解决的类别标签打标的主要问题,是一个多标签分类问题,主要使用文本进行识别,但有必要引入其他非文本特征或手段,才能比较完满的解决。
技术方案
整体方案设计
如图,为了高效完成打标,我们设计了主要的流程模块,具体描述如下:
特征工程:文本特征解决最主要的打标问题,但同时地图场景下POI文本偏短,长尾分布广泛,具有较多的低频文本或者完全不含类目信息的低频品牌等,而评论、简介等长文本描述往往偏于高频,而难点在于解决低频。因此特征设计上,尽可能使用一些通用特征,比如POI名称、typecode(生产方维护的另一套分类体系)、来源类别(数据提供方的原始零件类别)、品牌等通用特征;对于高频专有特征或数据,一般不在通用模型中进行识别;
样本工程:样本的挖掘和清洗、以及模型的设计也是旨在解决通用性的打标问题,POI表达的多样性,而同时标签数量极多,导致需要的样本量也极大,标注成本较高时,必须考虑人工标注之外的样本来源;
分类模型:单纯的文本分类模型,不能解决非文本的问题,同时多标签的问题,也不能单纯使用多分类模型来解决;我们设计了多种贴合业务的模型改造工作;
多路融合:分类模型能解决主要的问题,但不是全部问题。在地图场景下,总有些算法之外的待解问题,如5A景点、三甲医院,以及各类品牌,模型难以尽数处理。我们设计多路打标,如品牌库对品牌效果进行兜底,引入外部资源批量解决非算法问题,引入专项挖掘解决非通用的打标类别等等……总体上对模型之外的问题引入外部知识辅助进行打标,从整体上收敛问题。
后面将重点介绍业务的主要难点,在样本和模型上的主要工作。
样本工程
样本来源&清洗
样本方面,经过一些实验论证,标签数量多,每个标签需要的样本量大,人工标注几乎不可能满足要求,因此考虑主要使用点击日志和一些现成的外部资源:
点击日志数据量大,能够循环产生,同时反映了用户最直接的意图;缺点是含有的噪声大,同时用户点击往往偏向于高频,低频表达较为稀缺;
外部资源数据量小,但多样性较好,能够弥补点击数据在低频表达不足的问题。
通过引入这两方面的样本,我们很快得到了数百万的原始样本,这么大量级的样本,即使清洗依然是一个及其巨大的工作量,为了高效地清洗样本,我们设计了结合主动学习的两级模式:
在两方面的初始样本引入后:
首先对数据进行抽样清洗,并将清洗过程抽象为业务规则,进行全局清洗和迭代;
当整体系统且明显的噪声趋于收敛后,我们通过对剩余数据进行划分,每次抽取部分数据建模,对另一部分数据进行识别,然后对识别不好的一部分数据进行人工标注;如此反复迭代多轮。
通过一种类似主动学习的方式,使人工标注的价值最大化,避免低信息量重复样本的反复标注造成人力浪费。 下面具体介绍点击样本的挖掘思路。
点击样本挖掘
搜索点击日志凝聚了无数用户的需求与智慧,大多数的搜索业务都能从中挖掘最原始的训练样本。具体到当前的挖掘业务,首先要解决的问题是样本表达形式的不一致问题。具体描述为:
点击数据:query -> POI
需要样本:tag -> POI
解决方案:tag -> query -> POI
如下图,要挖掘内衣的样本集,人工定义了该标签的映射的query集合seed query,再通过这个query集合去召回对应的click样本,就可以直接作为标签内衣的样本。
在实际操作中,我们增加了seed query到泛化集合的映射,即由人工定义的高频query集合泛化到一个更大的同义集合后,再由同义集合进行click样本的召回,其出发点在于:
高频的query主要点击集中于高频的样本,要解决的问题难点在于低频表达的挖掘,因此对query进行从高频到低频的泛化,以期通过低频query召回低频的样本表达,比如丝袜到休闲棉袜,内衣到维密、都市丽人等方面的扩展。
query泛化过程:
query的泛化,需要通过高频集合获得近义的低频表达,同时又要保证不会过度的语义扩散,导致泛化集合偏离了标签原本的语义。我们主要尝试了以下方案:
word2vec:通过对点击或外部语料学习word粒度的向量表达,对query中的多个word进行maxpooling,得到query的向量表达,再通过query向量去全量集合中搜索向量距离近的其他query。该方法的主要问题是通过word粒度的embedding刻画的query表达,在泛化过程中不太受控,容易引入大量的噪声,清洗难度大,同时存在显著case的漏召。
同义词:该方法召回非常受限,且得到的query不一定符合用户的自然表达。
Session上下文:地图场景的session普遍较短,召回受限且语义有偏离,准召均不高。
推荐方法:继续考虑点击日志的挖掘,将各个query比作user,点击的POI作为item,考虑引入推荐的思想进行相似query挖掘——即点击相同或相似POI的query具有某种程度上的相似性,而query和POI点击关系天然构成一个社交网络,由此参考了两种基于图的推荐方式:
- SimRank,通过query与POI间的点击关系形成二部图,两个节点间的相似度由他们共同关联的其他所有点加权平均得到,通过反复迭代多轮后,相似度趋于稳定,得到两两query间相似度;
a、b表示图中的两个节点,定义自相关度为1,即s(a, a)=1,I(a)、I(b)表示与ab相连的节点集合,对于不同的a、b,其相似度描述为:
- DeepWalk,是一种学习网络中节点的表示的新的方法,是把language modeling的方法用在了网络结构上,从而使用深度学习方式学习网络中节点间的关系表示。类似simrank方式,通过query与POI间的点击关系构成点击网络,在点击网络上进行随机游走,通过对游走片段的学习,得到query的向量表达,再通过向量表达计算query的相似召回。
推荐方法的两种方案中,simrank计算量极大,在小数据量上实验经过了较长时间的迭代,而数千万点击数据计算资源和计算时间都将变得极大,成本上不合算;而DeepWalk随机游走方式在实际测试中取得了较好的效果:
比如,原始query为涂料,泛化得到其子分类、品牌等,ETC可以得到一些地方性的命名表达。
不同于将query分词后学习其word粒度embedding表达,DeepWalk在这里直接学习整个query,即Sentence的表达,避免了将query分词为多个word再pooling过程中语义偏移;而且直接query粒度的表示学习,得到的挖掘结果更加符合线上的实际表达,便于我们后续召回点击POI样本的操作;同时粗粒度的学习对网络节点间社会关系会有更优的保留。
整体上,通过query泛化步骤,样本集合的低频表达比例明显提升。
模型设计与迭代
使用分类的方式解决打标问题,是业类相似场景的通用做法。具体到业务角度,我们需要模型解决的打标数据范畴主要分为四类:
高频后缀识别
低频后缀识别
品牌识别
非文本识别(typecode、来源类别等)
前三类可以使用纯文本分类模型,但非文本特征无法直接用文本模型进行整合;同时,样本数据在前期具有噪声大、分布不均衡的特点,都需要兼顾。
分层多分类
前期使用多分类模型解决分类问题,对于每一个非叶节点构建一个多分类器,从根部开始构建,分到最后一级输出为叶节点。其特点是直观,和标签体系比较匹配。
这种方式有比较明显的缺陷:方案结构复杂不稳定,维护难,样本组织相当繁杂;上级分类模型的错漏,将层层影响下级的分类效果。
每个标签二分类
业务前期受限于优化前的搜索效果,样本集有一定量的噪声,同时体系在调研期间也会时常迭代,不断优化,需要一个解释性强、兼容变化,同时又能直接支持多标签的模型。
因此,我们尝试了对每个标签训练二分类模型,待识别的POI经过所有的二分类模型预测后结果合并使用,再进行后续的业务逻辑建设,该方式较好地解决了业务多标签的场景,避免同一POI多个标签间的冲突。
在样本方面,使用ovr方式组织样本,样本比例可调整(正负例比例、负例来源比例等),兼容了业务样本不均衡问题。
统一模型
单标签的二分类模型具有良好的解释性,以及每个标签建模带来的灵活性,很好匹配了业务的前期需求,迅速推进标签效果落地,线上恶劣case大量收敛,同时较原来的人工专家规则方式,召回明显提升的同时,效率也提升十倍以上。
前期为了短平快地推进业务,使用简单二分类模型迅速解决了主要问题,随着搜索效果的不断提升,业务上也有了更高的质量要求,而LR二分类模型依然存在一些问题:
使用词袋特征,维度膨胀
特征选择造成低频特征损失
泛化性能一般,需要大量建设业务规则
独立建模,标签间的关系识别不充分(父子、共现、互斥)
负样本大量降采样,浪费样本
模型数量极多,维护成本高
为了达到更好的效果,深度模型的升级有了必要,深度文本分类,常用的模型有cnn、rnn以及基于attention的各种模型,而attention模型主要解决的是长文本的深层语义理解问题,我们业务场景需要解决的是短文本简单语义的泛化问题,同时考虑到需要和非文本特征结合,以及分类效率方面的考虑,我们选择textCNN模型。
而textCNN是一个纯文本的多分类模型,不能解决多标签情况,也无法兼容非文本特征,同时样本不均衡问题也导致小样本类别学习不充分。为了匹配实际的业务,我们对原始的textCNN进行了业务改造,如图:
原始textCNN对文本进行词嵌入、卷积核池化后,直接进行softmax多分类,而在当前业务下:
将文本表示经过池化后,拼接了外部的其他非文本特征,对文本使用深度的特征提取与表示,而简单的非文本特征使用类似wide&deep的方式接入,共同参与预测;
softmax只能输出归一化的预测结果,不适用与多标签场景;通过改造输出层,使用多路的sigmoid输出,每一路输出对应一个标签的预测结果;
对同一样本多标签的情况进行了压缩,多个label合并为一个向量;
重新设计损失函数,多分类交叉熵不适用于多个二分类输出未归一化的场景。
如此,解决了多标签场景&非文本特征接入的问题,同时使用深度模型取得更好的泛化效果。
另一方面,所有样本在同一模型中训练,原本样本不均衡问题造成了一些负面影响。比如大类家居建材、服饰鞋包有数十万的样本,而劳保用品、美容美发用品等标签只有几千样本,在训练时很容易直接丢弃对整体准确率影响较小的小样本集。因此对每个样本集计算权重:
ck为k类别的样本数,h为平滑超参,效果上类别样本数量越少,权重越大。将类别权重加入到损失函数:
λ1、λ2分别代表对文本特征和非文本特征的正则化约束比重因子。
经过改造和优化后:
以上几个标签间样本数量差距极大,但分类效果都维持在一个比较高的准召率上。此外,我们还根据改造后的模型,开发了模型解释工具。对于一些不符合预期的case,通过解释工具,可以直接观察:
分类时起主要作用的因子,是文本特征,还是非文本特征,以及具体是哪个特征及其value显示;
如果是文本特征,显示权重最大的若干个卷积窗口位置,以及具体窗口中每个term的权重
通过该工具可以在使用深度模型预测时,保持如同LR一般的解释性,方便定位与迭代。
总体上经过以上textCNN的业务改造与迭代,随机数据准确率提升5%以上,同时业务规则减少66%,同时在长尾case(低频文本、品牌)上取得比较明显的效果。
相关工作
前面主要介绍了我们在类别标签建设方面的一些工作。
在另一方面,类别标签在地图搜索中生效,则需要识别哪些query需要使用标签进行召回。在前期,我们人工标注了高德地图搜索头部query和标签的对应关系。但人工的标注方式始终覆盖有限:
不能取得中低频query的标签召回收益,从而标签利用率不够高;
对于应该使用标签召回的query,如果因为未能识别而使用文本召回,也影响了线上的效果,降低用户体验,造成badcase。
因此,在完成体系建设后,我们另外建模,主要使用文本语义和点击方面的特征,识别query和标签的对应召回关系,即识别哪些query可以使用类别标签召回,通过这一系列的工作,对中低频的标签召回进行了深挖,高德地图中类别搜索流量中使用标签召回比例高达94%。
收益
标签数据产出后,需要进行两方面的评估:
- 从输出数据的质量上,即本身标签的准确率和覆盖率:
高质量的数据,不光利于搜索的业务支撑,还利于我们的类别标签体系在整个BU的推广和落地。
- 上线后对线上泛搜实际query的搜索效果提升评估:
除了数据质量的评估,还会结合新的标签数据对搜索效果进行评估,即对新标签体系和旧标签体系的对照效果评估。在人工效果评估中,gsb效果上,每个大类的数据上线,都带来了非常明显的类别搜索质量提升,从而让搜索更准确、更全面的辅助用户决策。
小结
当前工作的重点在于使用通用特征解决了主体的类别打标问题,对于通用特征不可解的问题,往往通过外部知识、资源的建设方式解决,如品牌库建设、A级景区资源收集等方式。
而实际上,使用通用特征外,不通用特征对于部分数据的分类效果提升应用并不充分,后续应该安排一系列的专项优化,比如:
评论、简介等特征,应用一些Attention方法,可能取得比较好的补充效果;
POI图片中往往隐含一些类别相关信息,对图片识别可以充分利用这些信息;
外部百科、知识图谱等知识的引入,辅助中低频品牌库的建设等。
在业务闭环建设上还要持续,比如恶劣case的流转与自动修复机制建设,新品牌、新标签的发现等问题,以避免打标系统长期运行后的效果退化等。
无论机器学习还是外部资源辅助的方式,对于海量的长尾数据往往乏力,实际线上很多的POI特征相当匮乏,只有一个简单的名称,从中很难准确预测其类别。如何引导用户自己提交类别信息,或者众包方式完成类别标签的标注,也是我们后续需要着重考虑的解决方案。
关注高德技术,找到更多出行技术领域专业内容
地图POI类别标签体系建设实践的更多相关文章
- 获取百度地图POI数据二(准备搜索关键词)
上篇讲到 想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字 那么这些关键字如何得来呢? 本人使用的方法是通过一些网站来获取这些关键词 http://poi.mapbar.com ...
- 教你如何拔取百度地图POI兴趣点
教你如何拔取百度地图POI兴趣点 通过聚合数据提供的接口,获取百度地图的POI兴趣点,并存储至数据库中. 实现: 1.聚合数据百度POI接口说明 调用聚合数据,首先得注册聚合.聚合数据提供的百度地 ...
- Hi,这有一份风控体系建设干货
互联网.移动互联网.云计算.大数据.人工智能.物联网.区块链等技术已经在人类经济生活中扮演越来越重要的角色,技术给人类带来各种便利的同时,很多企业也饱受"硬币"另一面的伤害,并且形 ...
- Atitit 快速开发体系建设路线图
Atitit 快速开发体系建设路线图 1.1. 项目类型划分 哑铃型 橄榄型 直板型(可以立即实行)1 1.2. 解决方案知识库 最佳实践库 最佳流程优化(已成,需要一些整理)2 1.3. 功能模板 ...
- Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准
Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准 1. 界面gui方面的前后端分离重大意义1 2. 业务逻辑也适当的迁移js化1 3. 常用分离方法2 3.1. 页面 ...
- 民生银行十五年的数据体系建设,深入解读阿拉丁大数据生态圈、人人BI 是如何养成的?【转】
早在今年的上半年我应邀参加了由 Smartbi 主办的一个小型数据分析交流活动,在活动现场第一次了解到了民生银行的阿拉丁项目.由于时间关系,嘉宾现场分享的内容非常有限.凭着多年对行业研究和对解决方案的 ...
- 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0 ...
- Kubernetes容器云平台建设实践
[51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...
- 质量保障&&质量体系建设
一.质量保障 先引用一段 百度百科 上对软件质量保障的解释:软件质量保障是建立一套有计划,系统的方法,来向管理层保证拟定出的标准.步骤.实践和方法能够正确地被项目所采用.软件质量保证的目的是使软件过程 ...
随机推荐
- nginx(二)
nginx rewrite Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向.rewrite只能放在server{},location{},if{}中,并且 ...
- Linux 安装MySql——ubuntu版
这里简单地阐述一下rpm.deb.tar.gz的区别. rpm格式的软件包适用于基于Red Hat发行版的系统,如Red Hat Linux.SUSE.Fedora. deb格式的软件包则是适用于基于 ...
- vim批量注释和反注释快捷键
vim批量注释和反注释快捷键 我是个vim新手,非常喜欢这个工具,因为纯手工操作吧.可是有些快捷键还是不知道,写Python的时候经常要调试,会批量注释掉一些代码,vim不像pycharm那样 Ctr ...
- UTF—8与UTF—8(无bom)格式
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...
- DBeaver之连接hive初体验
工作中第一次和搞大数据的同事配合,他让我用hue看hive数据,,由于本人英语菜逼,hue全英文的页面看不习惯,遂找了一个DBeaver工具,我也是第一次使用这个工具,好像挺可以的,可以连mysql, ...
- Chrome浏览器F12开发者工具简单使用
1.如何调出开发者工具 按F12调出 右键检查(或快捷键Ctrl+Shift+i)调出 2.开发者工具初步介绍 chrome开发者工具最常用的四个功能模块:元素(ELements).控制台(Conso ...
- 记录一下我做Udacity 的Data Scientist Nano Degree Project
做项目的时候看了别人的blog,决定自己也随手记录下在做项目中遇到的好的小知识点. 最近在做Udacity的Data Scientist Nano Degree Project的Customer_Se ...
- Okhttp3 网络请求框架与 Gson
Maven环境 : <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>o ...
- 阿里P8Java大牛仅用46张图让你弄懂JVM的体系结构与GC调优。
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.图文并茂不生枯燥. 此PPT长达46页,全部展示篇幅过长,本文优先分享前十六页 ...
- Java高级面试题解析(二):百度Java面试题前200页(精选)
基本概念 操作系统中 heap 和 stack 的区别 heap是堆,stack是栈,是两种不同的数据结构.堆是队列优先,先进先出:栈是先进后出. 在java多线程中,每个线程都有自己的栈:不同的线程 ...