自然语言处理和编译器的对比

知无言说无言说故智慧不生有无即离。皆不可得故自性定无。 - 佛性论

 

从早餐阅读,到处理电子邮件,再到电商购物,每天面对各种工作上的和生活中的信息,文本是我们需要处理的最主要的数据形式,即便是图片图像等更丰富的媒体形式也不可能脱离文本单独存在。如何用计算机帮助处理这些文本的归纳、理解、提炼、反馈正是自然语言处理(Natural Language Processing, NLP)要解决的问题。

NLP 属于人工智能的一个子领域,相对人工智能的其他领域还很年轻。在众多人工智能处理问题的方法中大致可分成基于规则,模拟出“智能”行为;以及基于数据,让智能算法自己拟合出规则这两种方式。自然语言也可以从这两个角度处理问题,基于规则和基于数据并不是不相容,二者有各自的适用范畴,并且可以搭配处理自然语言。其中基于规则的 NLP 算法能有效适用于很多方面。如考虑计算效率,基于规则的方案更有其优势。因编译原理和基于规则的 NLP 有很多技术重叠点和相似性,本文对二者做简单对比,并细数 NLP 的一些关键技术点。

 

一、编译原理基础

编译原理成型于五六十年代;而 NLP 到八九十年代才迎来黄金年代,可谓年轻。编译原理最基础的理论并非由计算机科学家,而是由语言学家开启用来对自然语言做建模的。后来却被广泛用在编译原理中。不妨先描述一下编译原理中这部分的的关键基础知识。

 

1. 文法表示理论

20 世纪 50 年代中期,著名语言学家 Chomsky 描述了四种文法,在他的体系中,根据产生式的形式,文法被分成四类。

设文法 G = (V, T, P, S),逐层增加限制,则:

1.1 G 叫作 0 型文法(type 0 grammar)或短语结构文法(Phrase Structure Grammar, PSG),能力相当于图灵机。

1.2 如果对于,均有成立,则称 G 1 型文法(type 1 grammar)即上下文有关文法(Context Sensitive Grammar, CSG)。

1.3 如果对于,均有,并且成立,则称 G 2 型文法(type 2 grammar)即上下文无关文法(Context Free Grammar, CFG)。

1.4 如果对于均具有形式,其中,则称 G 3 型文法(type 3 grammar)即正则文法(Regular Grammar, RG)。

其中上下文无关文法和正则文法可用于描述程序设计语言的语法。

在 Chomsky 取得关于语言分类的研究成果之后不久,John Backus 1959 年的国际会议上发表了一篇描述 ALGOL 58 的具有里程碑意义的论文,并在其中介绍了表示程序设计语言语法的一种新的形式化标记方法。后被 Peter Naur 稍作修订,这种语法描述方法称为巴科斯-诺尔范式,简称 BNF

然而有些程序设计语言的结构特点很难用 BNF 描述,有些根本无法描述。类型兼容性规则就是用 BNF 很难表示的语法规则的一个例子。例如在 Java 中浮点值不能赋值给整型变量,而反过来却是可以的。虽然这个限制可以用 BNF 表示,但是需要额外的非终结符和规则。如果 Java 所有的类型规则都有 BNF 来表示,文法将变得太大而无法使用,因为方法规模的大小决定的语法分析器的大小。作为 BNF 无法表示的语法规则的一个例子,考虑所有变量必须在引用前先声明这一常见规则。人们已经证明,这条规则无法用 BNF 来表示。于是为了完整有效的描述这种静态语义,人们发明了属性文法。另外,属性文法还用于自然语言的处理系统。

转到描述程序设计语言中表达式、语句和程序单元的动态语义(或意义)这一困难层面,目前还没有被普遍接受的其他标记方法可用来描述动态语义,尽管人们已经为描述局部规则发明了操作语义、指称语义、公理语义等。

 

2. 从编译到执行

2.1 词法分析。线性字符串 to 带属性的线性表示。输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如关键字、标识符、常量、运行符和分隔符等。

