前端代码是怎样智能生成的-字段绑定篇

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: 作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了 2019 双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块 79.34% 的线上代码由前端智能化项目自动生成。在此期间研发小组经历了许多困难与思考,本次《前端代码是怎样智能生成的》系列分享,将与大家分享前端智能化项目中技术与思考的点点滴滴。

作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了 2019 双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块 79.34% 的线上代码由前端智能化项目自动生成。在此期间研发小组经历了许多困难与思考,本次《前端代码是怎样智能生成的》系列分享,将与大家分享前端智能化项目中技术与思考的点点滴滴。

概述

imgcook 是专注以各种图像(Sketch/PSD/ 静态图片)为原材料烹饪的匠心大厨,通过智能化手段将各种视觉稿一键生成可维护的前端代码,含视图代码、数据字段绑定、组件代码、部分业务逻辑代码。智能字段绑定是其中一部分,实现准确识别营销以及其他垂直业务视觉稿的可绑定数据字段,大幅提升模块研发效率,从而强化视觉稿还原结果,其拆分为数据类型规则、是否静态文案、图片绑定和文本字段绑定几个部分。

在 imgcook 大图位置

如图所示,服务位于字段绑定层,包括数据类型规则、是否静态文案、图片字段,文本字段等部分。

image.png
(D2C 技术能力分层 )

预研

智能字段绑定依赖于语义化层,语义会依据经验为节点做类型标注,标记了这个节点“是什么”后,智能绑定将这个“什么”转为业务域中字段,为了提高准确度,将高置信度规则作为绑定条件。分析如下:

  • 语义与字段绑定联系过深

    • 问题:导致的问题语义与字段绑定结果关联过紧,灵活度不够
    • 优化:语义与字段绑定的判定流程分离,移除置信度概念
  • 语义层规则层过硬

    • 问题:现有规则层过硬,以判断为主
    • 优化:硬规则使用分类算法,统一定性对标到 w3c 的节点标准上
  • 语义层机器学习算法使用程度不足

    • 问题:仅使用了实体识别、句法分析和翻译
    • 优化:图像分类使用深度模型,文字分类使用传统机器学习
  • 业务域字段频繁变更

    • 问题:映射的字段不同业务域下不同
    • 优化:提供不同配置自身智能绑定映射关系的能力
  • 硬规则层扩展

    • 问题:现有规则不够多
    • 优化:根据设计稿,提炼新的规则,扩充规则层

技术方案

字段绑定主要通过文本 NLP 识别和图片分类识别 vdom 中内容来决策映射到数据模型中的字段从而实现智能绑定字段,整体流程入下图

image.png
( 字段绑定核心流程图 )

在字段绑定中主要核心是文本 NLP 识别和图片分类模型,下面着重介绍下。

文本 NLP 识别

调研

淘系设计稿文字所有动态部分分类分析:

业务域下常见的字段和设计稿文字的关系,下面举几个例子

商品名称 / 标题(itemTitle)

  • 设计稿文字:产品产品名称最多十二个字、产品名称十二个字、商品名超过十个字显示
  • 真实意图文字:NikeAF1JESTERXX、海蓝之谜睡眠面膜保湿补水神器饱满焕发、Galanz/ 格兰仕 G80F23CN3XL、德国双立人 Specials30cm 中立炒锅套装、SOPOR/ 苏泊尔 CFXB40FC8028

image.png
( 商品名称 / 标题设计稿 )

店铺名称(shopName)

  • 设计稿文字:店铺名最多八个字、店铺名称店铺、店铺名可以八个字、店铺名称店铺名称最多放十五个字
  • 真实意图文字:优衣库体验舒适人生、NIKE 海淘精品、匡威官方旗舰店、ZARA 服饰旗舰店、Mays 官方海外旗舰店

image.png
(店铺名称设计稿)

店铺利益点(shopDesc)

  • 设计稿文字:店铺利益点八字内、利益点超过十个字显示、利益点仅七个字、利益点可以两条利益点文案最多十个字
  • 真实意图文字:满 199 返 199、进店可享满 5 折优惠、进店可享满 199 送199、冬新品第二件满减包邮、全场满 1999 送 199

