国名の照合と別名の扱いは、突き合わせの精度だけを見ていると必ず行き詰まります。先に決めるべきなのは、何をもって同じ国とするかという基準のほうです。この記事では、基準の決め方から、揺れの吸収、別名の分離までの順序を整理します。
照合が単純な比較で済まないのはなぜか?
同じ国を指す文字列は、一つではありません。表記の揺れが複数の層で重なるためです。
- 文字の種類の違い。同じ音を別の文字で書く場合があります。
- 記号と空白の違い。中点、ハイフン、空白の有無が混ざります。
- 語順の違い。修飾する語が前後に動きます。
- 省略の違い。長い呼び名と短い呼び名が併存します。
- 言語の違い。同じ国を複数の言語で呼びます。
これらを比較のたびに個別に処理すると、処理の条件が画面ごと、取込ごとに散らばります。散らばった条件は、片方だけ直されて食い違います。ですから、照合の前に基準を決める必要があります。
正規の表現を決める順序
最初に決めるのは、保存する値の形です。内部で持つ値は符号とし、表示のための名称は別に持ちます。この分離があれば、呼び名が変わっても保存済みの値の意味は動きません。
次に、照合に使う正規の表現を決めます。正規の表現とは、揺れを吸収したあとに残る一つの形のことです。同じ国に複数の呼び名がある場合でも、照合にはこの一つの形だけを使います。
三つめに、表示に使う名称を決めます。表示は利用者の言語に合わせて変えられますが、照合の基準は言語によって変えません。ここを混ぜると、表示言語を変えただけで同じデータが別の国として扱われます。
決めた順序は、上から順に固定します。照合の基準を後から動かすと、過去に一致していた組が一致しなくなり、結果の比較ができません。基準を変える必要が出たときは、変えた日と理由を添えて版を分けます。
別名はどんな種類に分けられるのか?
別名は一つの塊ではありません。性質ごとに分けて持つと、扱いを決めやすくなります。
- 以前の名称。ある時点までの正式な呼び名で、過去の記録に残ります。
- 略した名称。日常的に使われる短い形です。
- 別の言語による名称。同じ国を別の言語で呼ぶ形です。
- 地域の中で使われる呼び名。外部の一覧には現れないことがあります。
- 入力の揺れ。上のどれでもなく、打ち間違いや表記の揺れによる形です。
前の四つは、意図して使われる呼び名です。五つめは、意図のない揺れです。この違いを無視して一つの一覧にまとめると、正しい呼び名まで誤りとして扱うか、誤りを正式な呼び名として受け入れるかのどちらかになります。
揺れの吸収はどこで行うべきか?
一箇所にまとめます。入力の受付、取込、検索の三つの入口で別々に吸収すると、同じ入力が入口によって違う結果になります。
吸収の処理は、決定的である必要があります。同じ入力からは常に同じ結果が出て、順序に依存しないようにします。吸収した結果だけでなく、何をどう吸収したかを記録に残すと、あとから照合の理由をたどれます。
吸収の範囲を広げすぎると、別の国同士が同じ形に落ちて衝突します。衝突が起きたときの扱いを先に決めておきます。自動では決めず、人が選ぶ対象として残すのが安全です。
照合の結果はどう記録するのか?
結果を三つ以上に分けます。一致した、一致しない、候補が複数ある、の三つです。二つに分けると、候補が複数ある場合が一致しない側に落ちて、本来は人が選ぶべき案件が自動で捨てられます。
一致とみなす強さも記録します。揺れを吸収したうえで一致したのか、別名の一覧をたどって一致したのかで、確からしさが違います。確からしさが低いものだけを人の確認に回す形にすると、確認の量を抑えられます。
記録は、照合のたびに残すのではなく、判断が分かれた場合と、あとから見直す可能性がある場合に絞ります。すべてを残すと量が膨らみ、肝心の判断が埋もれます。
確からしさの基準は、案件ごとに変えず、共通の一箇所で決めます。画面ごとに基準が違うと、同じ入力が入口によって別の国に当たります。
開発者向け: 正規の表現と表示名を別の項目にする
保存する符号、照合に使う正規の表現、表示に使う名称を、それぞれ別の項目として持ちます。三つを一つの文字列にまとめると、表示を変えたときに照合の結果が変わります。
次に、吸収の処理を純粋な関数として一箇所に置き、入口からはそれを呼ぶだけにします。入口ごとに条件を書くと、片方の修正が他方へ伝わりません。
三つめに、別名の一覧をデータとして持ち、処理の中に直接書かないようにします。一覧は更新され、時には取り消されます。取り消した別名を消すのではなく、いつからいつまで有効かを添えて残すと、過去の記録の照合を再現できます。
この記事で示した別名の一覧、綴りの揺れ、照合の結果は、いずれも扱いの順序を説明するために作り上げた合成の例です。実在する国名の一覧や、公開された呼称の対応表を引用したものではなく、特定の製品の挙動を示すものでもありません。検証の設計のためにだけ用いてください。
次のステップ
まず、いまの照合が保存する符号ではなく表示名の文字列で行われていないかを確かめてください。次に、揺れの吸収が入口ごとに書かれていないかを見ます。選択欄での検索の当たり方は国選択フィールドのテスト、国と言語を混ぜたときに起きる問題は国と言語は別物で扱っています。項目の一覧は国の一覧から確認できます。