2.2 语法分析。线性表示 to 抽象语法树(Abstract Syntax Tree, AST。在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,如短语、子句、语句、程序段和程序等。通过语法分析,确定整个输入串是否构成语法上正确的程序。

2.3 语义分析。AST to 中间代码。对语法分析所识别出的各类语法范畴,分析其含义,并进行中间代码生成。

2.4 代码生成。中间代码 to 目标代码。由中间代码生成目标代码,并进行必要的加工变换,以期在最后阶段能产生出(在空间上或时间上)更为高效的目标代码。

2.5 代码执行。目标机器对目标代码进行装载、执行。

其中不包括代码执行,之前的步骤都叫编译期,代码执行叫运行时;词法分析、语法分析负责从程序语言文本到 AST 的转换,称作编译器的前端,语义分析和代码生成负责从 AST 到目标代码的生成和优化,称作编译器的后端。在编译期,某些解释器只生成到 AST 即止,另一些编译器生成和目标机器无关的中间码(或字节码)以供运行时解释或二次编译后再执行。

这种流程只是典型的理论表述,真正的工业编译器并不严格按照前面的步骤来编译程序。但原理上对从程序到目标代码的处理过程都并无二致。

 

二、自然语言的特点

令人沮丧的是,你极少在文本处理和 NLP 的书籍文档里见到用编译原理那一套文法描述方案来描述自然语言的。NLP 比编译原理发展慢 30 年,但这种滞后并不是其现状不尽如人意的“因”。一个编译器的构造可以看作对“从程序语言到目标代码”这一整体过程的层次化分解,分解出的每一层要解决的子问题都不难,并且最终机器在执行目标代码时只是一台图灵机对程序这条“纸带”按逻辑步进与读写,甚至逻辑上并不比炒菜、烹饪复杂;NLP 要面对的人类自然语言因其多种多样,以及天生的模糊、歧义、隐含、无限、上下文相关等特性而难以有效处理。故 NLP 和编译原理的成熟度差距是自然语言本身就难以捉摸的“果”。

 

1. 自然语言的分类

曾经有古代权贵召集一堆人想修个通天的巴别塔,结果这事就因为来干活的人说不同语言而没干成,人类自然语言的多样程度可见一斑。形态类型学根据语言的主要的形态现象把语言划分成若干组。在众多分类法中,简单基于词、词素及其特征的数量关系可做如下划分。

1.1 孤立型isolating)或分析型analytic)语言不包含或仅少量包含可被划分为多个词素的词(典型成员包括汉语、越南语、泰语,英语经过演化,现在已经呈现出分析型趋势)。这类语言的特点在于其一般不是通过词形变化来表达语法的作用,而是通过独立的虚词和固定的词序来表达语法意义。

1.2 综合型synthetic)语言可在一个单词中合并多个词素,可进一步被区分为黏着语和屈折语。

1.3 黏着语agglutinative)的词素一次只能有一个功能(如韩语、日语、芬兰语、泰米尔语等)。语法意义主要由加在词根的词缀来表示的,词缀分为前缀、中缀、后缀,常见的有前缀、后缀。

1.4 屈折语fusional)定义为其词素特征比大于 1 的语言(如阿拉伯语、捷克语、拉丁语、梵语、德语等)。词形变化丰富,往往通过词格、性、数的变化表达不同的语法意义。

 

2. 电脑和人脑的区别

人类对宇宙的奥秘已经有所了解,但对我们自己的大脑却知之甚少。甚至很难给“智能”下一个精准的定义,更不要说评判由海量神经元基于固定理化规则表现出的高层适应性和不确定性就算是“智能”了吗。

人脑具有感性、模糊、有抽象能力、可处理过程化事物、有情绪、会疲惫、不可预测的特质;电脑反之,具理性、精确、只做具体任务、处理离散事物、无思想情绪、只耗电不疲惫不生不死、可设计可预测的特质。当面对语言的时候,人脑能本能的应对,如处理上下文相关、歧义与拼写不规范、俚语反语潜台词、基于经验反馈循环的自我完善(即语言技巧的提高)等;而电脑擅长上下文无关、语义明确、简单直接的数据,且难以开发具有反馈完善自身处理过程的系统。

简单来说电脑处理自然语言最大的难处是语言中广泛存在的歧义。人类语言不是孤立存在的信息,它集语音(声音处理)和文字(文本处理)为一体,并结合视觉等其他感官对世界的认识。哲学和宗教是人类对自身人性和社会性思辨的最高产物,《佛性论》中说道,“知无言说,无言说故;智慧不生,有无即离。皆不可得故,自性定无。”意思是没有心性智慧语言也无从谈起。不难大胆猜想,在 NLP 和机器视觉及其他与人类认知世界对等的人工智能能够充分搭配整合之前,孤立发展的 NLP 绝不会表现出超越或达到人类水平。

 

三、NLP 浅析

对人类而言,在对话或文章中提取出感兴趣的含义包含深度抽象、综合以及常识的应用三个过程。对软件而言,它也同样需要做类似的处理。下面分别谈谈面对不同应用场景时 NLP 的侧重点,以及一种利用 NLP 技术的问答系统实践。

 

1. 不同应用的不同侧重

1.1 搜索引擎。我认为一项技术成熟的标志是它被大规模应用时,用户会把它当成自然而然的东西,不会觉得它有多特别。搜索引擎就是一个典型例子,很多 NLP 和其他人工智能技术手段被应用在我们每天的搜索过程中。

词性标注,即在对爬虫抓取到的文本进行处理时对词汇词性的判定,分词和词性标注是 NLP 的最基本处理,除搜索引擎外的其他应用场景均需要处理这两个问题。

对于目标文档,需要构建从词、句到主题的边界划分和结构表示,但是用户给出的搜索关键字未必符合其在文档中出现的顺序,因此需要乱序匹配

对于同一件事物,有时能用几条同义词表达,比如“电脑”和“计算机”,搜索时应当把用户输入的关键字及其同义词一起考虑进来作同义词扩展

互联网上的文档经常被转载的到处都是。采用自动将相似项分组并以摘要方式展示结果的文本聚类自动化处理是种很好的方式,这样不需要阅读所有或大部分内容就可以通读大量文本或搜索结果。

1.2 问答系统。顾名思义,问答系统被设计成在提出自然语言问题的情况下以自然语言的方式给出应答。比起单纯使用关键词的搜索,问答系统更加直观,表达也更清晰。可能是 NLP 领域综合性最高的一种应用。

首先成熟的语义理解是任何 NLP 系统的关键。其次,问答不光需要整合从线性文本到结构化表示的转换,以及从结构化结果到线性文本输出的转换;为了做出令人满意的应答,还需要对客观知识的查询推理,即需要知识表达机器推理(Knowledge Representation and Reasoning),对于一些没有明文表示的事实型问题列表型问题定义型问题关系问题观点问题,需要能够处理间接和隐含关系的深层的推理能力。

1.3 光学字符识别(Optical Character Recognition, OCR)和口语对话系统。输入的数据不再是文本。对于图像和声音,其本身相比文本更难以划分边界,到文本的转换以及在词汇层面的处理就不可能用基于规则方案。以字符序列建模的基于大量语料库数据、词向量的处理方式更适合做这类系统的前置处理。

 

2. 问答系统处理流程

问答系统有潜力成为下一代搜索引擎,会话交互也有可能是下一代操作系统的主流形态, NLP 应用于问答系统为例,典型的处理流程分成:

分析 -> 识别 -> 知识查询 -> 查询结果评分 -> 返回 -> [反馈]

虽然编译原理的方法表示方法在 NLP 的理论资料中并不常见,但在实践中,完全可以参考 BNF 的方式描述句法规则,甚至以此建立各阶段的领域特定语言(Domain Specific Language, DSL)。下面分别解释各阶段的详情和一些重点。

2.1 知识建模不同于只需要对文本做结构化和分类的系统,问答系统需要按自然语言输入到某个地方查询客观知识,然后给出合理应答。因此需要一种有效的对客观知识建模的数据库。

2.2 分词完成“线性 to 带属性标注的线性节点”的转换。

可以说 NLP 的歧义问题从分词阶段就开始引入了。如,多语言标点符号问题,比如大部分语言书面形式的疑问句和感叹句在句末加标点,但西班牙语在句前句后皆有符号。在实践当中由用户输入的文本中,标点符号可能是误用最多的元素。

多语言分词问题,诚如前文所述,人类语言多种多样。汉语没有空格作天然词边界,像“北京大学生运动会”即可以分成“北京”“大学生”“运动会”,也可以分成“北京大学”“生”“运动会”,后者显然是不合理的;对于英文这种以空格天然分词的语言,“cant”在有些方案中被分成“can”“t”两个成分,另一些方案中当成一个整体词;考虑韩语的词汇紧缩,及其他黏着语的情况,分词成了 NLP 的第一个重要问题……

多义词在很多语言里普遍存在,如汉语中,“特别”即可以表示副词 very (如“特别-好吃”),又可以表示形容词 special (如“吃法-特别”),这类词性、词义消歧义也是不得不考虑的问题。

不得不说阿拉伯数字是最适合数字化处理的数字表示方法。考虑语言中原生的量词、时间表示,量词、时间识别就成了分词时需要面对的另一个问题。如汉语中可以写出“二千零一十六”,“肆拾贰”,“13两”,“三点14”,“两点半”…… NLP 需要正确处理各种花样量词、时间写法,特别说明,其中又存在一些歧义字,如“米”即可指粮食又可指长度单位;“两”即是数字 2 又是重量单位;“号”即是 number 的意思又可以是日期的意思……

人、地点、事物或者说名词在语言中担任重要角色。它们承载句子的主语,并且往往也承载句子的宾语,出于其重要性,在文本处理时识别并在应用中使用名词往往十分有用,该任务称命名实体识别

