彩票走势图

NLP|自然语言处理-语法解析指南:算法和技术(第2部分)

原创|使用教程|编辑:郑恭琳|2017-12-28 14:48:47.000|阅读 847 次

概述:语法解析这个系列文章总共有9个部分,在第2部分中,我们将学习语法的解剖学,词法分析器结束,解析器开始,等等。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

大蓝景

紧跟第1部分,我们在谈论的“大蓝景”还未结束,所以让我们继续……

语法

形式语法是一组规则,它在语法上描述一种语言

这个定义有两个重要的部分:一个语法描述一种语言,但是这个描述只涉及语言的语法而不涉及语义。这就是说,它定义了它的结构,但不是它的意义。必要时,必须以其他方式检查输入意义的正确性。

例如,假设我们要为在第1部分中定义分析的段落中显示的语言定义语法。

HELLO: "Hello"
NAME: [a-zA-Z]+
greeting: HELLO NAME

该语法接受诸如“Hello Michael”和“Hello Programming”之类的输入。它们在语法上都是正确的,但是我们知道“Programming”不是一个名字。因此,它在语义上是错误的。语法不指定语义规则,并且它们不被解析器验证。您需要以其他方式确保提供的名称的有效性;例如,将其与有效名称的数据库进行比较。

语法解析

为了定义语法元素,我们来看一个最常用格式的例子来描述语法:Backus-Naur Form(BNF)。 这种格式有许多变种,包括Extended Backus-Naur Form。Extended类型的优点是包含一个简单的表示重复的方法。另一个值得注意的变体是Augmented Backus-Naur Form,主要用于描述双向通信协议。

Backus-Naur语法中的典型规则如下所示:

< symbol > ::= __expression__

< symbol >是一个非终端符,这意味着它可以被右边的一组元素__expression__取代。 元素__expression__可以包含其他非终端符号或终端符号。终端符号就是那些在语法中任何地方都不以< symbol >出现的符号。终端符号的典型例子是一串字符,如“你好”。

规则也可以称为生产规则。从技术上讲,它定义了非终端者与右边的非终端者和终端者之间的转换。

语法类型

解析中使用的语法主要有两种:正规文法上下文无关文法。通常对于一种语法对应同一种语言:一种正则语法定义一种正则语言等等。然而,还有一种更近期的称为解析表达语法Parsing Expression Grammar,PEG)的语法,它与上下文无关的语法同样强大,因此定义了上下文无关的语言。两者的区别在于规则的表示和解释。

正如我们已经提到的那样,这两种语言处于复杂的层次结构中——正则语言比上下文无关的语言更简单。

区分这两种语法的一个比较简单的方法是,一个正则语法的正则表达式——也就是规则的右边——可能只是其中的一个:

  • 空的字符串
  • 一个终端符号
  • 一个终端符号,后跟一个非终端符号

这是很难检查的,因为一个特定的工具可以允许在一个定义中使用更多的终端符号。然后,工具本身会自动将这个表达式转换成一系列等同的表达式,这些表达式都属于上述三种情况之一。

所以,你可以写一个与正规语言不兼容的表达式,但是表达式会以适当的形式被转换。换句话说,这个工具可以为语法写作提供语法糖(syntactic sugar)。

在稍后的一段中,我们将详细讨论不同类型的语法及其格式。

词法分析器(Lexer)

词法分析器转换一系列tokens中的一系列字符

词法分析器(Lexers)也被称为扫描仪或标记器。Lexers在解析中起到了一定的作用,因为它们将初始输入转换为适当的解析器更易于管理的形式,而解析器则是在后期工作。通常来说,词法分析器比解析器更容易编写,虽然在特殊情况下,两者都非常复杂。例如,在C的情况下(参见维基百科的)。

词法分析器的一个非常重要的工作任务是处理空白。然而大多数情况下,您希望词法分析器放弃空白。这是因为,如若不然的话,解析器将不得不检查每个单个标记之间是否存在空白,这很快就会变得很烦人。

但是在某些情况下,你不能这样做,因为空白与语言相关,就像Python用来识别代码块一样。即使在这种时候,通常情况下,词法分析器会处理将相关空白与不相关空白区分开来的问题——这意味着您希望词法分析器了解哪些空白与解析相关。例如,在解析Python时,您希望词法分析器检查空白是否在关键字if和下面的表达式(不相关)之间定义了缩进(相关)或空格。

Lexer结束,Parser开始的地方

鉴于词法分析器几乎完全与解析器一起使用,因此两者之间的分界线有时会模糊不清。这是因为解析必须产生对于程序的特定需求有用的结果。所以,解析某个东西的方法不仅仅是一个正确的方法,而且您只关心满足您需求的一种方式。

例如,假设您正在创建一个程序,该程序必须解析服务器的日志以将其保存在数据库中。为了这个目标,词法分析器将识别一系列的数字和点,并将它们转换成IPv4 token。

IPv4: [0-9]+ "." [0-9]+ "." [0-9]+ "." [0-9]+

然后,解析器将分析tokens的顺序,以确定它是否是消息、警告等。

如果您正在开发必须使用IP地址来识别访客国家的软件,会发生什么呢?也许你会希望词法分析器识别地址的八位位置以备后用,并使IPv4成为解析器元素。

DOT   : "."
OCTET : [0-9]+
 
ipv4  : OCTET DOT OCTET DOT OCTET DOT OCTET

这是由于不同的目标,如何以不同的方式解析相同的信息的一个例子。

请继续关注第3部分,我们将在其中讨论语法、语义和解析器。

本文原作者:Gabriele Tomassetti
翻译:Elyn

推荐阅读:
展望2018年:基于AI人工智能的移动应用程序开发将如何发展
开发一个聊天机器人(Chatbot)应用程序需要花费多少钱?
PS: 更多、相关视频、培训、公开课,请关注!
关于人工智能技术的最新资讯和相关开发工具推荐,请<>!

Apple加入百厂约惠

标签:算法人工智能解析器语法解析NLP自然语言处理AI

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP