![]()
全球機(jī)場的數(shù)據(jù)格式亂到什么程度?同一家航空公司的"已起飛",在西班牙是SAL,在德國是gestartet,在俄羅斯是Отправлен,在愛沙尼亞是V?ljunud。沒有統(tǒng)一標(biāo)準(zhǔn),沒有行業(yè)協(xié)議,連大小寫都不統(tǒng)一。
開發(fā)者Nico Prananta在搭建MyAirports API時(shí),被這個(gè)問題堵了三個(gè)月。他的目標(biāo)很簡單:讓用戶查詢?nèi)魏螜C(jī)場的航班,返回7個(gè)干凈狀態(tài)——scheduled、boarding、departed、arrived、delayed、cancelled、unknown。但輸入端是85個(gè)國家、40多種語言的原始網(wǎng)頁,每個(gè)機(jī)場都有自己的"方言"。
這不是翻譯問題,是標(biāo)準(zhǔn)化戰(zhàn)爭。
第一層:硬編碼的"字典暴力"
Nico的第一版方案很直接:窮舉。他把見過的所有狀態(tài)字符串塞進(jìn)一個(gè)對(duì)象,鍵是原始文本,值是標(biāo)準(zhǔn)化狀態(tài)。英文還算老實(shí),"departed"就是"departed",頂多混進(jìn)來幾個(gè)"in flight""airborne"。
西班牙AENA系統(tǒng)最先教他做人。這家管理全國機(jī)場的機(jī)構(gòu)用三字母代碼:SAL(salida/出發(fā))、AIR(en aire/空中)、FLY、CER(cerrado/關(guān)閉)全算"已起飛"。登機(jī)叫BOR、EMB、ULL、OPE四個(gè)變體。計(jì)劃中的航班分EST(estimado/預(yù)計(jì))和PRG(programado/計(jì)劃)。
俄語、愛沙尼亞語、芬蘭語各自來一套。西里爾字母、拉丁字母帶變音符號(hào),編碼問題差點(diǎn)讓數(shù)據(jù)庫吐出來。
這套精確匹配表覆蓋了60-70%的情況。剩下的30%,機(jī)場開始玩花樣。
第二層:模式匹配抓"動(dòng)態(tài)字符串"
有些機(jī)場把實(shí)時(shí)信息塞進(jìn)狀態(tài)字段。"Delayed 00:45"——延遲多久會(huì)變。"Gate 23 closing"——關(guān)艙門倒計(jì)時(shí)。"Check-in open"——值機(jī)開了,但還沒開始登機(jī)。
Nico加了第二層:子串正則。/delay/i 抓所有帶"delay"的變體,/^cerr/i 匹配西班牙語cerrado的各種變形,/check.?in/i 識(shí)別值機(jī)狀態(tài)并映射為"scheduled"而非"boarding"。
這里有個(gè)反直覺的細(xì)節(jié):"Check-in open"被歸為scheduled而不是boarding。因?yàn)橹禉C(jī)開放時(shí)旅客還在柜臺(tái)排隊(duì),真正登機(jī)是另一個(gè)狀態(tài)。很多前端開發(fā)者會(huì)搞混這個(gè),直接顯示"正在登機(jī)"嚇跑還沒過安檢的人。
鳳凰城天港機(jī)場(Phoenix Sky Harbor)更絕,把實(shí)際時(shí)間戳嵌進(jìn)狀態(tài)字符串。正則在這里變成必需品,精確匹配完全失效。
第三層:未知狀態(tài)的"兜底哲學(xué)"
即使兩層過濾后,仍有漏網(wǎng)之魚。新機(jī)場接入、舊機(jī)場改版、臨時(shí)促銷代碼、系統(tǒng)故障時(shí)的異常文本——unknown狀態(tài)的存在是為了不讓整個(gè)API崩潰。
Nico的設(shè)計(jì)選擇很產(chǎn)品經(jīng)理:寧可返回unknown,也不猜錯(cuò)。前端拿到unknown可以降級(jí)顯示原始文本,或者提示用戶刷新。但如果把"Final call"誤判為"departed",用戶會(huì)錯(cuò)過航班。
整個(gè)系統(tǒng)的架構(gòu)像漏斗:精確匹配→模式匹配→人工復(fù)核→unknown兜底。每層都有明確的失敗移交機(jī)制,沒有靜默錯(cuò)誤。
多語言API的隱藏成本
這個(gè)項(xiàng)目暴露了一個(gè)行業(yè)潛規(guī)則:全球化產(chǎn)品的"語言支持"往往止于界面翻譯。真正的多語言是數(shù)據(jù)層的地獄——同義詞、縮寫習(xí)慣、時(shí)區(qū)表達(dá)、文化差異(有些國家"遲到"和"延誤"是同一個(gè)詞)。
Nico在代碼注釋里埋了個(gè)彩蛋:西班牙語CER(cerrado/關(guān)閉)在某些機(jī)場指"登機(jī)口關(guān)閉=已起飛",在另一些機(jī)場指"值機(jī)柜臺(tái)關(guān)閉"。上下文決定語義,沒有全局真理。
這解釋了為什么航空數(shù)據(jù)API的定價(jià)模型通常是按機(jī)場收費(fèi),而非按查詢量。每新增一個(gè)機(jī)場,需要人工審計(jì)其狀態(tài)字符串、建立映射規(guī)則、持續(xù)監(jiān)控改版。自動(dòng)化只能解決70%,剩下的是苦力活。
MyAirports最終把85個(gè)國家的混亂壓縮成7個(gè)枚舉值。但Nico的GitHub倉庫里,那個(gè)300行的EXACT匹配表還在每月增長——上個(gè)月新增了波蘭機(jī)場用"Wyl?dowa?"表示到達(dá),上個(gè)月底某德國機(jī)場把"gestartet"改成了"Gestartet"(首字母大寫),精確匹配失效了四小時(shí)。
如果你在做跨境數(shù)據(jù)整合,有沒有遇到過類似的"同一概念、百種寫法"的坑?最后是用規(guī)則引擎硬啃,還是直接上機(jī)器學(xué)習(xí)做語義分類?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.