当前位置: 首页 > 编程日记 > 正文

基于Go的语义解析开源库FMR,“屠榜”模型外的NLP利器

640?wx_fmt=jpeg

(由AI科技大本营付费下载自视觉中国)


作者 | 刘占亮 一览群智技术副总裁

编辑 | Jane

出品 | AI科技大本营(ID:rgznai100)

如何合理地表示语言的内在意义?这是自然语言处理业界中长久以来悬而未决的一个命题。
在 2013 年分布式词向量表示(Distributed Representation)出现之前,one-hot 是最常用的字词数值表示形式。在这样的词袋模型下,语言被表示为极其稀疏的向量形式,词之间的相互关系完全独立,语言深刻的内在含义被简化成 0-1 关系。
而之后出现的一系列预训练词向量(如 Word2Vec、Glove 等),在一定程度上解决了词袋模型的稀疏性,对大部分NLP任务的表现都带来了一定程度的提升,但其仍无法对如组合性,多义性、照应性、依赖性等复杂语言现象进行合理的表示。到了 2018 年,随着一系列在大规模语料上训练的深度语言模型的出现,以阅读理解为代表的一大批 NLP 任务的榜单屡被刷新,人工智能在语言上的理解能力超过人类的言论一度甚嚣尘上。但当我们回过头来仔细思考,在真实的“自然语言理解”业务场景中,这一轮“技术革新”带来的利好似乎乏善可陈。
那么,对大规模语料的暴力拟合是不是真的能让模型理解语言的语义呢?
2019 年出现的 GTP2 模型参数数量达到了惊人的 15 亿之巨,由它生成的新闻甚至能骗过专业的记者。但值得玩味的是,今年早些时候台湾成功大学的几位研究者发现,BERT 更多地学到了语言中的统计线索,而不是理解文本当中的真正逻辑。当我们用同样的模型对武侠小说进行学习之后,在其生成的文本中我们看到“三柄长剑断作两截”这样的“statistically impeccable but logically wrong"的句子,让我们进一步验证基于人工神经网络的大规模语言模型对语言的深度理解仍然有限。
其实,对于语言表示的问题,在统计学派兴起之前的 20 世纪初期,以索绪尔为代表的一批符号学派语言学家就开始系统地研究了。到了六十年代末期,随着逻辑学家和语言学家之间的屏障开始被打破,一批理论语言学家们着手为自然语言寻求一套完整的语义理论模式,来对语义进行完整的表示。美国逻辑学家理查德·蒙塔古是其中的佼佼者,他认为自然语言与形式语言在基本文法逻辑上是一致的,他提出的“蒙太古语法”也为之后的语义表示研究奠定了基础。
> There is in my opinion no important theoretical difference between natural languages and the artificial languages of logicians; indeed I consider it possible to comprehend the syntax and semantics of both kinds of languages with a single natural and mathematically precise theory. (Montague 1970c, 222)
640?wx_fmt=png
在语义解析这个领域,语义表示早期的工作几乎都是符号学派为主的,例如一阶逻辑表达式和lambda计算式。举个例子,对于:
640?wx_fmt=png
这样一个自然语言,利用一阶逻辑表达式可以简单地表达为:
640?wx_fmt=png
但这些早期的逻辑表达式有一些限制条件。例如,在一阶逻辑中,量词只能用于个体变元,取消这一限制条件,允许量词也可用于命题变元和谓词变元,由此构造起来的谓词逻辑就是高阶逻辑。FMR(Functional Meaning Representation)就是利用高阶函数来做意义表达,将语义(函数声明的调用)和语用(函数具体实现逻辑,函数体)的实现解耦合,让模块的复用性和实用性更好。
也有一些研究者希望用有向无环图来更完备地表达语义,例如由帕尔默等人提出的AMR(Abstract Meaning Representation)。近年来,一些工业界机构也根据自己的业务场景提出了满足各自需求的多种语义表示方法,例如亚马逊的 Alexa 语音助手就采用了同样基于有向无环图的AMRL(Alexa Meaning Representation Language)来表示以对话为主的自然语言。
还有一些研究者倾向于把自然语言直接转化为像 Python、SQL 一样的程序语言,使之能够直接被执行。由于程序语言天然地倾向于消除歧义,这样的方法在某些特定领域有着很强的实用性。
我们也一直在探索一种实用性强、扩展性好的落地方案。面对实际业务问题,能够基于坚实的基础研发产品进行快速的行业适配,摆脱传统方法对数据标注的依赖。同时,又能无缝衔接先进通用模型带给我们的技术利好,有机地把行业内的专家知识与自然语言学界的前沿成果结合起来。
基于 Go 语言的开源库FMR(Functional Meaning Representation)就是我们朝这个方向踏出的坚实一步。基于FMR框架,仅需要少量的工程师就能将有行业特殊性的语言逻辑快速转化为 FMR 框架可读的文法,快速满足行业定制化需求。另外,FMR 相比于传统的框架,可解释性强,误差可控,在部署便利性和技术的延展性上,都有着独特的优越性。
FMR开源库地址链接
https://github.com/liuzl/fmr
640?wx_fmt=png
在传统自然语言的应用中,业界倾向于用一种 pipeline 的方式,包括分词、特征工程、建模等流程。这样的方式中的任何一个子流程的误差在整个过程中都会被传播甚至放大。
与传统流程不同的是,语义解析把自然语⾔的歧义性尽量当成特性⽽不是问题来进行处理,尽量保留所有符合语义的解析树,并结合上下文语境进行歧义消解。例如,在 FMR 中,对语句词的切分是依据 UnicodeStandardAnnex#29,并在此基础上根据文法进⾏解析,这极大程度规避了分词模型误差在 pipeline 中逐级传播。
另外,对于大部分自然语言模型框架,外部依赖繁杂,在业务部署过程中非常繁琐。相比之下,基于 Go 语言的 FMR 在部署时能够被编译成一个可以直接执行的二进制文件,给部署带来了极大的便利。
语言的歧义性与其解析难度是正相关的。正如刚才所说,大部分编程语言在设计的时候就把“消除歧义”作为设计原则之一,因此,大部分程序语言的解析复杂度都是 O(n)的。对于自然语言,由于其内在的歧义性,所用到的解析算法的复杂度(例如 CKY 和 Earley)都是O(N^3) 的。与编程语言相似的是,在金融、公安、法律等领域,文书的文法和词法在一定程度上会刻意避免歧义,以求准确表达。这正好大大降低了语言的歧义性,让语义解析在这些场景下能够发挥效用。
金融行业的票据审核正是这样一个和语义解析耦合性很强的场景。在这个场景下,语言的歧义性一定程度上被人为的避免,降低了语义解析的难度。票据中的语言表述精炼,几乎没有“上下文语境”,而这是大多深度学习模型所依赖的,所以这些屠榜的利器在这个场景下几乎没有用武之地。另外,金融行业对模型的可解释性和可控性要求极高,这也是语义解析能在这个行业落地的重要因素。在一览群智为金融行业打造的智能审单专家系统中,不论是对票据信息的抽取还是对条款语义的理解,语义解析扮演着举足轻重的角色。这个审单系统已经在多个银行的票据审核中投入使用,不仅给银行客户带来了业务效率的提升,也节省了银行大量的人力成本。
640?wx_fmt=png
与金融行业类似,公安行业也存在着大量的零碎数据,分布在不同部门数据库中。以前,面对海量数据,很多业务需求,例如案件线索追踪和串并案发现,都极度依赖于专家的个人经验和大量人力比对。另外,由于公安行业的特殊性,其数据很难流通,这就给数据标注也带来了很大的困扰。针对公安行业的数据现状,我们研发了融合海量警情分析和案件关联分析的警情案情分析预警系统,在多地的公安系统中得到应用与好评。
640?wx_fmt=png
正因为这些行业的文本数据分布与开放领域文本的分别存在偏移,导致很多通用的模型无法快速地适配到应用场景中。同时,这些模型算法中大多数依赖于短期内无法得到的大批量标注数据,面对没有标注数据的场景几乎无法冷启动。
著名学者杨乐村曾说过:如果把人工智能比作蛋糕,那监督学习和强化学习只是蛋糕上的点缀,只有非监督学习是蛋糕本体。在我们面临的大多数没有标注数据的场景中,也许语义解析就是那块蛋糕。自然语言处理和文本分析针对的场景往往是多个任务的集合,而语义解析与深度学习模型的综合使用,能够让自然语言处理和文本分析中的各项任务,按照最适合其特性的解决方法,得到综合的处理。
语义解析所依赖的所有语义解析语法是不是都需要人工编写呢?
在特定领域中,由于语法规则的制定带有很多人工的先验知识,需要人为的来制定。例如在数字解析中,“一打”的指的是“12”,这样的规则就是机器学不来的。但对于大部分语法规则来说,我们是可以通过统计和机器学习等数据驱动方法,从语⾔数据中学习,从而获得规律。在极端的数据驱动⽅方法中,甚至可以完全不使用⼈工手写语法,所有规则都是从数据中学习⽽而获得的。
语义解析是否就是正则表达式匹配或者槽位填充呢?⾃然语言具有语义组合性和递归性的特点,槽位填充实现了部分的组合性。而对于语义的递归性,不论是正则表达式匹配还是槽位填充都无法体现。
在标注数据充足的情况下,符号化语义解析是否仍有优势呢?基于神经网络的一些模型在很多特定的任务上取得了鼓舞人心的评测结果,但与语义解析框架不同的是,这些模型算法更像是太上老君的丹炉,模型的优劣是实验规律总结得到,很难得到理论上的解释性。正如张钹院士所说:“现在的人工智能没有自知之明”。
数据驱动的方法做出来的人工智能系统,是很危险的。即使对于SOTA模型,我们只知道在很大概率上,模型的结果是正确的,但我们无法确定很小概率的那部分在哪里。举例来说,对于一个简单的自然语言描述数字转换成阿拉伯数字问题,即使模型精度达到了99%,但在如票据审核这样容错率极低的场景下,即使是1%的错误率,但模型无法确定性的直接给出到底是哪 1% 是错误的,这样也会带来无法接受的后果。
总而言之,我们当然对真正的强人工智能喜闻乐见,但受限于当前的技术发展,“全心全意”地相信深度学习模型并不是一种负责任的选择,更不用说在很多场景下,由于标注数据的匮乏,可选模型乏善可陈。相比之下,语义解析似乎是我们在这个阶段上的一个局部最优解。若干年后,假使真的出现对语言理解胜于人类的智能产物,人们也不会忘记语义解析在人工智能发展的长河中浓墨重彩的一笔。
作者介绍:刘占亮 一览群智技术副总裁 
640?wx_fmt=jpeg

