On Blahfe

imi-enrichment-addressは住所のバリデーションチェックでどの程度使えるか

blog/backendimi-enrichment-addressmlit-isj

コロナ禍であらゆる流通がオンラインに移行する中、正しい住所を使うことはいっそう求められています。ユーザーが配送用に住所を入力する時そのデータが正しいとどうやって判定するのでしょうか。今回はOSSライブラリimi-enrichment-addressが住所のバリデーションチェックでどの程度使えるか検証してみました。

thumbnail

PROBLEM

  • 住所の不備が至るところで起きている
    • 特に町名番地の抜けもれや不備が多くこの点をどうにか拾いたい
    • 可能ならユーザーの入力時点でFEあるいはBE側でバリデーションチェックしたい
      • まずはOSSのライブラリで検証したい

SOLUTION

というわけで、昨年(2020年)経産省IMI(情報共有基盤)から公開された住所変換コンポーネント「IMI-Tool-Project/imi-enrichment-address」がバリデーションチェックでどの程度使えるか検証します。

imi-enrichment-addressとは

経産省IMIツールプロジェクトで公開された住所変換コンポーネントです。CLIとサーバーが用意されていますが、今回はCLIを見ていきます。

ヘルプを見ると住所を引数として渡すことで処理されることが分かります。

sh
$ npm install -g https://info.gbiz.go.jp/tools/imi_tools/resource/imi-enrichment-address/imi-enrichment-address-2.0.0.tgz
$ imi-enrichment-address --help
imi-enrichment-address

  住所文字列をもとに住所型・場所型の情報を補完します

オプション

  -h, --help            このヘルプを表示します
  -f, --file file       変換対象とする JSON ファイル
  -s, --string string   変換対象とする住所文字列
  -i, --indent number   出力する JSON のインデント (default 2)

実行例

  ヘルプの表示    $ imi-enrichment-address -h
  文字列の処理    $ imi-enrichment-address -s 霞が関2
  ファイルの処理   $ imi-enrichment-address input.json
  標準入力の処理   $ cat input.json | imi-enrichment-address

実行すると正確な住所を渡したときと不正確な住所を渡したときで異なった結果を返すことが分かります。今回はこの正確・不正確の異なった結果を利用して検証していこうと思います。

sh
$ imi-enrichment-address -s 長野県長野市大字長野旭町1108
{
  "@context": "https://imi.go.jp/ns/core/context.jsonld",
  "@type": "場所型",
  "住所": {
    "@type": "住所型",
    "表記": "長野県長野市大字長野旭町1108",
    "都道府県": "長野県",
    "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C20000",
    "市区町村": "長野市",
    "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C20201",
    "町名": "大字長野"
  },
  "地理座標": {
    "@type": "座標型",
    "緯度": "36.674892",
    "経度": "138.178449"
  }
}

$ imi-enrichment-address -s 長野県長野市旭町1108
{
  "@context": "https://imi.go.jp/ns/core/context.jsonld",
  "@type": "場所型",
  "住所": {
    "@type": "住所型",
    "表記": "長野県長野市旭町1108",
    "都道府県": "長野県",
    "都道府県コード": "http://data.e-stat.go.jp/lod/sac/C20000",
    "市区町村": "長野市",
    "市区町村コード": "http://data.e-stat.go.jp/lod/sac/C20201"
  },
  "メタデータ": {
    "@type": "文書型",
    "説明": "該当する町名が見つかりません"
  }
}

なお、GitHubコードを見るとimi-enrichment-addressは街区レベル位置参照情報を利用して実装しています。このことを考えるとバリデーションチェックで積極的につかうのは難しく、ユースケースとしては下記2点に落ち着くと考えます。

  • ユーザーに住所の再確認を促す
  • 入力後の住所不備について人が目検で確認する前段階で利用

検証用データ

さて、検証に進みましょう。imi-enrichment-addressで検証するデータは簡易に使える住所.jp、その中の事業所住所22402件を使います。他にも検証データはありますが、コストもそれほどかけられないのでコマンドだけで完結するものを選んでいます。

sh
$ curl -sSL http://jusyo.jp/downloads/new/csv/csv_zenkoku.zip -o csv_zenkoku.zip
$ unzip csv_zenkoku.zip

$ go get github.com/mithrandie/csvq
$ csvq -f CSV "SELECT COUNT(*) FROM zenkoku WHERE 事業所住所 IS NOT NULL"
COUNT(*)
22402

imi-enrichment-addressで検証用データを確認する

今回実行したCLIはNodeJSであることと数時間で処理できるという点で逐次で済ませました。

sh
$ for i in $(
  csvq -f CSV "SELECT 都道府県,市区町村,事業所住所 FROM zenkoku WHERE 事業所住所 IS NOT NULL" \
  | sed 's/,//g' \
  | tail +2 \
); do
  imi-enrichment-address -s $i \
  | jq -r '
    [
      .["住所"]["表記"],
      (
        if .["地理座標"] != null then
          true
        else
          false
        end
      ),
      .["メタデータ"]["説明"]
    ]
    | @csv
  ' >>output.csv;
