知无言说,无言说故;智慧不生,有无即离。皆不可得故,自性定无。 - 佛性论前端
从早餐阅读,处处理电子邮件,再到电商购物,天天面对各类工做上的和生活中的信息,文本是咱们须要处理的最主要的数据形式,即使是图片图像等更丰富的媒体形式也不可能脱离文本单独存在。如何用计算机帮助处理这些文本的概括、理解、提炼、反馈正是天然语言处理(Natural Language Processing, NLP)要解决的问题。程序员
NLP 属于人工智能的一个子领域,相对人工智能的其余领域还很年轻。在众多人工智能处理问题的方法中大体可分红基于规则,模拟出“智能”行为;以及基于数据,让智能算法本身拟合出规则这两种方式。天然语言也能够从这两个角度处理问题,基于规则和基于数据并非不相容,两者有各自的适用范畴,而且能够搭配处理天然语言。其中基于规则的 NLP 算法能有效适用于不少方面。如考虑计算效率,基于规则的方案更有其优点。因编译原理和基于规则的 NLP 有不少技术重叠点和类似性,本文对两者作简单对比,并细数 NLP 的一些关键技术点。web
1、编译原理基础算法
编译原理成型于五六十年代;而 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 即止,另外一些编译器生成和目标机器无关的中间码(或字节码)以供运行时解释或二次编译后再执行。
这种流程只是典型的理论表述,真正的工业编译器并不严格按照前面的步骤来编译程序。但原理上对从程序到目标代码的处理过程都并没有二致。
2、天然语言的特色
使人沮丧的是,你极少在文本处理和 NLP 的书籍文档里见到用编译原理那一套文法描述方案来描述天然语言的。NLP 比编译原理发展慢 30 年,但这种滞后并非其现状不尽如人意的“因”。一个编译器的构造能够看做对“从程序语言到目标代码”这一总体过程的层次化分解,分解出的每一层要解决的子问题都不难,而且最终机器在执行目标代码时只是一台图灵机对程序这条“纸带”按逻辑步进与读写,甚至逻辑上并不比炒菜、烹饪复杂;NLP 要面对的人类天然语言因其多种多样,以及天生的模糊、歧义、隐含、无限、上下文相关等特性而难以有效处理。故 NLP 和编译原理的成熟度差距是天然语言自己就难以捉摸的“果”。
1. 天然语言的分类
曾经有古代权贵召集一堆人想修个通天的巴别塔,结果这事就由于来干活的人说不一样语言而没干成,人类天然语言的多样程度可见一斑。形态类型学根据语言的主要的形态现象把语言划分红若干组。在众多分类法中,简单基于词、词素及其特征的数量关系可作以下划分。
1.1 孤立型(isolating)或分析型(analytic)语言不包含或仅少许包含可被划分为多个词素的词(典型成员包括汉语、越南语、泰语,英语通过演化,如今已经呈现出分析型趋势)。这类语言的特色在于其通常不是经过词形变化来表达语法的做用,而是经过独立的虚词和固定的词序来表达语法意义。
1.2 综合型(synthetic)语言可在一个单词中合并多个词素,可进一步被区分为黏着语和屈折语。
1.3 黏着语(agglutinative)的词素一次只能有一个功能(如韩语、日语、芬兰语、泰米尔语等)。语法意义主要由加在词根的词缀来表示的,词缀分为前缀、中缀、后缀,常见的有前缀、后缀。
1.4 屈折语(fusional)定义为其词素特征比大于 1 的语言(如阿拉伯语、捷克语、拉丁语、梵语、德语等)。词形变化丰富,每每经过词格、性、数的变化表达不一样的语法意义。
2. 电脑和人脑的区别
人类对宇宙的奥秘已经有所了解,但对咱们本身的大脑却知之甚少。甚至很难给“智能”下一个精准的定义,更不要说评判由海量神经元基于固定理化规则表现出的高层适应性和不肯定性就算是“智能”了吗。
人脑具备感性、模糊、有抽象能力、可处理过程化事物、有情绪、会疲惫、不可预测的特质;电脑反之,具理性、精确、只作具体任务、处理离散事物、无思想情绪、只耗电不疲惫不生不死、可设计可预测的特质。当面对语言的时候,人脑能本能的应对,如处理上下文相关、歧义与拼写不规范、俚语反语潜台词、基于经验反馈循环的自我完善(即语言技巧的提升)等;而电脑擅长上下文无关、语义明确、简单直接的数据,且难以开发具备反馈完善自身处理过程的系统。
简单来讲电脑处理天然语言最大的难处是语言中普遍存在的歧义。人类语言不是孤立存在的信息,它集语音(声音处理)和文字(文本处理)为一体,并结合视觉等其余感官对世界的认识。哲学和宗教是人类对自身人性和社会性思辨的最高产物,《佛性论》中说道,“知无言说,无言说故;智慧不生,有无即离。皆不可得故,自性定无。”意思是没有心性智慧语言也无从谈起。不难大胆猜测,在 NLP 和机器视觉及其余与人类认知世界对等的人工智能可以充分搭配整合以前,孤立发展的 NLP 毫不会表现出超越或达到人类水平。
3、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 的歧义问题从分词阶段就开始引入了。如,多语言标点符号问题,好比大部分语言书面形式的疑问句和感叹句在句末加标点,但西班牙语在句前句后皆有符号。在实践当中由用户输入的文本中,标点符号多是误用最多的元素。
多语言分词问题,诚如前文所述,人类语言多种多样。汉语没有空格做自然词边界,像“北京大学生运动会”便可以分红“北京”“大学生”“运动会”,也能够分红“北京大学”“生”“运动会”,后者显然是不合理的;对于英文这种以空格自然分词的语言,“can’t”在有些方案中被分红“can”“’t”两个成分,另外一些方案中当成一个总体词;考虑韩语的词汇紧缩,及其余黏着语的状况,分词成了 NLP 的第一个重要问题……
多义词在不少语言里广泛存在,如汉语中,“特别”便可以表示副词 very (如“特别-好吃”),又能够表示形容词 special (如“吃法-特别”),这类词性、词义消歧义也是不得不考虑的问题。
不得不说阿拉伯数字是最适合数字化处理的数字表示方法。考虑语言中原生的量词、时间表示,量词、时间识别就成了分词时须要面对的另外一个问题。如汉语中能够写出“二千零一十六”,“肆拾贰”,“1斤3两”,“三点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 是更高级语言处理技术的马步功夫。
4、总结
本人才疏学浅,若有谬误欢迎指正。如今机器愈来愈像人,人愈来愈像机器,但愿这篇文字能让你从一个小的侧面,以淡然的心态认识接受人工智能,而不成为“一篇文章从入门到放弃天然语言处理”。NLP 这事很难,但正由于其难,以及现状的不尽如人意,进一步驯服它才具备意义。不是吗。
了解更多人工智能资讯长按识别或扫码关注:
微信公众号:分享最新最特别的人工智能资讯