2007年毕业于天津大学计算机系,曾先后供职于微软亚洲研究院互联网搜索与挖掘组、腾讯搜索、搜狗号码通和百度国际化,历任研究软件工程师、研究员、资深研究员/研发负责人、资深架构师/高级技术经理,负责基础研究、产品研发、研发管理、业务推广、商业变现等方面的工作。此外,他还曾作为产品技术负责人参与创办 Hitchsters.com(named one of Time Magazine’s 50 Best Websites for 2007)和 Initialview.com。

(*本文为AI科技大本营投稿文章,转载请微信联系1092722531)


推荐阅读

  • 旷视张祥雨:高效轻量级深度模型的研究和实践 | AI ProCon 2019

  • 一份职位信息的精准推荐之旅,从AI底层架构说起

  • Uber提出损失变化分配方法LCA,揭秘神经网络“黑盒”

  • 使用Python对大脑成像数据进行可视化分析

  • 看完这篇还不会kafka,我跪榴莲!

  • 干货 | OpenCV看这篇就够了,9段代码详解图像变换基本操作

  • 横扫阿里、滴滴、美团后,阿里程序媛整理出这份厚厚的面经!

  • 谷歌称已实现量子霸权;iOS 捷径功能被诉侵权;Chrome 78 Beta 发布 | 极客头条

  • 一文读懂分片基础原理, 数据分片, 跨分片交易, 区块链分片和缩放究竟是什么鬼?

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢

相关文章:

【高级数据类型2】- 10. 接口

2019独角兽企业重金招聘Python工程师标准>>> Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干…

Linux软件包命令

2019独角兽企业重金招聘Python工程师标准>>> dpkg命令&#xff1a; dpkg -i **/**.deb 安装软件 dpkg -x **.deb 解开.deb文件 dpkg -r /-p 删除并清配置 更详细的 用dpkg --help 查询 如下&#xff1a; dpkg -i|--install <.deb 文件的文件名> ... | -R|--re…

Caffe中计算图像均值的实现(cifar10)

在深度学习中&#xff0c;在进行test时经常会减去train数据集的图像均值&#xff0c;这样做的好处是&#xff1a;属于数据预处理中的数据归一化&#xff0c;降低数据间相似性&#xff0c;可以将数值调整到一个合理的范围。以下code是用于计算cifar10中训练集的图像均值&#xf…

阿里云弹性公网IP(EIP)的使用限制

阿里云弹性公网IP&#xff08;EIP&#xff09;是一种可以独立购买和持有的公网IP地址资源&#xff0c;弹性公网IP具有独立购买持有、弹性绑定和配置灵活等优势&#xff0c;但实际使用中弹性公网IP也是有很多限制的&#xff0c;阿里云惠网分享弹性公网IP&#xff08;EIP&#xf…

400名微软员工主动曝光薪资:28万元到228万元不等!

作者 | Dave Gershgorn译者 | 弯月&#xff0c;编辑 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】近日&#xff0c;近400名微软员工分享了他们的薪酬&#xff08;从4万美元到32万美元不等&#xff0c;约为28万人民币到228万人民币&#xff09;&am…