image.png
(店铺利益点设计稿)

技术选型

朴素贝叶斯

我们在字段绑定中进行 NLP 识别的一个问题是样本量不够。尤其我们依赖于租户上传自己的样本对他们特定的业务进行训练,往往租户并没有特别大量的数据,在这种情况下,我们考虑选择朴素本叶斯分类器来进行分类,原因是朴素贝叶斯公式源于古典数学,其对于后验概率的得出源于先验概率和调整因子,并不依赖于数据量,对小数据和噪声点非常健壮。核心算法是这个贝叶斯公式:

image.png

换个形式表达就清楚多了,如下:

image.png

最终求 P( 类别 | 特征 ) 即可。

分词

对于每条样本,我们在分类前需要首先进行特征点提取,在这个问题中也就是对样本进行分词,在机器学习平台中默认使用了 AliWS 来进行分词,AliWS(AlibabaWordSegmenter 的简称 ) 是服务于整个阿里巴巴集团的词法分析系统。被广泛应用于集团的各项业务中。AliWS 的主要主要功能包括:歧义切分,多粒度切分,命名实体识别,词性标注,语义标注,支持用户自己维护用户词典,支持用户干预或纠正分词错误。其中,在我们的项目中,命名实体识别包括:简单实体,电话号码,时间,日期等。

模型搭建

我们主要是使用了机器学习平台的能力进行了快速模型链路的搭建,机器学习平台对于 ALiWS 的分词算法和朴素贝叶斯多分类进行了很好的组件封装,下图是我们的模型搭建

image.png
(文本 NLP 模型训练链路)

从上图看第一步会执行 SQL 脚本从数据库拉取训练样本,然后对样本进行分词操作处理。之后会按找一定比例将样本拆分为训练集和测试集,对于训练集的样本,进行朴素贝叶斯分类器,对于测试集,则是拿到分类器的结果进行预测和评估,最后会把模型结果通过 odpscmd 指令上传存储到 oss。

图片分类模型

调研

从业务场景中,我们总结出常用的八种分类,分别是标、icon、头像、店铺logo、场景图、白底图、氛围图、高斯模糊图。

  • 标 :label 为矩形小图,背景纯色,上有白色短文字点名心智
  • icon:icon 大概率圆形。通常是抽象化的符号,
  • 头像 :avator 通常圆形,中心为人物面部
  • 店铺 logo:logo 通常用于突出性展示一个概念,文字或抽象化的图片作为主体
  • 场景图 :picture 最常见的商品图,内容较多,主体通常不为一个。突出商品或人物在真实环境中的表现。
  • 白底图 :purePicture 主体单一,背景纯白。突出主体自身。
  • 氛围图 :pureBackground 有明显色系,形状构成的背景图
  • 高斯模糊 :blurBackground 高斯模糊效果的背景图

在之前的模式下,我们主要是根据图片大小和图片位置等相关信息通过一些规则来进行图片识别。但这种模式下的识别存在不准和不灵活的问题,比如不同业务下可能 icon 的大小不尽相同,以及位置等信息存在极大的不确定性,同时由于基于这些类别进行分析,发现图片本身的内容已经足够区分开来,所以我们考虑使用深度学习模型进行图片分类识别。

技术选型

CNN 网络

图片分类问题,我们首选是当前图像处理最热门的 CNN 网络,卷积神经网络的想法来源于人类的视觉原理,而这种通过卷积核分析图片相较于传统的神经网络极大的降低了待训练参数数量。同时,相较于传统的机器学习模型,CNN 在特征提取上表现出了极高的优势。

简单介绍下 CNN 网络如何实现的,在介绍卷积神经网络络前,我们先看看人类的视觉原理

人类的视觉原理

  • 深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。
  • 1981 年的诺贝尔医学奖,颁发给了 DavidHubel(出生于加拿大的美国神经生物学家)和 TorstenWiesel,以及 RogerSperry。前两位的主要贡献,是“发现了视觉系统的信息处理”,可视皮层是分级的。

