李燦
摘要:該文提出了一種不同于傳統(tǒng)的防止報(bào)文錯(cuò)誤的思路,使用以python語(yǔ)言與正則表達(dá)式模塊對(duì)報(bào)文進(jìn)行格式錯(cuò)誤與邏輯錯(cuò)誤檢測(cè):首先使用正則表達(dá)式對(duì)報(bào)文進(jìn)行分割、驗(yàn)證,接著運(yùn)用腳本語(yǔ)言動(dòng)態(tài)進(jìn)行邏輯判斷,識(shí)別報(bào)文是否正確。
關(guān)鍵詞:航空氣象;觀測(cè)報(bào)文; Python 正則表達(dá)式
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)25-0227-03
1 概述
航空安全關(guān)系著千家萬(wàn)戶,民航安全的基石依靠每一個(gè)民航人點(diǎn)滴微小工作。民航氣象觀測(cè)報(bào)文的用戶群巨大,有空中管制員、航空公司、普通旅客,所以國(guó)家對(duì)觀測(cè)報(bào)文的準(zhǔn)確率要求也越來(lái)越高。但與實(shí)際情況矛盾的是現(xiàn)在的報(bào)文編輯軟件少有錯(cuò)誤控制。由于現(xiàn)在的編報(bào)軟件本地化程度都不高,所以在編報(bào)過(guò)程進(jìn)行邏輯糾錯(cuò)在現(xiàn)階段很難實(shí)現(xiàn)。所以本文直接從報(bào)文入手,對(duì)已經(jīng)編輯成型的報(bào)文進(jìn)行邏輯與格式檢查。
2 Python與正則表達(dá)式
Python是一種簡(jiǎn)單易學(xué)功能強(qiáng)大的腳本語(yǔ)言。雖然是腳本語(yǔ)言,她有著強(qiáng)大豐富的庫(kù),能嵌入任何c\c++編寫的程序,也可以用c\c++編寫拓展模塊,而且與C#和JAVA一樣完全面向?qū)ο?,更重要的她天生就是處理字符串的好手,其在檢驗(yàn)報(bào)文邏輯時(shí)起了至關(guān)重要的作用。
正則表達(dá)式(Regular expression)是仿生學(xué)的產(chǎn)物,其源于神經(jīng)學(xué),然后經(jīng)過(guò)數(shù)學(xué)家與計(jì)算機(jī)學(xué)家的理論證明才產(chǎn)生正則表達(dá)式。它通過(guò)編寫“模式(Pattern)”——可以理解為一種文本模板、格式模板,來(lái)匹配及獲取目標(biāo)字符串中的對(duì)應(yīng)內(nèi)容?,F(xiàn)代的正則表達(dá)式主要是分為DFA(確定型有窮自動(dòng)機(jī))和NFA(非確定型有窮自動(dòng)機(jī))兩類引擎[1]。就其工作原理而言,它們是通過(guò)完全相反的方式來(lái)匹配字符串,DFA擁有效率高、速度快、結(jié)果一致,而NFA則擁有許多有意思而強(qiáng)大的特性,如回溯、反向應(yīng)用、環(huán)視等等。Python的正則表達(dá)式模塊是基于后者。因?yàn)镹FA引擎的原理和特性,Python及其正則表達(dá)式在大多數(shù)情況都是利用與字符串的處理,在數(shù)據(jù)挖掘以及人工智能都有著極其重要的地位。例如,胡軍偉等[2]運(yùn)用正則表達(dá)式對(duì) Web 信息抽取,婁寶翠等[3]正則表達(dá)式與文本處理技術(shù)應(yīng)用,唐勇等[4]運(yùn)用正則表達(dá)式對(duì)蠕蟲(chóng)特征進(jìn)行自動(dòng)提取。正則表達(dá)式的運(yùn)用可以說(shuō)是方方面面,但是在航空?qǐng)?bào)文檢測(cè)方面這是一片空白。
3 關(guān)于航空氣象報(bào)文錯(cuò)誤類型分析
航空氣象報(bào)文分為觀測(cè)報(bào)文和預(yù)報(bào)報(bào)文,我們?cè)谶@里進(jìn)行采用觀測(cè)報(bào)文進(jìn)行詳細(xì)闡述。要檢驗(yàn)報(bào)文的正誤性,就必須了解報(bào)文會(huì)有哪些錯(cuò)誤類型。報(bào)文的錯(cuò)誤類型主要分兩大類。第一類為格式錯(cuò)誤,主要包括有字面錯(cuò)誤、字符串順序錯(cuò)誤、字符多余或缺失錯(cuò)誤。這類型錯(cuò)誤,只需要判斷正則表達(dá)式能否匹配就能判斷出來(lái)。第二類為邏輯錯(cuò)誤,主要包括有數(shù)據(jù)增量錯(cuò)誤、數(shù)據(jù)溢出錯(cuò)誤、條件錯(cuò)誤。這類型錯(cuò)誤,一般涉及多個(gè)要素的組合判斷,在正則表達(dá)式匹配正確之后,還需要經(jīng)過(guò)多個(gè)條件分支進(jìn)行邏輯判斷,才能判斷出正誤。
4 航空氣象報(bào)文檢測(cè)
我們先從宏觀的角度來(lái)考慮如何解決這個(gè)問(wèn)題。我們需要這樣一個(gè)程序:輸入一條報(bào)文,經(jīng)過(guò)這個(gè)程序的檢測(cè),如果通過(guò)就輸出“0”,反之則輸出錯(cuò)誤代碼,通過(guò)錯(cuò)誤代碼我們即可以找到報(bào)文錯(cuò)誤位置。這個(gè)程序的主要過(guò)程如下:
首先是格式錯(cuò)誤的識(shí)別。這種錯(cuò)誤更傾向于使用模式來(lái)識(shí)別,因?yàn)槠溆行矢?、速度快、易修改、?jiǎn)單明了等特點(diǎn)。只要模式匹配到字符串,就說(shuō)明三類細(xì)分錯(cuò)誤的檢測(cè)都通過(guò),所以如何編寫模式就成了關(guān)鍵,這是整個(gè)檢驗(yàn)程序的基點(diǎn),也是難點(diǎn)。經(jīng)過(guò)反復(fù)測(cè)試我們總結(jié)出了以下報(bào)文匹配模式。
與格式錯(cuò)誤相對(duì)應(yīng)的是邏輯錯(cuò)誤。在進(jìn)行邏輯判斷之前,需要將各個(gè)部分分組進(jìn)而提取要素。根據(jù)國(guó)際民航公約附錄三規(guī)定(Annex 3to the Convention onInternational Civil Aviation)下稱“公約”,觀測(cè)報(bào)文包括報(bào)頭、機(jī)場(chǎng)代碼、時(shí)間、風(fēng)、能見(jiàn)度、跑道視程、天氣現(xiàn)象、云、溫度、濕度、氣壓、附加信息共計(jì)12個(gè)項(xiàng)目。在面對(duì)如此多項(xiàng)目的情況下,該如何正確的分組?我們?cè)谶@里考慮兩點(diǎn):1)分組匹配是否唯一;2)盡可能將相關(guān)的要素放在一個(gè)分組內(nèi)。要解決唯一性需要分組內(nèi)至少有一個(gè)有且只有一個(gè)的字符在分組內(nèi),即“關(guān)鍵詞符”。例如溫度露點(diǎn)組M?\d{2}/M?\d{2}\s+中反斜杠就是關(guān)鍵詞符。依照條件,我們做出了如表2的分組。
分組成功以后,需要對(duì)報(bào)文中的風(fēng)向、風(fēng)速、能見(jiàn)度等要素進(jìn)行提取。要素提取大體思路一致:利用正則表達(dá)式括號(hào)的其中一個(gè)性質(zhì)——數(shù)據(jù)捕獲。舉個(gè)例子,在第二組WIND中分組的匹配模式是(VRB|\d{3})P?\d{2}(GP?\d{2})?MPS\s+(\d{3}V\d{3}\s+)?,我們需要捕捉其中的風(fēng)向、風(fēng)速、大風(fēng)、風(fēng)向變化范圍。于是我們給這些要素加上括號(hào),已經(jīng)有的則不需要,變成了(VRB|\d{3})(P?\d{2})(?:G(P?\d{2}))?MPS\s+(?:(\d{3})V(\d{3})\s+)?。值得注意的,原模式本身就存在一些其他用途的括號(hào),而括號(hào)內(nèi)的數(shù)據(jù)可能并不是我們所需要的,我們就可以在左括號(hào)后加上“?:”,這樣就不會(huì)被捕捉到[5]。
邏輯錯(cuò)誤不同于格式錯(cuò)誤,因?yàn)檎齽t表達(dá)式不能進(jìn)行邏輯判斷,所以這就需要用到python語(yǔ)句來(lái)彌補(bǔ)。邏輯判斷分為數(shù)據(jù)增量錯(cuò)誤、數(shù)據(jù)溢出錯(cuò)誤和條件錯(cuò)誤:
1) 數(shù)據(jù)溢出錯(cuò)誤包括時(shí)間、風(fēng)向風(fēng)速、陣風(fēng)、云高、溫度露點(diǎn)和修正海壓。其中后三項(xiàng)是需要輸入本站要素合理范圍。其他三項(xiàng)只需要使用條件語(yǔ)句也可以輕松判斷,限于篇幅這里就不做詳述。
[2)]增量錯(cuò)誤主要是針對(duì)風(fēng)向、能見(jiàn)度和RVR的。報(bào)文中的風(fēng)向都是以10度為一個(gè)增量的,所以風(fēng)向的判斷比較簡(jiǎn)單。只需要要將風(fēng)向與10做取膜運(yùn)算,得數(shù)不為零則返回錯(cuò)誤。能見(jiàn)度與RVR的判斷就相對(duì)來(lái)說(shuō)比較復(fù)雜,其源于他們的增量是呈階梯式的,增量會(huì)隨著數(shù)值的增大而增大。在程序里用邏輯解決該階梯函數(shù)時(shí),與風(fēng)向類似,將數(shù)值與區(qū)間內(nèi)對(duì)應(yīng)增量取膜,結(jié)果不為零則返回錯(cuò)誤。endprint
3) 條件錯(cuò)誤的檢查是整個(gè)程序的重點(diǎn),不僅是因?yàn)檫@部分代碼占總行速的百分之七十以上,更重要的是要將這么多規(guī)則條理清晰的擺放在一起并不是一件簡(jiǎn)單的事情。理清思路,條件錯(cuò)誤的檢查其實(shí)就是將法律法規(guī)的文字轉(zhuǎn)換成另外一種程序文字表達(dá),讓計(jì)算機(jī)能自動(dòng)化檢測(cè)正誤。編報(bào)規(guī)程十分繁雜,限于篇幅,不可能面面俱到,所以以下我們?nèi)齻€(gè)較典型的部分進(jìn)行說(shuō)明。
現(xiàn)在天氣的檢查。這部分需要檢查的有三類天氣:與CB或TCU云組相關(guān)的天氣;與風(fēng)相關(guān)的天氣;與能見(jiàn)度相關(guān)的天氣。第一類有兩種天氣:含F(xiàn)Z和含TS的天氣。第二類只有颮線是需要檢測(cè)風(fēng)速的。這兩類都是先采用正則表達(dá)式將判斷其是否存在,若是,則繼續(xù)判斷相關(guān)的要素是否符合規(guī)則。第三類的天氣較前兩類都多,而且每一種天氣的能見(jiàn)度都不盡相同。這類判斷思路如下:首先用正則表達(dá)式匹配出N(≥0)種該類天氣,判斷報(bào)文中的能見(jiàn)度是否在該天氣現(xiàn)象對(duì)應(yīng)能見(jiàn)度區(qū)間內(nèi)?,F(xiàn)在天氣檢驗(yàn)還有一點(diǎn)容易讓人忽略的地方是,天氣現(xiàn)象的編報(bào)是有前后順序的。這也是需要用邏輯算法判斷的。
RVR變化范圍檢測(cè)。先來(lái)看一條公約中規(guī)則“某一分鐘的平均極值與10分鐘的平均值變化超過(guò)50或20%時(shí)(兩者取其大),則需要編輯RVR的變化范圍?!盵7]我們可以從這條RVR編報(bào)規(guī)則中得到檢測(cè)規(guī)則。由于我們?cè)趫?bào)文中只能得到RVR的極值,所以可以假設(shè)RVR的平均值與RVR極小值相等(記為RVRmin,這里我們也可以假設(shè)與極大值RVRmax相等),上面這條規(guī)則這可變?yōu)橐韵鹿剑?/p>
[RVRmax>RVRmin+50, RVRmin≤250RVRmax>(1+20%)*RVRmin, RVRmin≥250]
可以看出這是個(gè)分段函數(shù),只有當(dāng)兩個(gè)極值滿足于上面的公式時(shí),才能編RVR變化范圍(圖2灰色部分)。
云組的檢測(cè)。云組檢測(cè)主要是云量的檢測(cè)比較復(fù)雜。因?yàn)樵屏可婕耙豁?xiàng)所謂“135規(guī)定”:第一層云云量必須是大于一;第二層云云量必須是大于三;第三層云量必須是大于五[7]??此坪?jiǎn)單的規(guī)定,但因?yàn)橥咴婆cCB(TCU)的存在,使得編報(bào)起來(lái)就比較復(fù)雜了。解決方法可以通過(guò)以下判斷實(shí)現(xiàn):判斷當(dāng)前云塊是否符合“135規(guī)定”;判斷是否為CB(TCU);是否與前層云同高。如圖3所示。
5 函數(shù)實(shí)踐檢驗(yàn)
檢驗(yàn)數(shù)據(jù):2010年1月到2015年10月湛江觀測(cè)室發(fā)送電碼格式報(bào)文(包括SPECI與METAR報(bào)),一共是六萬(wàn)三千分報(bào)。為了達(dá)到測(cè)試的目的,我們將隨機(jī)挑選6個(gè)報(bào)文修改其中的要素,使其報(bào)文錯(cuò)誤,每份報(bào)文修改不同的要素。測(cè)試結(jié)果如表3:
結(jié)果分析: 6個(gè)修改報(bào)文全數(shù)找出;云錯(cuò)誤達(dá)到1500份之多,這是因?yàn)橐郧坝肧KC而現(xiàn)在不在使用;遍歷所有報(bào)文所需平均時(shí)間為5.23秒,平均到每一份報(bào)上,這個(gè)數(shù)字是微秒級(jí)別的。
6 改進(jìn)與總結(jié)
經(jīng)過(guò)上面的測(cè)試,我們對(duì)整個(gè)函數(shù)的查錯(cuò)效果還是十分滿意。Python與其正則表達(dá)式模塊無(wú)論是在代碼的健壯性、可修改性、還是工作效率上的表現(xiàn)都可圈可點(diǎn)。而函數(shù)的工作速度,差錯(cuò)率也是令人滿意的。但是這個(gè)函數(shù)在查找多份報(bào)文聯(lián)結(jié)錯(cuò)誤時(shí),卻不能有效的工作。所以在后續(xù)的工作中,我們會(huì)繼續(xù)完善有關(guān)特殊天氣報(bào)告方面的模塊,使其能判斷多份報(bào)文之間的關(guān)系,使之能更好地為空管氣象事業(yè)做出貢獻(xiàn)。
參考文獻(xiàn):
[1] (美)佛瑞德著.精通正則表達(dá)式第3版[M].北京:電子工業(yè)出版社,2012.
[2] 唐勇,諸葛建偉,陳曙暉,盧錫城. 蠕蟲(chóng)正則表達(dá)式特征自動(dòng)提取技術(shù)研究[J]. 通信學(xué)報(bào),2013(3):141-147.
[3] 婁寶翠. 正則表達(dá)式與文本處理技術(shù)應(yīng)用[J]. 河南師范大學(xué)學(xué)報(bào):哲學(xué)社會(huì)科學(xué)版,2012(3):240-242.
[4] 胡軍偉,秦奕青,張偉. 正則表達(dá)式在Web信息抽取中的應(yīng)用[J]. 北京信息科技大學(xué)學(xué)報(bào):自然科學(xué)版,2011(6):86-89.
[5] (美)馬特利,(美)阿舍爾,等.Python Cookbook 中文版[M].北京:人民郵電出版社,2010.
[6] MH/T 4016.6-2007民用航空氣象第六部分:電碼.
[7] AP-117-TM-02R1民用航空氣象地面觀測(cè)規(guī)范.endprint