Extjs:添加查看全部按钮

var grid new Ext.grid.GridPanel({renderTo:tsllb,title:产品成本列表,selModel:csm,height:350,columns:[csm,{header: "编码", dataIndex: "bm", sortable: true,hidden:true},{header: "产品", dataIndex: "cp", sortable: true},…

练手扎实基本功必备:非结构文本特征提取方法

作者 | Dipanjan (DJ) Sarkar编译 | ronghuaiyang来源 | AI公园&#xff08;ID:AI_Paradise&#xff09;【导读】本文介绍了一些传统但是被验证是非常有用的&#xff0c;现在都还在用的策略&#xff0c;用来对非结构化的文本数据提取特征。介绍在本文中&#xff0c;我们将研究如…

范数介绍及C++/OpenCV/Eigen的三种实现

有时我们需要衡量一个向量的大小。在机器学习中&#xff0c;我们经常使用被称为范数(norm)的函数衡量向量大小。形式上&#xff0c;Lp范数定义如下&#xff1a;范数(包括Lp范数)是将向量映射到非负值的函数。直观上来说&#xff0c;向量x的范数衡量从原点到点x的距离。更严格地…

js添加网页水印和three.js场景中加水印

我们在日常网页开发的时候&#xff0c;可能想给自己的网页或者canvas里面添加水印&#xff0c;增添个人标记&#xff0c;我这里分为普通静态html页面和threejs中3d场景里面添加水印功能。一 静态html页面添加水印你只需要在你的页面添加一个图片遮罩&#xff0c;通过绝对定位和…

JAVA学习笔记(6)

关于多线程的优先级&#xff0c;这个程序里面&#xff0c;现在计算机比较好&#xff0c;int存储不下了&#xff0c;我跑了好几次都是负分&#xff0c;特把int改成long。但是之后跑出来的结果&#xff0c;两个数字都差不多&#xff0c;不知道是什么问题&#xff1f;等待答案中。…

C++/C++11中std::deque的使用

std::deque是双端队列&#xff0c;可以高效的在头尾两端插入和删除元素&#xff0c;在std::deque两端插入和删除并不会使其它元素的指针或引用失效。在接口上和std::vector相似。与sdk::vector相反&#xff0c;std::deque中的元素并非连续存储&#xff1a;典型的实现是使用一个…

贾扬清:我对人工智能方向的一点浅见

阿里妹导读&#xff1a;作为 AI 大神&#xff0c;贾扬清让人印象深刻的可能是他写的AI框架Caffe &#xff0c;那已经是六年前的事了。经过多年的沉淀&#xff0c;成为“阿里新人”的他&#xff0c;对人工智能又有何看法&#xff1f;最近&#xff0c;贾扬清在阿里内部分享了他的…

吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 年9 月 5 日至 7 日&#xff0c;由新一代人工智能产业技术创新战略联盟&#xff08;AITISA&#xff09;指导&#xff0c;鹏城实验室、北京智源人工智能研究院支持&#xff0c;专业中文 IT 技术社区 CS…

Linux内核--网络栈实现分析(二)--数据包的传递过程--转

转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者&#xff1a;闫明 本文分析基于Linux Kernel 1.2.13 注&#xff1a;标题中的”&#xff08;上&#xff09;“&#xff0c;”&#xff08;下&#xff09;“表示分析过程基于数据包的传递方向&#xff1a;”…

C++/C++11中std::stack的使用

栈stack 是一个容器适配器(container adaptor)类型&#xff0c;被特别设计用来运行于LIFO(Last-in First-out&#xff0c;后进先出)场景&#xff0c;在该场景中&#xff0c;只能从容器末尾添加和删除元素&#xff0c;其定义在stack头文件中。stack默认基于std::deque实现&#…

团队前四次作业——个人总结

团队前四次作业——个人总结 描述 团队名称待就业六人组相关团队第四次作业答辩——反思与总结做了哪些事&#xff1f;工作量、完成度 作业负责工作量完成度团队队员展示创意合照后期1h95%项目选题报告编写创新和收益部分2h85%项目原型设计原型设计6h95%需求规格说明书功能需求…

吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义 | AI ProCon 2019

2019 年9 月 5 日至 7 日&#xff0c;由新一代人工智能产业技术创新战略联盟&#xff08;AITISA&#xff09;指导&#xff0c;鹏城实验室、北京智源人工智能研究院支持&#xff0c;专业中文 IT 技术社区 CSDN 主办的 2019 中国 AI 开发者大会&#xff08;AI ProCon 2019&#x…

MySQL基础day03_数据的导入、导出-MySQL 5.6

MySQL基础day03_数据的导入、导出-MySQL 5.6注&#xff1a;把数据按照一定格式存放到文件里才能进行数据的导入。1&#xff0c;数据导入的条件把文件里的内容保存到数据的表里&#xff1b;把数据按照一定格式存放文件里&#xff1b;注&#xff1a;默认情况下&#xff0c;只有管…

“含光”剑出,谁与争锋?阿里重磅发布首颗AI芯片含光800

作者 | 夕颜、胡巍巍 编辑 | 唐小引 出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09; 9 月末的杭州气温适宜&#xff0c;宜出游&#xff0c;宜在湖边餐厅浅酌一杯清茶消闲。但在钱塘江水支流河畔的云栖小镇&#xff0c;却完全一副与闲适氛围不相称的热闹景象。 …

c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识)

原文作者&#xff1a;aircraft 原文链接&#xff1a;https://www.cnblogs.com/DOMLX/p/10711810.html 1.类中的函数定义后加了一个const代表什么&#xff1f; 代表它将具备以下三个性质&#xff1a;1.const对象只能调用const成员函数。2.const对象的值不能被修改&#xff0c;在…

矩阵特征分解介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)

对角矩阵(diagonal matrix)&#xff1a;只在主对角线上含有非零元素&#xff0c;其它位置都是零&#xff0c;对角线上的元素可以为0或其它值。形式上&#xff0c;矩阵D是对角矩阵&#xff0c;当且仅当对于所有的i≠j, Di,j 0. 单位矩阵就是对角矩阵&#xff0c;对角元素全部是1…

Entity Framework CodeFirst数据迁移

原文:Entity Framework CodeFirst数据迁移前言 紧接着前面一篇博文Entity Framework CodeFirst尝试。 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual Studio设计视图进行更新&#xff0c;那么对于Code First如何更新已有的模型呢&…

限时早鸟票 | 2019 中国大数据技术大会(BDTC)超豪华盛宴抢先看!

2019 年12月5-7 日&#xff0c;由中国计算机学会主办&#xff0c;CCF 大数据专家委员会承办&#xff0c;CSDN、中科天玑数据科技股份有限公司协办的 2019 中国大数据技术大会&#xff0c;将于北京长城饭店隆重举行。届时&#xff0c;超过百位技术专家及行业领袖将齐聚于此&…

Google AI 系统 DeepMind无法通过 高中数学

Google 旗下 DeepMind 团队让 AI 系统接受一项高中程度的数学测试&#xff0c;结果在 40 道题目中只答对了 14 题&#xff0c;甚至连「1111111」也算错了。说来难以置信&#xff0c;Google AI 系统能打败人类世界棋王&#xff0c;却无法通过高中程度的数学考试。上周&#xff0…

C++11中std::tuple的使用

std::tuple是类似pair的模板。每个pair的成员类型都不相同&#xff0c;但每个pair都恰好有两个成员。不同std::tuple类型的成员类型也不相同&#xff0c;但一个std::tuple可以有任意数量的成员。每个确定的std::tuple类型的成员数目是固定的&#xff0c;但一个std::tuple类型的…

PHP Countable接口

实现该接口可以使用count()方法来获取集合的总数转载于:https://www.cnblogs.com/xiaodo0/p/3611307.html

矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现

奇异值分解(singular value decomposition, SVD)&#xff1a;将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过奇异值分解&#xff0c;我们会得到一些与特征分解相同类型的信息。然而&#xff0c;奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值分…

经典!工业界深度推荐系统与CTR预估必读的论文汇总

&#xff08;图片付费下载自视觉中国&#xff09;来源 | 深度传送门&#xff08;ID: gh_5faae7b50fc5&#xff09;导读&#xff1a;本文是“深度推荐系统”专栏的第十一篇文章&#xff0c;这个系列将介绍在深度学习的强力驱动下&#xff0c;给推荐系统工业界所带来的最前沿的变…

docker上传自己的镜像

https://blog.csdn.net/boonya/article/details/74906927 需要注意的就是命名规范 docker push 注册用户名/镜像名 tag命令修改为规范的镜像&#xff1a; docker tag boonya/tomcat-allow-remote boonyadocker/tomcat-allow-remote转载于:https://www.cnblogs.com/MC-Curry/p/1…

多个class相同的input标签 获取当前值!方法!

2019独角兽企业重金招聘Python工程师标准>>> var a $(this).prev( ".你的class" ).val(); 转载于:https://my.oschina.net/u/1169079/blog/210082