人类的视觉原理如下:

image.png
( 人类的视觉原理 )

image.png
(人脑进行人脸识别示例,图片来自网络)

对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:

image.png
(人类视觉对不同物体逐层分级,图片来自网络)

我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。

那么我们可以很自然的想到:可不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?答案是肯定的,这也是许多深度学习算法(包括 CNN)的灵感来源。

卷积神经网络 (CNN) 的基本原理

卷积神经网络包括输入层、隐含层、输出层,其中隐含层包括卷积层、池化层和全连接层 3 类常见构筑,这 3 类分别负责的分工是卷积层对输入数据进行特征提取,池化层用来大幅降低参数量级 ( 降维、防止过拟合 ),全连接层类似传统神经网络的部分,用来输出想要的结果。

image.png
(CNN 的基本原理)

迁移学习

由于我们的图片数据主要来自于内部网络,同时受制于计算资源的问题,我们需要选择一种训练方式来尽可能的适应数据量少和计算资源少的问题,于是我们考虑使用迁移训练。迁移训练是一种基于其他已经训练好的模型进行再训练的技术,基于诸如 ImageNet 等数据集经过大量运算训练出的如 VGG,Resnet 或 MobileNet 等模型本身已经具备了很好的提取图像特征和输出信息的能力,这就好比站在前人的基础上做事情,只需要再这基础上让模型适应我们的数据就好,这会大大节省训练的成本。

ResNet

在我们的项目中,我们考虑在使用 Resnet 的基础上来进行迁移学习。ResNet 最根本的动机就是所谓的“退化”问题,即当模型的层次加深时,错误率却提高了,这是由于深度加深导致的优化变的苦难的问题,残差网络通过短路连接,在网络向后传播梯度的时候,永远不会出现梯度消失的情况,很好的解决了网络过深带来的问题。

Tensorflow 和机器学习平台

机器学习平台,为传统机器学习和深度学习提供了从数据处理、模型训练、服务部署到预测的一站式服务。机器学习平台底层支持 Tensorflow 框架,同时支持CPU/GPU 混合调度和高效的资源复用,我们将借机器学习平台的计算能力和 GPU资源进行训练,同时将 inference 模型部署至机器学习平台的在线预测服务 EAS。

模型搭建

数据预处理

  • 数据清洗:通过 odps 的大促表爬取了每个类别约 1000 张图片,但是其中很多图片由于是商家上传的,可能会有无效数据,丢失数据甚至是错误数据,比如我们在处理这些图片的时候发现很多白底图和商品图是混淆的,我们将会对这些数据首先进行一轮清理。
  • 人工样本:在常见类别中,我们发现诸如氛围图这类很难爬取到很多,同时这类样本具有明显的特征,于是我们将根据这种特征进行样本制造。我们使用了 node-canvas 人工制作了约 1000 张样本,同时,高斯模糊这一类别实际上往往就是一些商品图进行模糊之后的效果,所以我们对爬取到的商品图使用opencv 进行高斯模糊,得到样本。
  • 数据增强:由于我们场景的特殊性,我们不能采用一些传统的数据增强的方式,比如高斯模糊(因为我们有一类就是高斯模糊),但是我们进行了一些简单的诸如位移和轻微旋转等数据增强方式。
  • TFRecord 转 化:TFRecord 是 Tensorflow 官方设计并推荐的一种数据存储格式,每个 TFRecord 内部存储了多个 TFExample, 可以想象每个TFExmaple 就是对应一组数据(X,y),TFExample 其实是一种谷歌官方开发的数据框架序列化格式,类似于 Javascript 序列化输出的 JSON 或者Python 序列化输出的 Pickle 等格式,但是 protobuf 体积更小,数据更快,效率更高,从 Tensorflow 源码中也可以随处可见这种数据格式。以下从我们代码中截取的片段是针对一组数据创建 TfExample。

其中我们制定了三个 Feature 我们之后再训练中将会用到的,image/encoded就是图片的 bytes 流,label 是分类的类别,image/format 是图片类型,将会在之后slim.tfexample_decoder.Image 函数解析 Tfrecord 中使用。

