選單

國家名稱比對與別名:先定規範名再談模糊比對

名稱比對之所以麻煩,是因為同一個地方有很多寫法,而每一種寫法的來源不同。本文說明規範名該怎麼定、大小寫與變音符號的處理順序、模糊比對在什麼情況下會幫倒忙,以及別名表為什麼要能審計。

發佈於

  • 名稱比對
  • 資料清理

國家名稱比對與別名是一個典型的「先有雞還是先有蛋」問題:想做好比對,得先知道正確的名稱是什麼;但要確認哪個名稱正確,又得先把各種寫法對起來。實務上的解法是先立一根標竿,再讓所有寫法往它對齊。以下說明這根標竿怎麼立,以及對齊過程中會遇到哪些坑。

為什麼同一個地方會有好幾種寫法?

因為寫法的來源本來就不同。官方名稱來自法規文件,常用名稱來自媒體與日常語言,代碼來自標準體系,而使用者輸入則來自他自己的記憶。這四種來源沒有誰對誰錯,它們只是服務不同目的。

於是同一個地方在資料裡可能同時存在下列幾種形態:

寫法類型 來源 是否適合當儲存鍵
官方全稱 法規或正式文件 不適合,變動與更替較頻繁
常用名稱 媒體與日常使用 不適合,隨語言而異
兩字母代碼 標準體系 適合作為主要鍵
使用者輸入 表單與匯入檔 不適合,需要先正規化
歷史舊稱 舊資料與舊文件 不適合,但必須能被查到

把這五類混在同一個欄位裡,是後續所有問題的根源。真正需要的是一個穩定的鍵,加上一組能對到這個鍵的別名。這個鍵不隨語言改變,也不因為名稱更替而改變。

因此第一步通常不是寫比對程式,而是先盤點現有的鍵是否真的唯一。如果同一個地方在資料裡對應到兩個鍵,那麼再精密的比對也只會把問題藏得更深,讓它更難在事後被發現。

先定規範名再談模糊比對

順序不能顛倒。如果還沒決定哪個名稱是規範名就開始做模糊比對,那麼比對的目標本身是浮動的,結果自然無法穩定。今天比對到的對象,明天可能因為多收錄了一個別名而改變。

實務上可以這樣安排:先從標準體系裡選一個穩定的鍵,再指定一個顯示用的規範名,最後才是收集別名。規範名可以只有一個,也可以依語言各有一個,但同一個語言內只能有一個,否則顯示時就會出現兩種寫法交替出現的狀況。

還有一個容易被忽略的決定:規範名是用於顯示,還是也用於儲存。如果兩者都用同一個字串,那麼未來規範名一改,所有引用它的地方都會改變,包括不該改變的歷史文件。因此建議顯示歸顯示、儲存歸儲存。

大小寫與變音符號的處理順序

處理順序會直接影響結果,因此必須固定下來。建議的順序是:先去空白、再統一大小寫、再做變音符號折疊、最後才比對。順序顛倒會產生不一致的結果,例如先折疊再處理大小寫,就會在某些語言裡把原本不同的字壓成同一個。

  • 去空白:處理前後空白與連續空白,避免只因排版差異而比對失敗。
  • 統一大小寫:只在需要不分大小寫的比對階段處理,不要改動原始值。
  • 變音符號折疊:讓帶記號與不帶記號的輸入都能命中同一筆。
  • 標點與連接詞:決定連字號與介系詞該保留還是忽略,並寫進規則。

要注意的是,折疊是為了比對,不是為了儲存。原始輸入應該被完整保留,否則使用者之後看到的名稱會與他輸入的不同,會讓人懷疑系統改了他的資料。名稱資料本身在各種語言裡的構造差異,可以對照各語系的名稱資料那篇。

模糊比對什麼時候會幫倒忙?

當兩個不同的地方名字很接近時。模糊比對的價值在於容忍輸入錯誤,但它的代價是也可能把兩個本來不同的對象拉在一起。一旦發生,錯誤會很安靜:資料照樣存進去,只是指向了另一個地方。

情境 適合的策略 原因
使用者輸入有明顯錯字 提供候選並請使用者確認 讓錯誤停在人看得見的地方
匯入檔名稱格式不統一 依規則正規化後精確比對 來源可預期,不需要猜
兩個地方名稱接近 不做自動合併 自動合併會產生難以察覺的錯誤
只比對到一個近似結果 仍要求確認或標記待審 相似不等於相同

因此建議的原則是:自動化只處理可預期的差異,例如大小寫、空白與變音符號;不可預期的差異一律轉為候選或待審,而不是直接決定。這樣做短期看起來比較費工,但它把不確定性留在能被發現的位置。

還有一個實務上的折衷:對於高風險的合併,寧可要求人工確認一次,也不要為了自動化而承擔無聲的錯誤。人工確認的成本是可見的、可估算的,而錯誤合併的成本往往要等到很久以後才會顯現。

顯示名與儲存鍵要分開

這是整篇最實用的一條。儲存鍵負責識別,顯示名負責溝通,兩者的變動頻率與影響範圍都不同,混用會讓每一次改名都變成一次資料搬遷。

  • 儲存時只寫鍵,不寫顯示名。
  • 顯示時由鍵加上當前語言即時產生名稱。
  • 別名表只用於輸入階段的比對,不用於輸出。
  • 匯出與報表如果需要當時的名稱,就在匯出當下複製一份。

這樣的分工還有一個好處:當某個名稱被更正時,你只需要更新顯示層與別名表,既有的資料完全不必更動。反之,如果名稱被寫進了業務資料,那麼更正一次就要掃描並改寫大量紀錄,而每一次改寫都是風險。

給開發者:別名表要能審計

別名表是會持續成長的資產,因此它需要能回答「這筆別名是誰在什麼時候基於什麼加進來的」。

  • 每一筆別名都記錄來源與加入日期,以及它對應的鍵。
  • 別名不刪除,失效的標記有效期間,避免舊資料突然對不上。
  • 定期找出從未被命中的別名,確認它是否只是拼錯。
  • 對名稱接近的鍵建立人工複核清單,而不是依賴自動合併。
  • 讓比對失敗的輸入被記錄下來,成為下一輪別名的來源。

本文出現的名稱寫法、別名組合與拼寫變體都是為了示範比對流程而編造的合成例子,不指涉任何真實地區的正式名稱或官方譯名,也不代表任何真實資料庫的收錄結果。要接著看規模擴大之後這些例外怎麼被管理,可以讀跨國家擴充測試資料;而名稱比對所服務的那個選擇控件本身,見國家選擇欄位測試。

下一步

先在你的資料裡挑一個名稱最混亂的地方,把它所有的寫法列出來,然後指定其中一個鍵作為標竿。做完這一步,其餘的別名才有地方可以依附。需要對照現行列與欄位樣貌時,可以到國家與地區目錄查看。

繼續閱讀

各國地址與身分資料格式相關文章