基于Python 正则表达式的管制指令匹配与提取
2019-06-25邓学鸣
邓学鸣
(民航珠海进近管制中心,珠海 519000)
1 研究背景
Python 是一种计算机程序设计语言,也是一种动态的、面向对象的脚本语言。Python 在设计上坚持清晰划一的风格,这使得Python 成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。同时,Python 也是一种代表简单主义思想的语言,而且极其容易上手,其底层是用C 语言写的,很多标准库和第三方库也都是用C 写的,运行速度非常快。
正则表达式是计算机科学的一个概念,是对字符串(包括普通字符,例如a 到z 之间的字母)和特殊字符(称为“元字符”)操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串[1]。正则表达式的特点是灵活性、逻辑性和功能性非常强,可以迅速地用极简单的方式达到字符串的复杂控制。给定一个正则表达式和另一个字符串,可以判断给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”),也可以通过正则表达式,从字符串中获取我们想要的特定部分。
管制指令是飞行器在空中飞行的指向标,有效的管制指令确保了旅客、机组人员的生命安全,管制指挥不当可能会引发严重的飞行事故,其重要性不言而喻。尽管目前空管系统使用的内话设备有侧音功能,可以将管制员发出的话音反馈到管制员的耳机,但是在飞机流量过大的情况下,管制员发错指令或者遗忘已发出的指令的情况仍然时有发生。
本系统的主要目的是记录和分析管制员发出的每一条指令,让管制员可以清晰地掌握自己所发出的各条指令,从而提高管制指令的准确性,减少“错忘漏”的现象。对于安全管理的工作而言,本系统可以以文本的形式记录和显示管制员发出的所有指令,有利于预防各种飞行安全事故的发生,对于飞行安全事故的事后追查来说,也是一个有力的工具。
2 系统工作流程
如图1所示,管制员在管制席位上发出的指令经过语音采集模块之后会形成wav 音频文件,通过网络传输,wav 音频文件会发送到计算机,计算机通过人工智能程序将wav 音频文件转化为文本文件,再将文本文件发送给本系统,本系统会对文本文件中的管制指令进行识别和分析,进而提取出关键信息,并将关键信息显示到终端上。
图1 系统总架构图
3 管制指令识别流程
3.1 航班号的识别
列表是Python 中最常用的数据类型,它由一系列按特定顺序排列的元素组成,我们可以将任何类型的数据加入列表中,列表中的元素之间可以没有任何关系[2]。本系统在识别和分析管制指令的过程中需要用到两个列表,列表一用于存储目前正在指挥中的航班的航班号,列表二用于存储从管制指令中解析得到的各种关键信息。
管制指令虽然种类繁多,但其用语格式较为固定,如航班号+指令动作+状态[3],而且一条准确、有效的指令必定会包含一个航班号,所以本系统依据指令中是否存在一个有效的航班号来判断该指令是否有效。但有时管制员会仅用航班号的后四位数字来呼叫飞机,例如“南方5873”航班,管制员发指令时可能会直接呼叫“5873”,省略“南方”二字,这种情况下也应视为存在有效的航班号。本系统将“南方5873”这样的航班号定义为完整航班号,将“5873”这样省略“南方”二字的航班号定义为简略航班号。完整的航班号识别流程如图2所示。
利用正则表达式对指令中的航班号进行匹配,具体的代码如下:
match=re.search(r'('+st r(cn_hbh)+')d{3,4}',command)
代码中的“re.search”表示使用正则表达式的“search”方法,“cn_hbh”用于匹配航班号前面的两个中文字符;“d{3,4}”用于匹配航班号后面的数字,对于一般的航班号而言,其后面的数字一般为三位或四位,运用正则表达式可以很方便地写出对应的匹配规则;“command”为管制指令。
图2 管制指令解析流程
3.2 QNH 与QNE 的提取
利用正则表达式对指令中的QNH 和QNE 信息进行匹配,具体的代码如下:
match1 = re.search(r'标 压|标 准 气 压|标 准 大 气 压',command)
match2= re.search(r '(修正海压是?)(dd)(10d{2})|(修正海压是?)(dd)(9d{2})',
command)
match3=re .search(r'(修正海压是?)(10d{2})|(修正海压是?)(9d{2})',command)
在识别和解析管制指令中的QNH 信息时,遇到的问题主要是管制指令用语的不统一和不规范。例如,对于管制指令中的“标准大气压”来说,管制员发指令时一般会说“标压”或者“标准气压”,少数情况会说“标准大气压”。而对于管制指令用语不规范的情况,此处可以举出如下一个例子:
“南方5873下到修正海压271009。”
在此指令中,管制员把高度下降的指令“下到27”和QNH信息“修正海压1009”混合在一起,这对指令的识别带来了一定的困难。由于修正海压的数值范围一般为900至1099,本系统对此类指令的识别方法是把“修正海压”四个字与符合修正海压范围的后四个数字“1009”提取出来作为QNH 信息,中间的“27”两个数字留待下一步提取高度信息时使用。
3.3 高度信息的提取
利用正则表达式对指令中的高度信息进行匹配,具体的代码如下:
match1=re.search(r'上高?度?d 千?d?',command)
match2=re.search(r'上到高?度?d 千?d?',command)
match3=re.search(r'上升至高?度?d 千?d?',command)
match4=re.search(r'下高?度?d 千?d?',command)
match5=re.search(r'下到高?度?d 千?d?',command)
match6=re.search(r'下降至高?度?d 千?d?',command)
在识别和解析管制指令中的高度信息时,若匹配到关键字“上”,说明该指令是高度上升指令,若匹配到关键字“下”,说明该指令是高度下降指令。由于管制指令用语的不统一,管制员可能会使用“上”、“上到”、“上升至”等不同的关键字,在匹配程序中需要对各种关键字按照一定的顺序进行匹配,才能准确提取出指令中的高度信息。
另外,管制指令中的某些问候语,如“上午好”、“下午好”等,会跟关键字“上”和“下”发生冲突,在提取管制指令中的高度信息之前,要先对管制指令进行预处理,将问候语等无用信息删除,避免在提取信息时发生错误。
3.4 速度信息的提取
利用正则表达式对指令中的速度信息进行匹配,具体的代码如下:
match1=re.search(r'调速到?ddd',command)
match2=re.search(r'增速到?ddd',command)
match3=re.search(r'减速度?到?ddd',command)
match4=re.search(r'(保持)?速度ddd',command)
管制指令中,速度信息的表达有多种方式,除了以上“调速”、“增速”、“减速”、“保持速度”之外,还会出现“大速度”、“大表速”等,提取速度信息时需要分析和统计指令中出现的各种关键字,制定出相应的匹配规则,才能得到准确的速度信息。
3.5 航向信息的提取
利用正则表达式对指令中的航向信息进行匹配,具体的代码如下:
match1=re.search(r'飞?航向飞?([0-3]d[05])',command)
match2=re.search(r'飞?([0-3]d[05])',command)
match3=re.search(r'(保持)?航向先?飞?到?是?([0-3]d[05])',command)
航向的范围是0度到360度,而且管制指令中的航向信息一般只会精确到5度,在提取航向信息时,先匹配关键字“航向”,然后匹配百位数字为0至3,个位数字为0或5的三位数字,就能提取出管制指令中的航向信息。
4 结束语
本系统利用了Python 编程语言和正则表达式,制定了多条匹配规则,对管制指令中的各种关键信息进行提取。针对管制指令用语不统一、不规范的难题,利用正则表达式灵活多变的优点,对各条匹配规则进行优化和细化,提高了识别各种关键信息的成功率。本系统可以将管制员发出的管制指令进行记录与实时反馈,通过本系统,管制员可以更好地掌握已发出的指令,降低“错忘漏”的发生概率,能有效避免因管制指挥不当引发的航空不安全事件的发生。