模型构建

迁移训练模型建立

TF-slim 是 Tensorflow 轻量级的高阶 API, 可以很方便的定义,训练和评估模型。TF-slim 官方提供了很多知名的 CNN 网络的预训练模型。用户可以通过官方Github 进行模型参数的下载,同时调用 tensorflow.contrib.slim.net 中的方法加载模型结构,以下是我们定义的 predict 函数,此函数将在训练时和预测时提供定义流图中经过模型的部分。注意预训练模型只提供了卷积层的实现,为符合我们的分类问题,我们还需要把输出的卷积结果压平,同时加一层全链接层加 softmax 函数进行预测。

模型训练

我们通过 slim 提供的 assign_from_checkpoint_fn 函数加载下载的mobileNet 预训练模型的参数,使用之前定义的数据流图进行训练,同时在训练的过程中输出checkPoint 和相关 Log

模型预测

在模型训练期间,我们会定时保存训练数据,保存数据主要通过 Tensorflow 的tf.train.Saver 相关方法来实现的,Tensoflow 的保存会生成以下四种文件类型:

  • .meta 文件:保存了模型的数据图
  • .ckpt.data 文件:保存了模型变量的信息,包含 weights,bias 等信息
  • .ckpt.index:描述了张量的 key 和 value 的对应信息
  • .checkpoint:保存的模型和模型的相关信息

实际上可以看到模型保存时会生成相当多的信息,而其中的很多信息其实在使用模型进行预测时并不是必须的,那么我们就需要对导出的记录信息进行优化,实现高性能的预测。

首先,我们将对保存的模型进行冻结,Tensorflow 模型冻结是指把计算图的定义和模型权重合并到同一个文件中 , 并且只保留计算图中预测需要的部分,而不再需要训练相关的部分,下面我们的代码片段就是将计算图中所有的变量转化为常量。

产品方案

我们考虑到不同业务的数据模型和智能识别及绑定的字段不一样,因此实现了一套可以在线新增分类并配置样本,在线训练模型生成服务,然后通过配置方式使用。

流程图

image.png
(产品流程图)

还原模块自动绑定效果

image.png
(字段绑定效果)

未来展望

  • 对不同场景静态文案分析,我们分析影响绑定准确率的一个部分原因是不同设计和模块里的静态文案多样性,导致的识别出符合预期的结果,后面我们会着重针对不同业务场景静态文案梳理,识别前对静态文案过滤,同时完善通用配置及识别能力。
  • 对 NLP 识别和图片分类识别模型优化,对识别绑定不准的数据进行反馈召回,再对反馈召回的数据分析重新优化识别模块和链路,最终提高绑定准确率。
  • 字段标准化推进
相关文章
|
1天前
|
前端开发 小程序 JavaScript
信前端里的循环显示如何编写代码?
信前端里的循环显示如何编写代码?
11 5
|
15天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
2月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
33 1
|
2月前
|
缓存 前端开发 数据格式
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
|
2月前
|
JavaScript 前端开发 小程序
【技巧】JS代码这么写,前端小姐姐都会爱上你
本文介绍了JavaScript编程中的实用技巧,包括解构赋值的多种妙用、数组操作技巧及常用JS功能片段。解构赋值部分涵盖短路语法防错、深度解构及默认值赋值;数组技巧包括按条件添加数据、获取最后一个元素及使用`includes`优化`if`语句;常用功能片段则涉及URL参数解析、页面滚动回顶部及获取滚动距离等。通过这些技巧,提升代码质量和效率。
22 0
【技巧】JS代码这么写,前端小姐姐都会爱上你
|
2月前
|
前端开发 API 开发者
构建前端防腐策略问题之防腐层的核心代码实现以RxJS Observable为中心的的问题如何解决
构建前端防腐策略问题之防腐层的核心代码实现以RxJS Observable为中心的的问题如何解决
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
58 0
|
2月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
78 0
|
2月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
57 0
|
2月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
76 0
下一篇
无影云桌面