鄧學(xué)鳴
(民航珠海進(jìn)近管制中心,珠海 519000)
Python 是一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,也是一種動(dòng)態(tài)的、面向?qū)ο蟮哪_本語(yǔ)言。Python 在設(shè)計(jì)上堅(jiān)持清晰劃一的風(fēng)格,這使得Python 成為一門易讀、易維護(hù),并且被大量用戶所歡迎的、用途廣泛的語(yǔ)言。同時(shí),Python 也是一種代表簡(jiǎn)單主義思想的語(yǔ)言,而且極其容易上手,其底層是用C 語(yǔ)言寫的,很多標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)也都是用C 寫的,運(yùn)行速度非常快。
正則表達(dá)式是計(jì)算機(jī)科學(xué)的一個(gè)概念,是對(duì)字符串(包括普通字符,例如a 到z 之間的字母)和特殊字符(稱為“元字符”)操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。正則表達(dá)式是一種文本模式,模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串[1]。正則表達(dá)式的特點(diǎn)是靈活性、邏輯性和功能性非常強(qiáng),可以迅速地用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制。給定一個(gè)正則表達(dá)式和另一個(gè)字符串,可以判斷給定的字符串是否符合正則表達(dá)式的過(guò)濾邏輯(稱作“匹配”),也可以通過(guò)正則表達(dá)式,從字符串中獲取我們想要的特定部分。
管制指令是飛行器在空中飛行的指向標(biāo),有效的管制指令確保了旅客、機(jī)組人員的生命安全,管制指揮不當(dāng)可能會(huì)引發(fā)嚴(yán)重的飛行事故,其重要性不言而喻。盡管目前空管系統(tǒng)使用的內(nèi)話設(shè)備有側(cè)音功能,可以將管制員發(fā)出的話音反饋到管制員的耳機(jī),但是在飛機(jī)流量過(guò)大的情況下,管制員發(fā)錯(cuò)指令或者遺忘已發(fā)出的指令的情況仍然時(shí)有發(fā)生。
本系統(tǒng)的主要目的是記錄和分析管制員發(fā)出的每一條指令,讓管制員可以清晰地掌握自己所發(fā)出的各條指令,從而提高管制指令的準(zhǔn)確性,減少“錯(cuò)忘漏”的現(xiàn)象。對(duì)于安全管理的工作而言,本系統(tǒng)可以以文本的形式記錄和顯示管制員發(fā)出的所有指令,有利于預(yù)防各種飛行安全事故的發(fā)生,對(duì)于飛行安全事故的事后追查來(lái)說(shuō),也是一個(gè)有力的工具。
如圖1所示,管制員在管制席位上發(fā)出的指令經(jīng)過(guò)語(yǔ)音采集模塊之后會(huì)形成wav 音頻文件,通過(guò)網(wǎng)絡(luò)傳輸,wav 音頻文件會(huì)發(fā)送到計(jì)算機(jī),計(jì)算機(jī)通過(guò)人工智能程序?qū)av 音頻文件轉(zhuǎn)化為文本文件,再將文本文件發(fā)送給本系統(tǒng),本系統(tǒng)會(huì)對(duì)文本文件中的管制指令進(jìn)行識(shí)別和分析,進(jìn)而提取出關(guān)鍵信息,并將關(guān)鍵信息顯示到終端上。
圖1 系統(tǒng)總架構(gòu)圖
列表是Python 中最常用的數(shù)據(jù)類型,它由一系列按特定順序排列的元素組成,我們可以將任何類型的數(shù)據(jù)加入列表中,列表中的元素之間可以沒(méi)有任何關(guān)系[2]。本系統(tǒng)在識(shí)別和分析管制指令的過(guò)程中需要用到兩個(gè)列表,列表一用于存儲(chǔ)目前正在指揮中的航班的航班號(hào),列表二用于存儲(chǔ)從管制指令中解析得到的各種關(guān)鍵信息。
管制指令雖然種類繁多,但其用語(yǔ)格式較為固定,如航班號(hào)+指令動(dòng)作+狀態(tài)[3],而且一條準(zhǔn)確、有效的指令必定會(huì)包含一個(gè)航班號(hào),所以本系統(tǒng)依據(jù)指令中是否存在一個(gè)有效的航班號(hào)來(lái)判斷該指令是否有效。但有時(shí)管制員會(huì)僅用航班號(hào)的后四位數(shù)字來(lái)呼叫飛機(jī),例如“南方5873”航班,管制員發(fā)指令時(shí)可能會(huì)直接呼叫“5873”,省略“南方”二字,這種情況下也應(yīng)視為存在有效的航班號(hào)。本系統(tǒng)將“南方5873”這樣的航班號(hào)定義為完整航班號(hào),將“5873”這樣省略“南方”二字的航班號(hào)定義為簡(jiǎn)略航班號(hào)。完整的航班號(hào)識(shí)別流程如圖2所示。
利用正則表達(dá)式對(duì)指令中的航班號(hào)進(jìn)行匹配,具體的代碼如下:
match=re.search(r'('+st r(cn_hbh)+')d{3,4}',command)
代碼中的“re.search”表示使用正則表達(dá)式的“search”方法,“cn_hbh”用于匹配航班號(hào)前面的兩個(gè)中文字符;“d{3,4}”用于匹配航班號(hào)后面的數(shù)字,對(duì)于一般的航班號(hào)而言,其后面的數(shù)字一般為三位或四位,運(yùn)用正則表達(dá)式可以很方便地寫出對(duì)應(yīng)的匹配規(guī)則;“command”為管制指令。
圖2 管制指令解析流程
利用正則表達(dá)式對(duì)指令中的QNH 和QNE 信息進(jìn)行匹配,具體的代碼如下:
match1 = re.search(r'標(biāo) 壓|標(biāo) 準(zhǔn) 氣 壓|標(biāo) 準(zhǔn) 大 氣 壓',command)
match2= re.search(r '(修正海壓是?)(dd)(10d{2})|(修正海壓是?)(dd)(9d{2})',
command)
match3=re .search(r'(修正海壓是?)(10d{2})|(修正海壓是?)(9d{2})',command)
在識(shí)別和解析管制指令中的QNH 信息時(shí),遇到的問(wèn)題主要是管制指令用語(yǔ)的不統(tǒng)一和不規(guī)范。例如,對(duì)于管制指令中的“標(biāo)準(zhǔn)大氣壓”來(lái)說(shuō),管制員發(fā)指令時(shí)一般會(huì)說(shuō)“標(biāo)壓”或者“標(biāo)準(zhǔn)氣壓”,少數(shù)情況會(huì)說(shuō)“標(biāo)準(zhǔn)大氣壓”。而對(duì)于管制指令用語(yǔ)不規(guī)范的情況,此處可以舉出如下一個(gè)例子:
“南方5873下到修正海壓271009?!?/p>
在此指令中,管制員把高度下降的指令“下到27”和QNH信息“修正海壓1009”混合在一起,這對(duì)指令的識(shí)別帶來(lái)了一定的困難。由于修正海壓的數(shù)值范圍一般為900至1099,本系統(tǒng)對(duì)此類指令的識(shí)別方法是把“修正海壓”四個(gè)字與符合修正海壓范圍的后四個(gè)數(shù)字“1009”提取出來(lái)作為QNH 信息,中間的“27”兩個(gè)數(shù)字留待下一步提取高度信息時(shí)使用。
利用正則表達(dá)式對(duì)指令中的高度信息進(jìn)行匹配,具體的代碼如下:
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)
在識(shí)別和解析管制指令中的高度信息時(shí),若匹配到關(guān)鍵字“上”,說(shuō)明該指令是高度上升指令,若匹配到關(guān)鍵字“下”,說(shuō)明該指令是高度下降指令。由于管制指令用語(yǔ)的不統(tǒng)一,管制員可能會(huì)使用“上”、“上到”、“上升至”等不同的關(guān)鍵字,在匹配程序中需要對(duì)各種關(guān)鍵字按照一定的順序進(jìn)行匹配,才能準(zhǔn)確提取出指令中的高度信息。
另外,管制指令中的某些問(wèn)候語(yǔ),如“上午好”、“下午好”等,會(huì)跟關(guān)鍵字“上”和“下”發(fā)生沖突,在提取管制指令中的高度信息之前,要先對(duì)管制指令進(jìn)行預(yù)處理,將問(wèn)候語(yǔ)等無(wú)用信息刪除,避免在提取信息時(shí)發(fā)生錯(cuò)誤。
利用正則表達(dá)式對(duì)指令中的速度信息進(jìn)行匹配,具體的代碼如下:
match1=re.search(r'調(diào)速到?ddd',command)
match2=re.search(r'增速到?ddd',command)
match3=re.search(r'減速度?到?ddd',command)
match4=re.search(r'(保持)?速度ddd',command)
管制指令中,速度信息的表達(dá)有多種方式,除了以上“調(diào)速”、“增速”、“減速”、“保持速度”之外,還會(huì)出現(xiàn)“大速度”、“大表速”等,提取速度信息時(shí)需要分析和統(tǒng)計(jì)指令中出現(xiàn)的各種關(guān)鍵字,制定出相應(yīng)的匹配規(guī)則,才能得到準(zhǔn)確的速度信息。
利用正則表達(dá)式對(duì)指令中的航向信息進(jìn)行匹配,具體的代碼如下:
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度,而且管制指令中的航向信息一般只會(huì)精確到5度,在提取航向信息時(shí),先匹配關(guān)鍵字“航向”,然后匹配百位數(shù)字為0至3,個(gè)位數(shù)字為0或5的三位數(shù)字,就能提取出管制指令中的航向信息。
本系統(tǒng)利用了Python 編程語(yǔ)言和正則表達(dá)式,制定了多條匹配規(guī)則,對(duì)管制指令中的各種關(guān)鍵信息進(jìn)行提取。針對(duì)管制指令用語(yǔ)不統(tǒng)一、不規(guī)范的難題,利用正則表達(dá)式靈活多變的優(yōu)點(diǎn),對(duì)各條匹配規(guī)則進(jìn)行優(yōu)化和細(xì)化,提高了識(shí)別各種關(guān)鍵信息的成功率。本系統(tǒng)可以將管制員發(fā)出的管制指令進(jìn)行記錄與實(shí)時(shí)反饋,通過(guò)本系統(tǒng),管制員可以更好地掌握已發(fā)出的指令,降低“錯(cuò)忘漏”的發(fā)生概率,能有效避免因管制指揮不當(dāng)引發(fā)的航空不安全事件的發(fā)生。