对于一些会使用到专有名词的场合,中英混合数据是另一个需要处理的情况。另外,分词阶段还需要处理上文提及的同义词扩展等问题

2.3 句法分析。完成“带属性标注的线性节点 to 结构化”的转换。类似于编译器的语法分析阶段,NLP 需要把线性数据转换成结构化数据以便后续处理。句法分析完成从带属性标注的线性节点到划分出基本语法成份的结构化表示。在下一个编译生成 AST 阶段,结构化表示将被进一步处理成独立于自然语言的谓词-论元结构表示。

对自然语言中的成语,以及惯用短语,往往很难用通用的句法结构表示,或表示出来对于后续处理只会徒增复杂度,因此这类词做为整体来表示。

针对现代汉语,其句法成份的顺序相对固定,经笔者实践,利用类似编译原理中的自顶向下语法分析技术就能在短语结构、短距离句式结构方面达到相当满意的效果。

依存图的主要思想是连接短语的中心词与其依存词,用有向边把中心词与依存词连接起来,依存图与短语结构树类似,是和很多不同的语言学框架一致的一种表示方法。中心词与依存词的关系可以是语义上的(中心词-修饰语),也可以是句法上的(中心词-限定语)。对于长距离的句子结构利用这项技术来帮助分析。

前文我们多次提到歧义情况,然而有些词义消歧义直到句法分析阶段才能消除,例如“给----笑话”和“把---我”这两句话,前者“给”字作介词 for 释义,后者作动词 give;还有汉语中“打”这一个动词在不同短语中能被多种解读……

需要注意的是对于计算机处理而言,严格按照语言学中对句法的分析并不一定是最高效的。汉语作为通用虚词和词序表达语义的分析语,并没有时态、语态、词格的概念,但为了处理方便,可以灵活的为语言在计算机中的表示综合利用不同语言体系的便利。如在短语层面时态识别可以用固定的规则来分析,形如“将要, 动词”识别成将来时,“动词, 过”识别成完成时。

对于句子边界检测,一些标点符号如逗号有时表示同等地位的语法成份间的软停顿(或间隔),而另一些时候是两个并列的句子的硬停顿。这种句边界划分的歧义到句法分析时更方便消除。

除此之外需要特别指出,在分词阶段无法消解的歧义,和在 OCR、口语识别系统中无法消解的句子边界,需要在句法分析时回溯处理;而句法分析阶段也会产生新的无法消解的歧义结构,需要在后面的编译生成和语义理解阶段回溯处理,下文不再赘述。

共指消歧义与命名实体识别关系密切,包括检测某种提及的边界并有选择的确定其语义类型(如人物或组织机构)及其他属性(如名称、名词或者是代词)。对于问答系统,这种提及有可能是跨语句的,供检测用的命名实体缓存的作用类似于编译原理中的符号表。在共指消歧之后,还需要进一步的寻找实体间的语义关系,这种关系即存在于自然语言输入中,又存在于知识数据库中,影响着知识查询推理的效果。如果将关系抽取视为“分类”问题的话,亦可以用机器学习来做处理。

2.4 编译生成 AST完成“结构化 to 波兰表达式(Polish Expression, PE)”的转换。句法分析的输出虽然已经转换成了结构化表示,但其节点顺序依然和原始自然语言相关。为了后续内部处理的统一性,我们有必要把它转换成和具体自然语言无关的表示方式。

把说明动作或表示祈使的成分前置,主语(可能包含疑问词)宾语随后,可以得到一种类似波兰表达式的谓词-论元结构。例如考虑由祈使成份(COMP),谓词(PRED),主语(SBJ),宾语(OBJ),助词(AUX)组成的简单表达式:

  • (PRED, SBJ, OBJ, [AUX])

  • (PRED, SBJ, [AUX])

  • (COMP, PRED, SBJ, OBJ, [AUX])

  • (COMP, PRED, SBJ, [AUX])

2.5 AST 语义理解,知识查询。对编译生成的树型 AST 结构进行遍历并做语义理解,并在知识数据库中抽取必要知识,做出机器推理,并生成结果 AST,完成“PE think to PE”的过程。