done &

バリデーションチェックの結果を確認する

imi-enrichment-addressの出力結果を確認したところ全国で9.25%が無効、下記の通り町名番地の表記揺れに弱いことが分かりました。特に町字(まちあざ)省略によるバリデーションエラーの比率が高く、青森、長野、沖縄等複数の県の住所が実用に耐えない結果となりました。

バリデーションエラーになった原因

  • 各地方の字・大字の省略
  • 京都の通り上る・下るの表記
  • 北海道の条、線の表記揺れ
  • 茨城、岐阜等の町名省略
  • 茨城、神奈川、岐阜、石川等の区画整理地
都道府県 無効割合(%) 備考
青森県 54.42 字省略により無効
長野県 44.28 字省略により無効
沖縄県 43.55 字省略により無効
大分県 38.96 字省略により無効
京都府 36.86 字省略、通りにより無効
佐賀県 33.33 字省略により無効
奈良県 29.94 字省略により無効
福島県 29.18 字省略により無効
宮崎県 27.71 字省略により無効
埼玉県 23.08 字省略により無効
山口県 22.65 字省略により無効
和歌山県 17.78 字省略により無効
群馬県 17.08 字省略、ノ町により無効
茨城県 15.51 字省略、町名省略、区画整理により無効
熊本県 14.89 字省略により無効
山形県 14.38 字省略により無効
北海道 13.76 字省略、条、線により無効
栃木県 13.6 字省略により無効
新潟県 13.19 字省略により無効
鳥取県 9.57 字省略により無効
全国 9.25
福岡県 9 字省略により無効
三重県 7.74 字省略により無効
愛知県 7.4 字省略により無効
鹿児島県 7.09 字省略により無効
山梨県 6.8 字省略により無効
宮城県 6.37 字省略により無効
岩手県 6.28 字省略により無効
岐阜県 5.67 字省略、町名省略、区画整理により無効
香川県 4.71 字省略により無効
石川県 4.7 字省略、区画整理により無効
愛媛県 4.39 字省略により無効
秋田県 4.17 字省略により無効
滋賀県 3.76 字省略により無効
広島県 3.74 字省略により無効
高知県 3.38 字省略により無効
大阪府 3.28 字省略により無効
兵庫県 2.71 字省略により無効
島根県 2.04 字省略により無効
岡山県 1.81 字省略により無効
神奈川県 1.72 字省略、区画整理により無効
徳島県 1.64 字省略により無効
富山県 1.14 字省略により無効
静岡県 1.06 字省略、町名省略、区画整理により無効
東京都 0.89 字省略により無効
福井県 0.71 字省略により無効
千葉県 0.64 字省略により無効
長崎県 0

WRAPUP

imi-enrichment-addressは町名番地の判定に素の街区レベル位置参照情報を使用しているため、町字(まちあざ)の省略に弱いことが分かりました。

  • ユーザーに住所の再確認を促す
  • 入力後の住所不備について人が目検で確認する前段階で利用

まず、想定したユースケースの内1つ「ユーザーに住所の再確認を促す」については、配送で使う住所の場合「町字の省略は影響ない」ので機能として適切ではありません。ユーザーが東京に集中している場合は関係ないですが、「町字が存在するさいたま市、川崎市、名古屋市、広島市、北九州市、福岡市、熊本市等の政令指定都市」や長野市のように住所が町字の組み合わせで2つ以上存在する都市の場合、使い勝手の悪い機能となります。

次に「入力後の住所不備について人が目検で確認する前段階で利用」については多少は有効に機能するでしょう。ただし、町字が多い地域では上記同様に使い勝手が悪くなります。

今回の検証の結果、現状の仕様ではimi-enrichment-addressを使うケースは限定せざるを得ず、一旦使用を見送りとします。とは言え、街区レベル位置参照情報にある町名番地から町字を除けば活用範囲が広がる可能性も確認できました。幸いなことにライブラリはMITライセンスで公開されています。

nabinno
Emacsianでアート好き、ランニング好きな@nabinnoが書いています
GitHub / X / LinkedIn / ネクイノ
blog/market

今後の成長分野:新たなテクノロジーの展望

テクノロジーの進化は、絶え間ない変化の中で私たちの日常を塗り替えてきました。時には経済的な危機が、新たな可能性を切り拓く契機となることもあります。そこで、過去のリセッション期に生まれたテクノロジーの足

market-trendrecession
blog/organization

ATKerneyの課題解決パターンの魅力的な探求

ATKerneyの課題解決パターン は、課題の本質を見極め、効果的な戦略的構造化を通じて解決策を導き出す手法にフォーカスしています。この冒険の旅は、解決者と協力者たちが心を一つにし、課題に立ち向かう様

problem-solvingatkerney
blog/market

就職氷河期とは何だったのか

私はいわゆる就職氷河期世代です。周囲から時折漏れ聞こえる不平のような言葉がありますが、それを単なる不平として片付けるのはもったいない気がします。できれば、その中に新しい視点を見つけ、次のチャンスへ繋げ

labor-economicsrecessionemployment-ice-age