知无言说,无言说故;智慧不生,有无即离。皆不可得故,自性定无。-佛性论
从早餐阅读,到处理电子邮件,再到电商购物,每天面对各种工作上的和生活中的信息,文本是我们需要处理的最主要的数据形式,即便是图片图像等更丰富的媒体形式也不可能脱离文本单独存在。如何用计算机帮助处理这些文本的归纳、理解、提炼、反馈正是自然语言处理(NaturalLanguageProcessing,NLP)要解决的问题。
NLP属于人工智能的一个子领域,相对人工智能的其他领域还很年轻。在众多人工智能处理问题的方法中大致可分成基于规则,模拟出“智能”行为;以及基于数据,让智能算法自己拟合出规则这两种方式。自然语言也可以从这两个角度处理问题,基于规则和基于数据并不是不相容,二者有各自的适用范畴,并且可以搭配处理自然语言。其中基于规则的NLP算法能有效适用于很多方面。如考虑计算效率,基于规则的方案更有其优势。因编译原理和基于规则的NLP有很多技术重叠点和相似性,本文对二者做简单对比,并细数NLP的一些关键技术点。
一、编译原理基础
编译原理成型于五六十年代;而NLP到八九十年代才迎来黄金年代,可谓年轻。编译原理最基础的理论并非由计算机科学家,而是由语言学家开启用来对自然语言做建模的。后来却被广泛用在编译原理中。不妨先描述一下编译原理中这部分的的关键基础知识。
1.文法表示理论
20世纪50年代中期,著名语言学家Chomsky描述了四种文法,在他的体系中,根据产生式的形式,文法被分成四类。
设文法G=(V,T,P,S),逐层增加限制,则:
1.1G叫作0型文法(type0grammar)或短语结构文法(PhraseStructureGrammar,PSG),能力相当于图灵机。
其中上下文无关文法和正则文法可用于描述程序设计语言的语法。
在Chomsky取得关于语言分类的研究成果之后不久,JohnBackus在1959年的国际会议上发表了一篇描述ALGOL58的具有里程碑意义的论文,并在其中介绍了表示程序设计语言语法的一种新的形式化标记方法。后被PeterNaur稍作修订,这种语法描述方法称为巴科斯-诺尔范式,简称BNF。
转到描述程序设计语言中表达式、语句和程序单元的动态语义(或意义)这一困难层面,目前还没有被普遍接受的其他标记方法可用来描述动态语义,尽管人们已经为描述局部规则发明了操作语义、指称语义、公理语义等。
2.从编译到执行
2.1词法分析。线性字符串to带属性的线性表示。输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如关键字、标识符、常量、运行符和分隔符等。
2.2语法分析。线性表示to抽象语法树(AbstractSyntaxTree,AST)。在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,如短语、子句、语句、程序段和程序等。通过语法分析,确定整个输入串是否构成语法上正确的程序。
2.3语义分析。ASTto中间代码。对语法分析所识别出的各类语法范畴,分析其含义,并进行中间代码生成。
2.5代码执行。目标机器对目标代码进行装载、执行。
其中不包括代码执行,之前的步骤都叫编译期,代码执行叫运行时;词法分析、语法分析负责从程序语言文本到AST的转换,称作编译器的前端,语义分析和代码生成负责从AST到目标代码的生成和优化,称作编译器的后端。在编译期,某些解释器只生成到AST即止,另一些编译器生成和目标机器无关的中间码(或字节码)以供运行时解释或二次编译后再执行。
这种流程只是典型的理论表述,真正的工业编译器并不严格按照前面的步骤来编译程序。但原理上对从程序到目标代码的处理过程都并无二致。
二、自然语言的特点
1.自然语言的分类
曾经有古代权贵召集一堆人想修个通天的巴别塔,结果这事就因为来干活的人说不同语言而没干成,人类自然语言的多样程度可见一斑。形态类型学根据语言的主要的形态现象把语言划分成若干组。在众多分类法中,简单基于词、词素及其特征的数量关系可做如下划分。
1.1孤立型(isolating)或分析型(analytic)语言不包含或仅少量包含可被划分为多个词素的词(典型成员包括汉语、越南语、泰语,英语经过演化,现在已经呈现出分析型趋势)。这类语言的特点在于其一般不是通过词形变化来表达语法的作用,而是通过独立的虚词和固定的词序来表达语法意义。
1.2综合型(synthetic)语言可在一个单词中合并多个词素,可进一步被区分为黏着语和屈折语。
1.3黏着语(agglutinative)的词素一次只能有一个功能(如韩语、日语、芬兰语、泰米尔语等)。语法意义主要由加在词根的词缀来表示的,词缀分为前缀、中缀、后缀,常见的有前缀、后缀。
1.4屈折语(fusional)定义为其词素特征比大于1的语言(如阿拉伯语、捷克语、拉丁语、梵语、德语等)。词形变化丰富,往往通过词格、性、数的变化表达不同的语法意义。
2.电脑和人脑的区别
人类对宇宙的奥秘已经有所了解,但对我们自己的大脑却知之甚少。甚至很难给“智能”下一个精准的定义,更不要说评判由海量神经元基于固定理化规则表现出的高层适应性和不确定性就算是“智能”了吗。
简单来说电脑处理自然语言最大的难处是语言中广泛存在的歧义。人类语言不是孤立存在的信息,它集语音(声音处理)和文字(文本处理)为一体,并结合视觉等其他感官对世界的认识。哲学和宗教是人类对自身人性和社会性思辨的最高产物,《佛性论》中说道,“知无言说,无言说故;智慧不生,有无即离。皆不可得故,自性定无。”意思是没有心性智慧语言也无从谈起。不难大胆猜想,在NLP和机器视觉及其他与人类认知世界对等的人工智能能够充分搭配整合之前,孤立发展的NLP绝不会表现出超越或达到人类水平。
三、NLP浅析
1.不同应用的不同侧重
1.1搜索引擎。我认为一项技术成熟的标志是它被大规模应用时,用户会把它当成自然而然的东西,不会觉得它有多特别。搜索引擎就是一个典型例子,很多NLP和其他人工智能技术手段被应用在我们每天的搜索过程中。
词性标注,即在对爬虫抓取到的文本进行处理时对词汇词性的判定,分词和词性标注是NLP的最基本处理,除搜索引擎外的其他应用场景均需要处理这两个问题。
对于目标文档,需要构建从词、句到主题的边界划分和结构表示,但是用户给出的搜索关键字未必符合其在文档中出现的顺序,因此需要乱序匹配。
对于同一件事物,有时能用几条同义词表达,比如“电脑”和“计算机”,搜索时应当把用户输入的关键字及其同义词一起考虑进来作同义词扩展。
互联网上的文档经常被转载的到处都是。采用自动将相似项分组并以摘要方式展示结果的文本聚类自动化处理是种很好的方式,这样不需要阅读所有或大部分内容就可以通读大量文本或搜索结果。
1.2问答系统。顾名思义,问答系统被设计成在提出自然语言问题的情况下以自然语言的方式给出应答。比起单纯使用关键词的搜索,问答系统更加直观,表达也更清晰。可能是NLP领域综合性最高的一种应用。
首先成熟的语义理解是任何NLP系统的关键。其次,问答不光需要整合从线性文本到结构化表示的转换,以及从结构化结果到线性文本输出的转换;为了做出令人满意的应答,还需要对客观知识的查询推理,即需要知识表达和机器推理(KnowledgeRepresentationandReasoning),对于一些没有明文表示的事实型问题,列表型问题,定义型问题,关系问题,观点问题,需要能够处理间接和隐含关系的深层的推理能力。
1.3光学字符识别(OpticalCharacterRecognition,OCR)和口语对话系统。输入的数据不再是文本。对于图像和声音,其本身相比文本更难以划分边界,到文本的转换以及在词汇层面的处理就不可能用基于规则方案。以字符序列建模的基于大量语料库数据、词向量的处理方式更适合做这类系统的前置处理。
2.问答系统处理流程
问答系统有潜力成为下一代搜索引擎,会话交互也有可能是下一代操作系统的主流形态,以NLP应用于问答系统为例,典型的处理流程分成:
分析->识别->知识查询->查询结果评分->返回->[反馈]
虽然编译原理的方法表示方法在NLP的理论资料中并不常见,但在实践中,完全可以参考BNF的方式描述句法规则,甚至以此建立各阶段的领域特定语言(DomainSpecificLanguage,DSL)。下面分别解释各阶段的详情和一些重点。
2.1知识建模。不同于只需要对文本做结构化和分类的系统,问答系统需要按自然语言输入到某个地方查询客观知识,然后给出合理应答。因此需要一种有效的对客观知识建模的数据库。
2.2分词。完成“线性to带属性标注的线性节点”的转换。
可以说NLP的歧义问题从分词阶段就开始引入了。如,多语言标点符号问题,比如大部分语言书面形式的疑问句和感叹句在句末加标点,但西班牙语在句前句后皆有符号。在实践当中由用户输入的文本中,标点符号可能是误用最多的元素。
多语言分词问题,诚如前文所述,人类语言多种多样。汉语没有空格作天然词边界,像“北京大学生运动会”即可以分成“北京”“大学生”“运动会”,也可以分成“北京大学”“生”“运动会”,后者显然是不合理的;对于英文这种以空格天然分词的语言,“can’t”在有些方案中被分成“can”“’t”两个成分,另一些方案中当成一个整体词;考虑韩语的词汇紧缩,及其他黏着语的情况,分词成了NLP的第一个重要问题……
多义词在很多语言里普遍存在,如汉语中,“特别”即可以表示副词very(如“特别-好吃”),又可以表示形容词special(如“吃法-特别”),这类词性、词义消歧义也是不得不考虑的问题。
人、地点、事物或者说名词在语言中担任重要角色。它们承载句子的主语,并且往往也承载句子的宾语,出于其重要性,在文本处理时识别并在应用中使用名词往往十分有用,该任务称命名实体识别。
对于一些会使用到专有名词的场合,中英混合数据是另一个需要处理的情况。另外,分词阶段还需要处理上文提及的同义词扩展等问题。
2.3句法分析。完成“带属性标注的线性节点to结构化”的转换。类似于编译器的语法分析阶段,NLP需要把线性数据转换成结构化数据以便后续处理。句法分析完成从带属性标注的线性节点到划分出基本语法成份的结构化表示。在下一个编译生成AST阶段,结构化表示将被进一步处理成独立于自然语言的谓词-论元结构表示。
对自然语言中的成语,以及惯用短语,往往很难用通用的句法结构表示,或表示出来对于后续处理只会徒增复杂度,因此这类词做为整体来表示。
针对现代汉语,其句法成份的顺序相对固定,经笔者实践,利用类似编译原理中的自顶向下语法分析技术就能在短语结构、短距离句式结构方面达到相当满意的效果。
依存图的主要思想是连接短语的中心词与其依存词,用有向边把中心词与依存词连接起来,依存图与短语结构树类似,是和很多不同的语言学框架一致的一种表示方法。中心词与依存词的关系可以是语义上的(中心词-修饰语),也可以是句法上的(中心词-限定语)。对于长距离的句子结构利用这项技术来帮助分析。
前文我们多次提到歧义情况,然而有些词义消歧义直到句法分析阶段才能消除,例如“给-我-讲-个-笑话”和“把-书-给-我”这两句话,前者“给”字作介词for释义,后者作动词give;还有汉语中“打”这一个动词在不同短语中能被多种解读……
需要注意的是对于计算机处理而言,严格按照语言学中对句法的分析并不一定是最高效的。汉语作为通用虚词和词序表达语义的分析语,并没有时态、语态、词格的概念,但为了处理方便,可以灵活的为语言在计算机中的表示综合利用不同语言体系的便利。如在短语层面时态识别可以用固定的规则来分析,形如“将要,动词”识别成将来时,“动词,过”识别成完成时。
对于句子边界检测,一些标点符号如逗号有时表示同等地位的语法成份间的软停顿(或间隔),而另一些时候是两个并列的句子的硬停顿。这种句边界划分的歧义到句法分析时更方便消除。
除此之外需要特别指出,在分词阶段无法消解的歧义,和在OCR、口语识别系统中无法消解的句子边界,需要在句法分析时回溯处理;而句法分析阶段也会产生新的无法消解的歧义结构,需要在后面的编译生成和语义理解阶段回溯处理,下文不再赘述。
共指消歧义与命名实体识别关系密切,包括检测某种提及的边界并有选择的确定其语义类型(如人物或组织机构)及其他属性(如名称、名词或者是代词)。对于问答系统,这种提及有可能是跨语句的,供检测用的命名实体缓存的作用类似于编译原理中的符号表。在共指消歧之后,还需要进一步的寻找实体间的语义关系,这种关系即存在于自然语言输入中,又存在于知识数据库中,影响着知识查询推理的效果。如果将关系抽取视为“分类”问题的话,亦可以用机器学习来做处理。
把说明动作或表示祈使的成分前置,主语(可能包含疑问词)和宾语随后,可以得到一种类似波兰表达式的谓词-论元结构。例如考虑由祈使成份(COMP),谓词(PRED),主语(SBJ),宾语(OBJ),助词(AUX)组成的简单表达式:
2.5AST语义理解,知识查询。对编译生成的树型AST结构进行遍历并做语义理解,并在知识数据库中抽取必要知识,做出机器推理,并生成结果AST,完成“PEthinktoPE”的过程。
如果将问答系统用于实用助手类应用场景,则可扩展查询元语,类似编程语言中的多态性,扩展出更多功能,例如天气查询、航班、股市、休闲消费的查询等。
需要注意人类语言中存在反语、委婉表达的情况,基于规则的NLP对此作用有限,识别用户的真正意图是语义理解中非常值得去突破的难点。
2.6情感处理。在试图让机器表现的尽可能像人的努力中,对语义情感的理解处理直接影响最终的人机交互体验。世界上找不到两片完全相同的叶子,受人类自身原因的影响,不同文化背景、成长经历的人的情感表达和理解习惯,以及应对模式完全不一样。因此从词性标注到基于语料库的处理,依然只能有限处理情感分析。对于问答系统以外的情况,如跨段落、多文档的时候,更加大了情感分析的难度。
2.7应答AST生成。完成“PEto结构化”的转换。AST语义理解,知识查询可以说是NLP问答系统中枢的中枢,情感处理是它的辅助。在这一步得到等待输出的PEAST结构时处理流程就是语义理解之前的逆过程。
这一步的难点是自然语言中的惯用法,如汉语中修饰名词间是否加助词“的”(“机械-键盘”vs.“程序员-的-品味”),介词意from的表达方法(“由from-心-而-生”vs.“从from-现在-开始”),动词do的表达方法(“打do-酱油”vs.“做do-事情”)……
2.8应答拼装。完成“结构化to线性”的转换。最终,结构化的表示处理成线性表示,最终生成输出文本。作为扩展,利用语料库数据可以对线性串做进一步的润色处理。
除了上述要点,另一些扩展技术对NLP的效果具有不可忽视的助益。比如如何合理表示和高效输入领域特定知识;从web上自动抓取知识并扩充知识数据库;为提升应答满意度问答系统的自我反馈、学习等等。
可以看出对语言文本的分词、句法分析、语义理解和编译器的前端大致相同,也可以用类似的工程手段实现,不妨称这一部分为NLP问答系统的前端(以下简称前端)。除问答系统,机器翻译、自动文摘、舆情分析(情感分析)和口语对话亦可共用类似的前端。这些系统不一定需要对客观知识的深层推理,也不一定要求用自然语言做输出,而知识查询及后面的部分则是NLP问答系统所特有的,这部分超出了和编译原理的对比范畴,稍后我将另写一篇描述我实现的一种问答系统,包括一些实践细节。
和编译器一样,NLP也是一个环环相扣的处理流程。由于自然语言的不规则性,歧义性,能产性,其文法不可能用有限规则描述出来,且对歧义的失误处理会在后续环节被放大;但是基于规则的NLP依然可以高效处理足量的自然语言问题,并且可作为和其他人工智能算法搭配使用的必要组成部分。基于规则的NLP是更高级语言处理技术的马步功夫。