这一步的输入是上一步编译出来的 PE AST,输出也是用同一套规范表达的 PE AST。和软件工程中的其他数据库类似,我们可以对客观世界的对象做建模处理,在这一步中一个语句即一条查询,而每条查询可以对应一组查询元语的组合。具体实现细节将在另一篇文章中解释,这里仅举例一部分笔者在实践中用到的查询元语:

  • SELECT:后跟一串对象关系路径参数,以此在数据库中查询对象细节

  • COMPARE:用于多个对象的比较查询和关系查询,如“iOS 和 Android 哪个好用”,“成都到北京有多远”

  • DECLARE:对于用户输入的陈述句用声明(declare)处理,实践中会维护一个和会话用户对应的数据库,此元语对一条声明做简单的真假判断,并存储到会话数据库中

  • IMPETRATE:供祈使句处理使用,一些情况中此元语仅充当其他元语的前置语气,并无实际逻辑作用,如“告诉我月亮离地球有多远”,实际是对地月距离的 COMPARE;另一些则以祈使句为主体,如“给我唱首歌”,“讲个笑话”

  • EXTRACT:在元语搭配中,EXTRACT 以其他元语查询的结果为中间数据,进一步抽取出细节作为结果

如果将问答系统用于实用助手类应用场景,则可扩展查询元语,类似编程语言中的多态性,扩展出更多功能,例如天气查询、航班、股市、休闲消费的查询等。

需要注意人类语言中存在反语委婉表达的情况,基于规则的 NLP 对此作用有限,识别用户的真正意图是语义理解中非常值得去突破的难点。

2.6 情感处理。在试图让机器表现的尽可能像人的努力中,对语义情感的理解处理直接影响最终的人机交互体验。世界上找不到两片完全相同的叶子,受人类自身原因的影响,不同文化背景、成长经历的人的情感表达和理解习惯,以及应对模式完全不一样。因此词性标注到基于语料库的处理,依然只能有限处理情感分析。对于问答系统以外的情况,如跨段落、多文档的时候,更加大了情感分析的难度。

2.7 应答 AST 生成。完成“PE to 结构化”的转换。AST 语义理解,知识查询可以说是 NLP 问答系统中枢的中枢,情感处理是它的辅助。在这一步得到等待输出的 PE AST 结构时处理流程就是语义理解之前的逆过程。

使用和自然语言无关的 AST 表示方法的好处现在就体现出来了。在应答 AST 生成这一步里,将 PE AST 生成和具体自然语言相关的 AST 表示方法,这种流程可以便于开发“A 语言进,B 语言出”,如果把语义理解简化掉一部分,就可以达到基本的机器翻译的要求。

这一步的难点是自然语言中的惯用法,如汉语中修饰名词间是否加助词“的”(“机械-键盘” vs. “程序员--品味”),介词意 from 的表达方法(“由from---生” vs. “从from-现在-开始”),动词 do 的表达方法(“打do-酱油” vs. “做do-事情”)……

2.8 应答拼装。完成“结构化 to 线性”的转换。最终,结构化的表示处理成线性表示,最终生成输出文本。作为扩展,利用语料库数据可以对线性串做进一步的润色处理。

除了上述要点,另一些扩展技术对 NLP 的效果具有不可忽视的助益。比如如何合理表示和高效输入领域特定知识;从 web 自动抓取知识并扩充知识数据库;为提升应答满意度问答系统的自我反馈学习等等。

可以看出对语言文本的分词、句法分析、语义理解和编译器的前端大致相同,也可以用类似的工程手段实现,不妨称这一部分为 NLP 问答系统的前端(以下简称前端)。除问答系统,机器翻译自动文摘舆情分析(情感分析)和口语对话亦可共用类似的前端。这些系统不一定需要对客观知识的深层推理,也不一定要求用自然语言做输出,而知识查询及后面的部分则是 NLP 问答系统所特有的,这部分超出了和编译原理的对比范畴,稍后我将另写一篇描述我实现的一种问答系统,包括一些实践细节。

和编译器一样,NLP 也是一个环环相扣的处理流程。由于自然语言的不规则性,歧义性,能产性,其文法不可能用有限规则描述出来,且对歧义的失误处理会在后续环节被放大;但是基于规则的 NLP 依然可以高效处理足量的自然语言问题,并且可作为和其他人工智能算法搭配使用的必要组成部分。基于规则的 NLP 是更高级语言处理技术的马步功夫。

 

四、总结

本人才疏学浅,如有谬误欢迎指正。现在机器越来越像人,人越来越像机器,希望这篇文字能让你从一个小的侧面,以淡然的心态认识接受人工智能,而不成为“一篇文章从入门到放弃自然语言处理”。NLP 这事很难,但正因为其难,以及现状的不尽如人意,进一步驯服它才具有意义。不是吗。


 

了解更多人工智能资讯长按识别或扫码关注:


微信公众号:分享最新最特别的人工智能资讯

 

posted on 2016-11-18 19:46  扑来树袋熊  阅读(2656)  评论(0编辑  收藏  举报

导航