在 1 月 28 日小年夜的晚会上,百度推出的智能春联 工具 正式上线了。基于人脸识别、自然语言处理等人工智能技术,这项技术可以凭借用户的人脸特性,为你生成充满创意的个性化春联。当然用户也可在这个小工具中输入名字、甚至任何一段话,获取属于自己的专属春联。
链接: http://news.163.com/special/test_smart_spring2018/
让我们看看人工智能生成春联的效果如何。首先,猫的图片是不被认可的,百度的 AI 可以识别图片中是否为人脸。
于是我们上传了一张人的图片。
我们找到了一张百度高管的照片
上传照片生成的对联
在智能春联的背后,是计算机视觉、自然语言处理等 AI 技术。据介绍,百度通过先进的视觉技术让 H5 具有刷脸能力,通过其中的人脸检测、属性分析和人脸融合等,可对图片中的人脸进行检测,分析人脸对应的年龄、性别、颜值、微笑指数、是否佩戴眼镜等信息,并通过以一个词语概括人脸的特性;进而将图片中的人脸,与指定模板图中的人脸进行融合,得到新的图片。这些技术的难度在于,需要对各种角度的人脸进行检测,并且能够提取人脸的五官特征,以便能够生成与原始人脸相似,但也和模板人脸神似,且毫无违和感的新图片。
对联生成的关键词扩展技术和对联生成系统背后的运行机制是什么样的?我们从百度工程师那边了解到,具体流程图如下:
线上系统流程图
关键词扩展技术: 关键词扩展技术主要用于解决语义扩展问题,正如所有深度学习问题面对的问题一样,不在训练语料中出现的字或者词很容易造成生成结果不理想。在这里,百度引入了语义相似度匹配技术,将输入串同对联中的词计算相似度,用最相似的词替换原始输入串,例如:咏春 -> 武术,当红->流行等。这样既能满足语义层面最大程度的匹配,又能确保生成的对联符合要求。线上系统为了满足大规模服务的要求,系统会离线将常用词提前算好候选,直接使用缓存查询的方式最快的完成语义扩展。对于那些低频词,还是保留原样输入到对联生成系统中。
对联生成系统:包含关键词生成上联,上联生成下联和上下联生成横批等功能,具体流程如下:
根据输入串,首先判别此串是否为人名,如果为人名,需要对串进行截断,三字名截取最后两个字,二字名,去掉姓,将名在对联分词数据中查询,找到包含这个字且频次最高的词,若无结果,则简单的将名重复,形成两字输入。否则不对串做任何处理
对输入串切字,挨个字输入深度学习序列到序列模型,使用模型输出当作上联。在最终实现中,我们发现如果任由模型产出而不加任何限制,会出现大量重复,例如:春光 -> 春光无限春光无,这种重复在 7-9 字春联中十分影响整体效果,所以研究人员在解码过程中加入了重复限制,只允许一个字重复,且最多重复两次,加完限制后效果:春光 -> 春光无限江山秀。
在这里,研究人员采用基于 RNN 的 encoder-decoder 框架进行序列建模
根据上联智能生成下联。上联生成下联时,也是使用了一个深度学习序列到序列模型,将上联的挨个字输入,产出下联。类似于上联,下联生成的过程中同样会有很多不确定因素。首先最大的问题是,单纯依靠模型,上下联的字数会不同;其次上下联对应字的对仗会不工整;最后生成下联的时候也会出现字重复问题。在解码过程中,系统首先会确保在模型生成字数未达到要求时 (即同上联字数相同),解码不会终止。其次,百度根据大量春联语料统计出每个字可能对仗的候选,在解码时,如果输入的字有候选,那我们只预测候选字的概率,否则预测整个词表中所有字的概率。这在一定程度上会缩短解码时间,提升产品并发性能。最后对于重复字,不同于上联的处理流程,下联只能在上联重复字对应的位置上重复,其余位置均不能重复。例如:春草满庭吐秀,花花遍地迎春->春草满庭吐秀,神州遍地迎春。
智能横批生成。产生上下联之后,会根据相似度选择最合适的横批。首先将上下联和候选横批进行分词,其次 Jaccard Distance 来计算最相似的横批,按照得分从高到低排序,选择分数最高的横批。正如 Jaccard Distance 公式所示,很容易出现分子为 0,对于这类情形,在这里会随机选择一个横批,确保春联的完整性。
离线系统:包括语料收集与预处理、平仄处理、模型训练和语义扩展四部分。具体流程图如下:
离线系统流程图
对联语料收集与预处理:通过定点网站的挖掘和人工收集,过滤掉字数不符合的对联 (上联和下联长度保证 7-12 个字)。使用黄反策略,识别出劣质对联。对上联进行分词,只保留词长度在 2-4 个字之间的上联,形成词 => 上联的匹配对,并对其分字作为关键词生成上联的候选训练语料。如春联为「百花齐放春光好」,生成的训练语料则为「百花 => 百花齐放春光好」。上联生成下联的模型候选语料为一组对联分字之后的结果。
平仄处理:对联的一大特点就是平仄协调,为了能让模型学习到平仄关系,我们可以从候选语料中只挑选了满足平仄的对联作为训练语料。具体做法为:对于上联和下联的最后一个字,查拼音表,如果上联最后一个字为第三或第四声,下联最后一个字为第一或第二声,则保留这幅对联,否则删除这条训练数据。对于多音字,在这里取其常用发音。
模型训练:不同于平常深度学习序列到序列模型使用分词后的结果作为输入,百度的程序采用基于字的序列模型,这样做的原因在于,对联中上下联对仗工整,并且每个位置上的字都有对仗关系。其次,在对联上切词很容易切出单字这会造成词表巨大,反而不利于训练。因为春联数据规模不大,为了防止过拟合,在这里加入了 dropout,early stop 等策略,增加验证的频率,来选取最优的模型。
语义扩展:如上文所述,为了提升对联效果,减少训练集合中未出现的字对于模型的影响,模型会离线计算出常用词同训练集中切词后词 (长度在 2-4 个字之间) 的相似度。在相似度计算部分,模型使用了 simnet 框架进行语义匹配计算。考虑到最长可能会输入 4 个字,模型也将成语进行了提前计算,从百度百科中抓取下来 4 字词语,根据词条类别判断,只保留类别为词汇的那些。由于四字成语具有不同的形式,例如:兴高采烈 (ABCD),高高兴兴 (AABB),大吉大利 (ABAC),考虑到训练语料中会将成语切分开,对于 ABCD 型成语,模型将成语分成 AB 和 CD 分别同对联中的词算相似度,再将结果合并,只保留得分高的结果;对于 AABB 型成语,模型只计算 AB 的语义相似度;ABAC 型只计算 BC 的语义相似度。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 用机器学习把春联写起来
- 如何用深度学习框架PaddlePaddle实现智能春联
- 为了写春联,我用 Transformer 训练了一个 “对穿肠”
- jsonp劫持入门玩法
- SkyWalking之高级玩法
- 【译】2019 JavaScript 新玩法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java编程的逻辑
马俊昌 / 机械工业出版社 / 2018-1-1 / 99
Java专家撰写,力求透彻讲解每个知识点,逐步建立编程知识图谱。本书以Java语言为例,由基础概念入手,到背后实现原理与逻辑,再到应用实践,融会贯通。 全书共六大部分,其要点如下。 第一部分(第1~2章)讲解计算机程序的基本执行流程与元素,以及数据背后的二进制表示,帮读者掌握编程的基本概念。 第二部分(第3~7章)讲解面向对象的编程原理与逻辑,涉及类、继承与多态、接口与抽象类、异......一起来看看 《Java编程的逻辑》 这本书的介绍吧!